- เพื่อแก้ปัญหา การสูญเสียคอนเท็กซ์ข้ามเซสชัน ของ Claude Code จึงสร้างระบบหน่วยความจำโดยผสานเอนจินค้นหาแบบโลคัล QMD กับสกิล /recall
- QMD เป็น เอนจินค้นหาแบบโลคัล ที่ทำดัชนี Obsidian vault และรองรับการค้นหา 3 โหมด: BM25, semantic และ hybrid
- สกิล /recall รองรับ 3 โหมด: ตามเวลา, ตามหัวข้อ, และการแสดงผลแบบกราฟ เพื่อ กู้คืนคอนเท็กซ์เต็มของเซสชันเก่าได้ทันที
- มีการสร้าง ไปป์ไลน์อัตโนมัติ ที่พาร์สและทำ embedding บันทึกบทสนทนา JSONL จาก 700 เซสชัน แล้วสะท้อนเข้าไปในดัชนี QMD
- นำเสนอ เวิร์กโฟลว์ที่ยึดคอนเท็กซ์เป็นศูนย์กลาง ซึ่งสามารถใช้กับ AI agent ใดก็ได้ ตราบใดที่ยังรักษาคอนเท็กซ์ไว้ได้ แม้เครื่องมือจะเปลี่ยนไป
ปัญหา: Claude Code ถูกรีเซ็ตทุกเซสชัน
- ทุกบทสนทนาใน Claude Code เริ่มจากสถานะศูนย์ และเมื่อใช้งานไป 700 เซสชันในช่วง 3 สัปดาห์ ก็เริ่มติดตามการตัดสินใจก่อนหน้าและคอนเท็กซ์ของโปรเจ็กต์ได้ยาก
- เมื่อถึงขีดจำกัดคอนเท็กซ์ 60% ระหว่างเซสชัน จะต้องทำ compact หรือ hand off และในกระบวนการนี้ การตัดสินใจที่สำคัญครึ่งหนึ่งจะหายไป
- เมื่อจะกลับมาทำงานต่อในวันถัดไป ก็เกิดความไม่สะดวกแบบเดิมซ้ำๆ คือ จำไม่ได้ว่าเคยทำอะไรไว้บ้าง
- วิธีเดิมอย่าง การค้นหาด้วย grep บนไฟล์นั้นขยายต่อไม่ได้
QMD: เอนจินค้นหาแบบโลคัลสำหรับ vault โดยเฉพาะ
- QMD คือเอนจินค้นหาแบบโลคัลที่สร้างโดย Tobias Lutke CEO ของ Shopify โดยทำดัชนี Obsidian vault และคืนผลการค้นหาได้ภายในไม่ถึง 1 วินาที
- สามารถแมป collection ของ QMD ตามโฟลเดอร์ใน vault ได้ เช่น โน้ต, บันทึกรายวัน, เซสชัน, transcript ฯลฯ เพื่อค้นหาแบบเจาะจง
- ทำงานได้ด้วยคำสั่งเดี่ยว เช่น
qmd collection list, qmd search "video workflow" -c notes -n 3
- การค้นหาเริ่มต้นของ Claude Code ใช้วิธี brute force ที่ sub-agent ชื่อ Haiku ใช้ grep กับทุกไฟล์ ซึ่งจากการทดสอบใช้เวลา 3 นาทีและคืนไฟล์ 300 รายการ โดยคุณภาพผลลัพธ์ก็ต่ำ
- การค้นหาด้วย QMD เร็วทันที แม่นยำกว่า และใช้โทเคนน้อยกว่า — ไม่ต้องมี sub-agent
Grep vs BM25 vs การค้นหาแบบ semantic
- BM25 (
qmd search): การค้นหา full-text แบบกำหนดผลได้แน่นอน โดยจับคู่คีย์เวิร์ดคล้าย grep แต่ให้คะแนนแต่ละไฟล์
— อิงจากความถี่ของคำและความหายากเมื่อเทียบกับทั้งชุดเอกสาร ใช้เพียงการคำนวณทางคณิตศาสตร์ ไม่ต้องใช้ AI หรือ embedding
- โน้ตสั้นที่พูดถึงคำว่า "sleep" 5 ครั้ง จะได้คะแนนสูงกว่าไฟล์ 10,000 คำที่พูดถึงเพียง 1 ครั้ง
- semantic (
qmd vsearch): ใช้ embedding เป็นฐาน จึงค้นหา ตามความหมาย ได้แม้ไม่มีคำนั้นตรงๆ
- hybrid (
qmd query): ผสาน BM25 กับ semantic
- การเทียบ benchmark ของการค้นหาคำว่า "sleep":
- grep: คืน 200 ไฟล์ พร้อม noise จำนวนมาก รวมถึงคำสั่งโปรแกรมมิง
sleep()
- BM25: ภายใน 2 วินาทีสามารถคืนผลลัพธ์ที่เกี่ยวข้อง เช่น การทดลองคุณภาพการนอน, บันทึกการนอนสะดุด
- แต่
qmd search "insomnia" จะไม่คืนผล เพราะไม่มีคำนั้นอยู่ใน vault
- semantic: เมื่อค้นหา "couldn't sleep, bad night" สามารถเจอได้แม้แต่ เป้าหมายเรื่องนิสัยก่อนนอนที่ตั้งไว้เมื่อหลายปีก่อน — จาก 5 ผลลัพธ์ มี 4 รายการที่ไม่包含คำค้นโดยตรง
- hybrid: ให้ ลำดับผลลัพธ์ที่ดีที่สุด เช่น sleep quality improvement 89%, sleep interrupted at 3am 51%, health sleep optimization 42%
- รูปแบบการใช้งานที่แนะนำ: 80% ของการค้นหาใช้ BM25 (เหมาะกับโน้ตที่มีโครงสร้าง) และเพิ่ม semantic search สำหรับ transcript และบันทึกที่ไม่มีโครงสร้าง
กรณีค้นพบจริงจาก semantic search
- สำหรับ คำถามแบบไม่มีโครงสร้าง อย่าง "find the days when I was happy and what was the reason" Claude จะผสานการค้นหาหลายแบบโดยอัตโนมัติ:
- รันหลายคำค้น เช่น
qmd vsearch "happy, grateful, excited", "energy, great day, feeling good", "satisfaction, accomplishment"
- พบ ความเชื่อมโยงเชิงความหมาย จากโน้ตรายวันหลายเดือน — ได้แพตเทิร์นว่า "วันที่มีความสุขที่สุดคือวันที่ได้ปล่อยบางอย่างออกไป และฟื้นตัวได้ดีจากการไปซาวน่าหรือการนอน 9 ชั่วโมง"
สกิล /recall: โหลดคอนเท็กซ์ก่อนเริ่มงาน
- /recall คือ สกิลของ Claude Code ที่ทำงานบน QMD และ โหลดคอนเท็กซ์โดยอัตโนมัติก่อนเริ่มงาน
- รองรับ 3 โหมด:
- temporal: สแกนประวัติเซสชันตามวันที่ (
/recall yesterday, /recall last week)
- topic: ค้นหา BM25 กับ collection ของ QMD (
/recall topic graph)
- graph: การแสดงผลเชิงโต้ตอบ ของเซสชันและไฟล์ (
/recall graph last week)
- ผลการทดสอบ
/recall yesterday: สามารถ สร้างไทม์ไลน์ของ 39 เซสชันในหนึ่งวันขึ้นมาใหม่ — แสดงเวลา จำนวนข้อความ และเนื้องานของแต่ละเซสชัน
- ผลลัพธ์ของ
/recall topic "QMD video": คืน ไฟล์ที่เกี่ยวข้อง ทั้งจากเซสชันและโน้ต เช่น dashboard, แผน production, todo list ภายในไม่ถึง 1 นาที — เหนือกว่าวิธี brute force grep ทั้งเวลา โทเคน และคุณภาพผลลัพธ์
- โหมด graph จะ แสดงเซสชันเป็นก้อนสี โดยเซสชันเก่าจะจางลง ส่วนเซสชันล่าสุดจะถูกไฮไลต์เป็นสีม่วง — ไฟล์ถูกจัดเป็นคลัสเตอร์ตามประเภท เช่น goals, research, voice, docs, content, skills
- ตัวอย่าง: พบเซสชันที่เคยใช้หาสถานที่กินข้าวกลางวันจากกราฟหนึ่งสัปดาห์ให้หลัง แล้วคัดลอก path ของไฟล์นั้นเข้า Claude Code เพื่อ ทำงานต่อจากบทสนทนาก่อนหน้า ได้
การทำดัชนีอัตโนมัติของ 700 เซสชัน
- Claude Code บันทึกทุกบทสนทนาเป็น ไฟล์ JSONL ในเครื่อง — สะสมได้ 700 เซสชันใน 3 สัปดาห์
- ไฟล์ต้นฉบับมีทั้ง tool uses, system prompt, role ฯลฯ จึงต้องพาร์สและแปลงเป็น Markdown ที่สะอาด (เฉพาะข้อความผู้ใช้จริงและสัญญาณสำคัญ) ก่อนนำไปทำ embedding ในดัชนี QMD
- เมื่อปิดเทอร์มินัลจะมี hook อัตโนมัติทำงาน เพื่อ export และ embed เซสชันเข้าสู่ QMD — ทำให้ดัชนีอัปเดตล่าสุดเสมอโดยไม่ต้องทำอะไรด้วยมือ
ค้นพบไอเดียที่ไม่เคยลงมือทำ
- เมื่อค้นหาด้วย "find the ideas that I have never acted on" Claude ได้สรุปจากผลลัพธ์ใน QMD ว่า:
- 19 ตุลาคม — เคยมีแผนสร้าง PhD writing dashboard แต่ไม่ได้ลงมือทำ
- เคยมีไอเดียทำ แอปที่อิงงาน illustration แต่ไม่มีการต่อยอด
- เคยมีไอเดีย อัดหน้าจอเวิร์กโฟลว์ Obsidian แต่ไม่ได้ทำต่อ
- สิ่งที่เขียนไว้เมื่อหลายเดือนก่อนและลืมไปแล้วถูกค้นพบอีกครั้ง
- embedding ทั้งหมดถูก เก็บไว้ในเครื่อง
เวิร์กโฟลว์ที่ยึดคอนเท็กซ์เป็นศูนย์กลาง
- โน้ตไม่ได้ถูกขังอยู่แค่ใน Obsidian อีกต่อไป แต่เปลี่ยนเป็น คอนเท็กซ์ที่มีประโยชน์และใช้เพื่อไปถึงเป้าหมายจริงได้
- เครื่องมืออาจเปลี่ยนไปได้ (โมเดลใหม่, agent ใหม่) แต่ ถ้ายังคงคอนเท็กซ์ไว้ได้ ก็สามารถทำงานได้กับทั้ง Claude Code, Codex, Gemini CLI และอื่นๆ
- ชั้นหน่วยความจำทำงานได้ทั้งสแตกในรูปแบบของ สกิล
- โครงสร้างที่ใช้งานจริง: ใช้ Obsidian Sync ซิงก์ vault ระหว่าง Mac กับ Mac Mini ที่เปิดตลอดเวลา และให้ OpenClaw รัน 24/7 บน Mac Mini — เมื่อเชื่อมต่อ OpenClaw จากโทรศัพท์ ก็จะใช้ vault เดียวกัน ดัชนี QMD เดียวกัน และสกิลเดียวกันได้จากทุกที่
- โครงสร้างสแตกทั้งหมด:
- ด้านล่าง: Obsidian Vault
- ตรงกลาง: QMD Search
- ด้านบน: Claude Code / OpenClaw
- เป็นโครงสร้างที่คอนเท็กซ์ไหลจากล่างขึ้นบน
11 ความคิดเห็น
ช่วงนี้ทำไมมีแต่ของตายเยอะแบบนี้นะ
ฮ่าๆๆๆๆ
grepตายแล้ว มาใช้ripgrepกันเถอะพอลองให้ AI ไปหาข้อมูลเพราะคิดว่าจะลองใช้ qmd ดู ปรากฏว่าฝั่ง embedding โอเคอยู่ แต่ฝั่ง BM25 กับการขยายคิวรีรองรับภาษาเกาหลีได้ไม่ดี เลยไม่แนะนำ...
เกือบทั้งหมดก็เป็นแบบนั้นใน BM25 เช่นกัน
ดังนั้นจึงควรใช้ตัววิเคราะห์หน่วยคำร่วมด้วย
https://github.com/bab2min/Kiwi
ลองเช็กข้อเท็จจริงดูแล้ว เหมือนจะยังไม่มีหลักฐานที่ชัดเจนครับ ไม่ทราบว่าท่านอื่นมีประสบการณ์แบบนี้บ้างไหม?
เนื่องจาก BM25 เป็นการค้นหาที่เน้นคำเป็นหลัก ความเห็นของคุณ galadbran ก็ดูสมเหตุสมผลครับ
ถ้ามองในเชิงคลาสสิกมากขึ้น ก็เหมือนว่าเทคนิคการค้นคืนข้อมูลแบบดั้งเดิมกำลังถูกนำกลับมาใช้ซ้ำในระดับที่เฉพาะจุดมากขึ้น
~~ ตายไปแล้ว 💀💀💀
ก็แค่ RAG นี่นา;
หน้า Install ขออีเมล เลยนึกว่าเป็น Private Repo แต่จริง ๆ เป็น Public Repo ครับ
เข้าได้จากลิงก์ด้านล่างครับ
https://github.com/ArtemXTech/personal-os-skills/…