1 คะแนน โดย shakystar 4 시간 전 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

มันเริ่มจากปัญหาที่ผมเจอทุกวันตอนพัฒนางานคนเดียว ผู้ให้บริการต่างออกโมเดลที่ดีกว่าเดิมแทบทุกวัน และทุกครั้งที่ย้ายไปใช้โมเดลนั้นเพื่อทำงานต่อ (เช่น จาก Opus 4.7 ไป GPT 5.5) working memory ของโปรเจกต์ก็ไม่ได้ย้ายตามไปด้วย ขณะที่แต่ละ agent สะสม memory silo ของตัวเอง ผมต้องคอยกู้ context ที่ขาดหายกลับมาด้วยมือทุกครั้ง ฟีเจอร์ memory ระยะแรกของ agents ยังอ่อนมาก พอจบเซสชัน context ก็ตาย แถมยังถูกขังอยู่ในเครื่องเดียว งานที่ทำบนเดสก์ท็อปก็เอาไปต่อบนโน้ตบุ๊กไม่ได้

โปรเจกต์ควรมีความทรงจำของโปรเจกต์เอง เลยทำสิ่งนี้ขึ้นมา: โอเพนซอร์สแบบ local-first ที่ทำให้ตัวโปรเจกต์มีความทรงจำได้

ส่วนที่มั่นใจทางเทคนิค

  • memory สองชั้นที่ยืมแนวคิดมาจาก complementary learning systems (CLS) ของสมอง — ระหว่างทำงานจะจับเฉพาะ observation แบบต้นทุนต่ำโดยไม่ใช้ LLM (hippocampus) แล้วค่อยรวมเข้าด้วยกันเบื้องหลังตอนข้ามขอบเขตเซสชัน (neocortex) การลืมไม่ได้เกิดจากการลบ แต่เกิดจากการแข่งขันของคะแนนตอนเรียกคืนเท่านั้น (ความสำคัญ × ค่าความใหม่แบบ half-life 14 วัน × ความเกี่ยวข้องกับงาน) และไม่มีความทรงจำใดถูกลบ

  • ไม่ต้องใช้ API key — ไม่ต้องมี LLM แยกสำหรับงานรวมข้อมูล แค่เรียกใช้ claude -p / codex exec ที่ล็อกอินอยู่แล้วได้เลย agent ใช้ตัวเองมาจัดระเบียบความทรงจำของตัวเอง และวงจร recursion ไม่รู้จบที่เกิดขึ้นได้ (รวมข้อมูล→ฮุกทำงาน→รวมข้อมูล→…) ก็ถูกตัดด้วย environment variable guard

  • การรวมข้อมูลแบบไม่ทำข้อมูลหาย — watermark จะขยับไปข้างหน้าก็ต่อเมื่อ event ถูก persist แล้วเท่านั้น ดังนั้นถ้า LLM timeout หรือ parse ล้มเหลว ขอบเขตถัดไปจะลองช่วงเดิมซ้ำอีกครั้ง แม้ watermark เองหายไป การ dedup ตามแหล่งที่มาก็ยังกันการรวมข้อมูลซ้ำได้

  • การคอนเวอร์จข้ามเครื่องโดยไม่ต้องมีเซิร์ฟเวอร์ — แค่ซิงก์ append-only event log ทุกเครื่องก็จะคอนเวอร์จไปสู่สถานะเดียวกันด้วยกฎเชิงกำหนดจากเนื้อหาเพียงอย่างเดียว โดยไม่ต้องพึ่งการซิงก์นาฬิกา ต่อให้สองเครื่องรวมข้อมูลช่วงเดียวกันพร้อมกัน ทุก replica ก็จะเลือกผู้ชนะคนเดียวกัน

  • ไม่เชื่อ embeddings ในการตรวจจับความขัดแย้ง — cosine similarity มองไม่เห็นประโยคปฏิเสธ ("ให้ merge" กับ "อย่า merge" แทบเป็นเวกเตอร์เดียวกัน) ดังนั้น similarity ใช้แค่ตอนดึง candidate ส่วนการตัดสินให้ LLM ทำ ความทรงจำที่แพ้ไม่ได้ถูกลบ แต่แค่ปิดช่วงเวลาที่มีผล ทำให้กู้คืนได้ว่า "ตอนนั้นมันจริง"

  • แชร์กันแบบเรียลไทม์ระหว่างเซสชันขนาน — เซสชันที่รันอยู่ในโปรเจกต์เดียวกันจะมองเห็นงานของกันและกัน และถ้าแตะไฟล์เดียวกันก็จะมีคำเตือนเรื่องความขัดแย้ง

  • พัฒนาสคีมาจากข้อมูลวัดจริง ไม่ใช่จากทฤษฎี — การจะเปลี่ยน taxonomy ของความทรงจำหรือไม่ จะตัดสินจากข้อมูลที่เก็บหลายสัปดาห์ผ่านฟิลด์อายุการใช้งานแบบ observation-only ที่ติดมากับแต่ละ memory และ behavioral telemetry (ถูก inject เมื่อไร, ถูกทำให้ใช้ไม่ได้เมื่อไร) การถกเถียงทั้งหมดนี้เปิดไว้สาธารณะใน Discussions ของ repo

ทำไมถึงปล่อยตอนนี้

พูดตรง ๆ คือผมอยากปล่อยตอนที่มันสุกงอมกว่านี้ แต่พอเห็น OpenAI ออกฟีเจอร์ memory อย่าง dreaming ก็ทำให้เปลี่ยนความคิด — การที่ผู้ให้บริการรายใหญ่เริ่มขุดปัญหาเดียวกัน แปลว่าทิศทางนี้น่าจะถูกต้อง และผมคิดว่าควรมีทางเลือกแบบ vendor-neutral อยู่ก่อนที่ความทรงจำที่ถูกขังอยู่ในแต่ละผู้ให้บริการจะกลายเป็นมาตรฐาน เลยตัดสินใจปล่อยตอนนี้

อยากไปให้ถึงไหน

เมื่อโมเดลระดับ Fable 5 ออกมา agents ก็ไปถึงจุดที่ร่วมมือกันได้แล้ว แต่ยังไม่มีโครงสร้างพื้นฐานกลางสำหรับการร่วมมือนั้น ในระยะยาว ผมอยากสร้างแพลตฟอร์มสาธารณประโยชน์ที่ทำให้กับความทรงจำและการทำงานร่วมกันของ agents แบบเดียวกับที่ Git เคยทำให้กับโค้ด ผมไม่มีเงินพอจะเริ่มจากเซิร์ฟเวอร์ได้ และข้อจำกัดนั้นกลับผลักให้เกิดสถาปัตยกรรม local-first ที่คอนเวอร์จได้โดยไม่ต้องมีเซิร์ฟเวอร์ ตอนนี้ชิ้นแรกของมันคือ "การแชร์ความทรงจำของโปรเจกต์ในเครื่องโลคัล" ที่ใช้งานได้สมบูรณ์แล้ว จริง ๆ แล้วทั้งการถกเรื่องการออกแบบ การลงมือทำ และการ deploy ตอนเช้ามืดวันนี้ของโปรเจกต์นี้ ก็ทำร่วมกับ agents ไปมากพอสมควร — ตรงตามรูปแบบการร่วมมือที่เครื่องมือนี้อยากทำให้เกิดขึ้นเลย

สิ่งที่อยากได้ความช่วยเหลือแบบเจาะจง

  1. ลองใช้แล้วช่วยแจ้งจุดที่พัง — ติดตั้งหนึ่งบรรทัดแล้วเปิด issue ได้เลย จากการตรวจสอบก่อนปล่อยวันนี้อย่างเดียวก็เจอบั๊กในสคริปต์ติดตั้ง 2 จุดแล้ว (เครื่องหมายคำพูดของ PowerShell 5.1, Linux EACCES) ซึ่งแน่นอนว่าน่าจะยังมีอีก
  2. adapter สำหรับ agents ตัวอื่น — ใครที่รู้โครงสร้าง hook ของ Cursor, Gemini CLI, Windsurf
  3. เข้าร่วมถกเรื่อง taxonomy ของความทรงจำ — มี Discussions เปิดไว้สำหรับคำถามว่า "ความทรงจำมีประเภทอะไรบ้าง" และจะตัดสินด้วยข้อมูล

ติดตั้งได้ในบรรทัดเดียว (Windows ดูคำสั่ง PowerShell ใน README):

curl -fsSL https://raw.githubusercontent.com/shakystar/memorize/… | sh

หรือใส่หนึ่งบรรทัดในเซสชัน Claude/Codex: "Set up memorize in this project. Follow
https://github.com/shakystar/memorize/…;

repo: https://github.com/shakystar/memorize · README ภาษาเกาหลี
(https://github.com/shakystar/memorize/blob/main/docs/i18n/README.ko.md) · เอกสารสถาปัตยกรรม
(https://github.com/shakystar/memorize/blob/main/docs/ARCHITECTURE.md)

AGPL, เก็บทุกอย่างไว้ในเครื่อง, ไม่มี telemetry ยินดีรับทุกความคิดเห็น

1 ความคิดเห็น

 
shakystar 4 시간 전

ผมเป็นคนทำเองครับ

หนึ่งวันก่อนปล่อยโปรเจกต์นี้ออกมา เป็นวันซึ่งสะท้อนรูปแบบการทำงานร่วมกันที่เครื่องมือนี้มุ่งหวังไว้แบบตรงตัวที่สุด ผมถกเรื่องการออกแบบกับเอเจนต์ในประเด็นว่า "การจัดหมวดความทรงจำด้วยแท็กเหมาะไหม ทั้งที่สมองก็ไม่มีแท็ก" จากนั้นข้อสรุปก็ถูกบันทึกไว้ถาวรใน GitHub Discussions และ issue, PR สำหรับ implementation ก็ถูก merge, แล้วเรายังยืนยันการ dogfooding ที่เอเจนต์ใช้ตัวมันเอง (claude -p) เป็น extractor เพื่อรวมบันทึกการทำงานจริงเข้าเป็น long-term memory ก่อนกดปุ่ม deploy ด้วย การถกเถียงเรื่องการออกแบบทั้งหมดในกระบวนการนั้นเปิดเผยอยู่ใน Discussions ของ repository ครับ

อีกเรื่องที่ไม่ได้เขียนไว้ในบทความ แต่คิดว่าน่าจะมีคนถามบ่อยคือ "มันจะช้าลงหรือมีค่าใช้จ่ายเพิ่มไหม" ขอตอบไว้ล่วงหน้าว่า ระหว่างทำงาน LLM จะไม่เข้ามาช่วยเลย การ capture เป็น rule filter จึงแทบไม่มี latency ให้รู้สึกได้เลย และช่วงเดียวที่ LLM ทำงานคือการรวมข้อมูลตอนรอยต่อของ session ซึ่งก็เป็น background process ที่แยกออกไป จึงไม่บล็อกเอเจนต์แม้แต่วินาทีเดียว แม้แต่ call นั้นก็ยังใช้ผ่านการสมัครสมาชิก claude/codex ที่คุณใช้อยู่แล้ว จึงไม่มีการคิดค่า API เพิ่ม จากการ dogfooding วันนี้ observation 44 รายการในหนึ่ง session ถูกรวมด้วย background call 1 ครั้ง (ประมาณ 30 วินาที) และการ inject ตอนเริ่ม session ก็เป็นเพียงข้อความภายในงบ 4,000 ตัวอักษร จึงแทบไม่มีภาระด้าน token เป้าหมายคือให้ติดตั้งแล้วลืมมันไปได้เลย

ขอแชร์สิ่งหนึ่งที่เจอจากการตรวจสอบบนเครื่องจริงก่อนเปิดตัว README ระบุคำสั่งตรวจสอบไว้เป็น npx memorize แต่แพ็กเกจ memorize แบบไม่มี scope บน npm กลับเป็นของคนอื่น จุดแบบนี้ที่ "มองเห็นได้เฉพาะบนเครื่องจริง" น่าจะยังมีอีก ดังนั้นการแจ้งปัญหาจึงมีค่ามากจริงๆ ครับ

ขอความช่วยเหลือ: ผมทดสอบบนเครื่องจริงกับ Windows และ WSL/Linux แล้ว แต่ไม่มีเครื่อง macOS จริง แม้ชุดทดสอบ macOS ใน CI จะผ่านทั้งหมด แต่ยังไม่ได้ลอง full cycle ตั้งแต่ติดตั้งบรรทัดเดียว → hook → การ inject ตอนเริ่ม session บนเครื่องจริงเลย ถ้าใครใช้ macOS ช่วยลองติดตั้งสักครั้ง แล้วบอกหน่อยว่าใช้ได้หรือพัง ผ่านคอมเมนต์หรือ issue ก็จะช่วยได้มากครับ

ยินดีรับคำถามด้านการออกแบบด้วย (เช่น ทำไมไม่ใช้ embedding ในการตัดสิน ทำไมไม่มีการลบ และการทำให้ข้อมูลจากหลายเครื่อง converge กันโดยไม่มีนาฬิกาทำอย่างไร) — ผมจะตอบทั้งหมดครับ