Memora: ระบบหน่วยความจำแบบขยายได้สำหรับงานระยะยาว
(github.com/microsoft)สรุปภาพรวม
-
วัตถุประสงค์
- เฟรมเวิร์กหน่วยความจำที่ช่วยให้ AI agent สกัดข้อมูลที่จำเป็นจากบทสนทนาและเอกสารโดยอัตโนมัติ พร้อมจัดเก็บและค้นคืนได้ในระยะยาว
-
การออกแบบหลัก
- เก็บ
Memory valueซึ่งเป็นข้อความต้นฉบับทั้งหมดไว้เหมือนเดิม และใช้Primary abstractionกับCue anchorsสำหรับการค้นหา
- เก็บ
-
จุดแตกต่างสำคัญ
- มุ่งใช้โครงสร้างที่ลดการสูญเสียข้อมูลและความกำกวมในการค้นหา เมื่อเทียบกับ RAG ทั่วไปที่ฝัง embedding จากต้นฉบับทั้งหมดโดยตรง
-
ฟีเจอร์หลัก
- รองรับการสกัดหน่วยความจำอัตโนมัติ การลบข้อมูลซ้ำ การรวมและอัปเดต การค้นหาเชิงความหมาย การค้นหาด้วยคีย์เวิร์ด และการค้นหาแบบหลายขั้นตอนด้วย LLM
-
กลุ่มการใช้งาน
- AI สนทนาระยะยาว, ระบบหลาย agent, บริการแบบปรับแต่งเฉพาะบุคคล, การจัดการความรู้จากเอกสาร
-
สถานะปัจจุบัน
- เป็นโปรเจกต์โอเพนซอร์สบน Python ภายใต้สัญญาอนุญาต MIT มี benchmark และฟีเจอร์ทดลองรวมอยู่ด้วย แต่ยังใกล้เคียงกับระยะเปิดตัวช่วงแรก
บทนำ
แก้ความซับซ้อนของการจัดการหน่วยความจำของ agent
-
ในการพัฒนา AI agent แบบเดิม นักพัฒนาต้องจัดการปัญหาต่อไปนี้เอง
- ตัดสินใจว่าจะจัดเก็บข้อมูลใดเป็นหน่วยความจำ
- พิจารณาว่าจะอัปเดตหรือลบข้อมูลที่จัดเก็บไว้เมื่อใด
- ค้นหาความทรงจำที่เกี่ยวข้องกับคำถามของผู้ใช้
- จัดการความทรงจำที่ซ้ำซ้อนหรือขัดแย้งกัน
-
Memora มีเป้าหมายให้เฟรมเวิร์กจัดการวงจรชีวิตของหน่วยความจำเหล่านี้ภายในระบบ
-
นักพัฒนาจึงโฟกัสกับฟังก์ชันงานของ agent และการสร้างคำตอบได้มากกว่า logic ระดับล่างด้านการจัดเก็บและค้นคืน
ข้อจำกัดของโครงสร้างหน่วยความจำเดิม
-
ระบบ RAG ทั่วไป
- แบ่งเอกสารหรือบทสนทนาต้นฉบับออกเป็นชิ้นตามขนาดที่กำหนด
- ทำ embedding ให้แต่ละชิ้นแล้วจัดเก็บใน vector database
- ค้นหาชิ้นที่ใกล้กับคำถามในเชิงความหมาย
-
วิธีนี้ใช้งานง่าย แต่อาจเกิดปัญหาต่อไปนี้
- บริบทยาวถูกแยกออกเป็นหลายชิ้น
- ข้อมูลที่มีสำนวนคล้ายกันถูกจัดเก็บซ้ำ
- ความคล้ายเชิงความหมายแบบง่ายอาจไม่ตรงกับเจตนาจริงของคำถาม
- หากเก็บเฉพาะสรุปที่บีบอัดแล้ว รายละเอียดอาจสูญหาย
-
ฐานความรู้แบบกราฟมีข้อได้เปรียบในการแสดงความสัมพันธ์ แต่มีภาระในการดูแล schema และโครงสร้างความสัมพันธ์อย่างต่อเนื่อง
เนื้อหา
แยกต้นฉบับออกจากโครงสร้างการค้นหา
- หน่วยความจำแต่ละรายการของ Memora ประกอบด้วย 3 องค์ประกอบ
Memory value
- ข้อมูลทั้งหมดที่ถูกจัดเก็บจริง
- รักษาต้นฉบับและรายละเอียดไว้โดยไม่บีบอัด
- ไม่รวมเข้าไปในดัชนีค้นหาโดยตรง
- ทำหน้าที่รักษาบริบทเดิมไว้โดยไม่สูญเสียข้อมูล
Primary abstraction
- สรุปตัวแทนที่บอกว่าหน่วยความจำนั้นเกี่ยวกับอะไร
- สร้างหนึ่งรายการต่อหน่วยความจำหนึ่งรายการ
- ใช้เป็นเกณฑ์สำหรับการค้นหา การอัปเดต การรวม และการลบข้อมูลซ้ำ
- ใช้เป็นหน่วยมาตรฐานที่แสดงตัวตนของหน่วยความจำ
Cue anchors
- เบาะแสเชิงความหมายหลายรายการที่ใช้เข้าถึงหน่วยความจำหนึ่งรายการ
- ประกอบขึ้นจากการผสมผสานบุคคล วัตถุ เหตุการณ์ คุณลักษณะสำคัญ ฯลฯ
- สามารถเชื่อมโยงเบาะแสหลายรายการกับความทรงจำหนึ่งรายการได้
- สร้างโครงสร้างแบบ many-to-many ที่ความทรงจำหลายรายการใช้เบาะแสเดียวกันร่วมกัน
การทำดัชนีแบบเลือกเฉพาะเป้าหมายค้นหา
-
Memora ไม่ทำดัชนีต้นฉบับทั้งหมดโดยตรง
-
ในการค้นหาจริง ใช้เฉพาะข้อมูลต่อไปนี้
- Primary abstraction
- Cue anchors
-
เมื่อค้นหาเสร็จแล้ว จะส่งคืน Memory value ต้นฉบับที่เชื่อมโยงอยู่
-
เป้าหมายของโครงสร้างนี้
- แยกการแสดงผลสำหรับค้นหาออกจากข้อมูลที่จัดเก็บจริง
- ทำให้ดัชนีค้นหากระชับ
- คงรายละเอียดของต้นฉบับไว้ตามเดิม
- ลด noise เชิงความหมายที่อาจเกิดจากการ embedding ต้นฉบับ
รูปแบบกึ่งกลางระหว่าง RAG กับโครงสร้างกราฟ
-
ให้เบาะแสค้นหาที่มีโครงสร้างมากกว่า RAG ทั่วไป
-
ไม่กำหนดความสัมพันธ์ทั้งหมดด้วย schema ที่เข้มงวดเหมือน graph database
-
เป็นแนวทางที่เพิ่มชั้น abstraction ไว้เหนือความทรงจำ เพื่อให้ได้ทั้งความยืดหยุ่นและความเป็นโครงสร้าง
-
ทิศทางหลัก
- เก็บต้นฉบับในรูปแบบอิสระ
- ใช้การแสดงผลแบบมีโครงสร้างสำหรับการค้นหาและการเชื่อมโยง
- จัดการโครงสร้างการจัดเก็บและโครงสร้างการค้นหาแยกจากกัน
ลำดับการประมวลผลตั้งแต่สร้างหน่วยความจำจนถึงตอบคำถาม
1. การรวบรวมหน่วยความจำ
-
agent ประมวลผลบทสนทนาหรือเอกสาร
-
สกัดข้อมูลต่อไปนี้จากเนื้อหาโดยอัตโนมัติ
- ข้อเท็จจริง
- เหตุการณ์และประสบการณ์
- ขั้นตอนและวิธีทำงาน
-
แบ่งบทสนทนายาวออกเป็น episode ตามหัวข้อ
-
แปลงข้อมูลสำคัญเป็นรายการหน่วยความจำแบบมีโครงสร้าง
2. การจัดเก็บอัจฉริยะ
-
ใช้ ChromaDB vector database เป็นที่จัดเก็บหลักโดยค่าเริ่มต้น
-
จัดเก็บหน่วยความจำด้วย semantic embedding
-
เมื่อมีข้อมูลใหม่เข้ามา จะเปรียบเทียบกับหน่วยความจำเดิม
-
ดำเนินการต่อไปนี้กับข้อมูลที่คล้ายกันหรือซ้ำกัน
- ลบข้อมูลซ้ำ
- รวมกับความทรงจำเดิม
- อัปเดตข้อมูลที่ล้าสมัย
-
สามารถสร้าง Cue index เป็นตัวเลือกเพื่อรองรับการค้นหาแบบมีโครงสร้าง
3. การค้นหาแบบปรับตามบริบท
- มีหลายกลยุทธ์การค้นหาตามประเภทคำถามและการตั้งค่า
การค้นหาแบบ Semantic
- คำนวณความคล้ายแบบเวกเตอร์ระหว่างคำถามกับการแสดงผลของหน่วยความจำ
- ใช้งานง่ายและใช้ได้กับคำถามทั่วไป
- สามารถหาข้อมูลที่มีความหมายคล้ายกันได้ แม้สำนวนจะแตกต่างกัน
การค้นหาแบบ Prompted
- LLM ดำเนินกระบวนการค้นหาเป็นขั้นตอน
- ปรับคำค้นและขอบเขตการค้นหาซ้ำโดยอาศัยผลการค้นหาชุดแรก
- เหมาะกับคำถามซับซ้อนหรือคำถามที่ต้องผสานความทรงจำหลายรายการ
- เนื่องจากมีการเรียก LLM เพิ่มเติม จึงอาจเพิ่มต้นทุนและเวลาในการตอบ
การค้นหาแบบ Hybrid
- ผสานการค้นหาเชิงความหมายแบบเวกเตอร์กับ BM25 และการค้นหาด้วยคีย์เวิร์ด
- ใช้ทั้งความคล้ายเชิงความหมายและการตรงกันของคำแบบแม่นยำ
- มีประโยชน์ในการลดการพลาดผลค้นหาสำหรับชื่อเฉพาะ ชื่อผลิตภัณฑ์ โค้ด วันที่ ฯลฯ
การค้นหาแบบ GRPO
- ใช้นโยบายการค้นหาที่ฝึกด้วย reinforcement learning
- เรียนรู้วิธีเลือกหน่วยความจำที่จำเป็นต่อคำถามโดยตรง
- มีเป้าหมายเพื่อแทนที่การค้นหาซ้ำด้วย LLM ด้วยโมเดลที่ fine-tune แบบ local
- ปัจจุบันจัดเป็นฟีเจอร์ทดลอง
4. การสร้างคำตอบ
- จัดรูปแบบหน่วยความจำที่ค้นพบตามรูปแบบที่กำหนด
- ใส่เนื้อหาดังกล่าวเข้าไปใน prompt ของ LLM
- LLM ใช้ทั้งคำถามและความทรงจำที่ค้นพบเพื่อสร้างคำตอบ
- ชี้นำให้คำตอบอ้างอิงจากหน่วยความจำที่จัดเก็บไว้
ฟีเจอร์จัดการเพื่อรักษาคุณภาพหน่วยความจำ
-
ต่างจากที่จัดเก็บแบบแบนที่เพิ่มหน่วยความจำไปเรื่อย ๆ ระบบนี้จัดการสถานะของหน่วยความจำเดิม
-
ฟีเจอร์จัดการหลัก
- ลบความทรงจำซ้ำ
- รวมความทรงจำที่คล้ายกัน
- อัปเดตข้อเท็จจริงที่เปลี่ยนไป
- จัดระเบียบโครงสร้างหน่วยความจำใหม่
-
ใช้ Primary abstraction เป็นเกณฑ์ในการอัปเดตและรวมหน่วยความจำ
-
มีเป้าหมายเพื่อลดปัญหาหน่วยความจำสะสมซ้ำแบบไม่จำกัดเมื่อเวลาผ่านไป
รองรับหน่วยความจำหลายประเภท
- สามารถแสดงความทรงจำหลายประเภทได้โดยปรับวิธีจัดโครงสร้างค่า memory และ abstraction ให้แตกต่างกัน
ความทรงจำเชิงข้อเท็จจริง
- ข้อมูลที่ค่อนข้างคงที่ เช่น บุคคล สถานที่ คุณลักษณะ การตั้งค่า
- ตัวอย่าง: ที่ทำงานของผู้ใช้รายหนึ่ง เครื่องมือที่ชอบใช้ tech stack ของโปรเจกต์
ความทรงจำเชิงเหตุการณ์
- เหตุการณ์หรือบทสนทนาที่เกิดขึ้น ณ ช่วงเวลาหนึ่ง
- ตัวอย่าง: สิ่งที่ตัดสินใจในการประชุมที่ผ่านมา กระบวนการแก้ไข error เฉพาะรายการ
ความทรงจำเชิงขั้นตอน
- วิธีทำงานหรือขั้นตอนที่ทำซ้ำได้
- ตัวอย่าง: ขั้นตอน deploy server ลำดับตรวจสอบ error กฎการสร้างเอกสาร
การแชร์และแยกหน่วยความจำของหลาย agent
-
agent หลายตัวที่ทำงานในสภาพแวดล้อมเดียวกันสามารถใช้พื้นที่หน่วยความจำร่วมกันได้
-
ข้อมูลที่ agent หนึ่งจัดเก็บไว้สามารถถูก agent อื่นนำกลับมาใช้ได้
-
สามารถจำกัดขอบเขตหน่วยความจำตาม agent หรือบทบาทได้เช่นกัน
-
ผลที่คาดหวัง
- ลดความซ้ำซ้อนของความรู้ระหว่าง agent
- ปรับปรุงการส่งต่องาน
- รักษาความสอดคล้องของข้อมูลโปรเจกต์ร่วม
-
เป็นโครงสร้างที่รองรับการแชร์แบบเลือกได้และการคุ้มครองข้อมูลส่วนบุคคลผ่านฟีเจอร์ควบคุมการเข้าถึงและการแยกข้อมูล
แยกโครงสร้างพื้นฐานการจัดเก็บออกจากโครงสร้างการแสดงผล
-
ออกแบบให้วิธีแสดงผลหน่วยความจำไม่ผูกแน่นกับที่จัดเก็บเฉพาะรายใดรายหนึ่ง
-
โครงสร้างโปรเจกต์มีฟีเจอร์เชื่อมต่อฐานข้อมูลต่อไปนี้
- ChromaDB
- Redis
-
ใช้ได้กับสภาพแวดล้อมจัดเก็บแบบ local หรือ remote
-
แม้เปลี่ยน storage backend ก็ยังรักษาโครงสร้าง abstraction และ cue ของหน่วยความจำไว้ได้
วิธีใช้งานพื้นฐาน
- ต้องใช้ Python 3.10 ขึ้นไป
- clone repository จาก GitHub แล้วติดตั้งแพ็กเกจ
- สร้าง
MemoraClientและกำหนดตัวระบุผู้ใช้หรือ agent - ใช้
add()เพื่อเพิ่มบทสนทนาหรือเอกสารเข้าไปในหน่วยความจำ - ใช้
query()เพื่อค้นหาเชิงความหมาย - ใช้
advance_query()เพื่อค้นหาขั้นสูงด้วยวิธี Prompted หรือ GRPO
โครงสร้างการเชื่อมต่อกับ agent
-
เมื่อได้รับข้อความผู้ใช้ ให้ค้นหาหน่วยความจำที่เกี่ยวข้องก่อน
-
ใช้ผลการค้นหาและคำถามของผู้ใช้เพื่อสร้างคำตอบ
-
จัดคำตอบที่สร้างขึ้นกับข้อความผู้ใช้เป็นบันทึกบทสนทนาหนึ่งรายการ
-
จัดเก็บบทสนทนาดังกล่าวกลับเข้า Memora
-
กระบวนการวนซ้ำ
- รับคำถาม
- ค้นหาความทรงจำที่เกี่ยวข้อง
- สร้างคำตอบ
- จัดเก็บบทสนทนา
- นำกลับมาใช้ในคำถามภายหลัง
การประเมินประสิทธิภาพหน่วยความจำระยะยาว
LoCoMo benchmark
-
ประเมินความสามารถค้นคืนความทรงจำจากบทสนทนาที่ต่อเนื่องยาวนาน
-
ประเภทการประเมินหลัก
- คำถามขั้นตอนเดียว
- คำถามหลายขั้นตอนที่ผสานข้อมูลหลายรายการ
- คำถามเกี่ยวกับความสัมพันธ์เชิงเวลา
- คำถามปลายเปิด
-
สามารถทดลองผสาน Semantic, Prompted, Cue index ฯลฯ ได้
LongMemEval benchmark
- ประเมินความสามารถในการจัดการคำถามหลากหลายของระบบหน่วยความจำระยะยาว
- สามารถใช้การตั้งค่า episode memory และ semantic search ได้
- ใช้สำหรับตรวจสอบการคงข้อมูลและประสิทธิภาพการค้นหาในสภาพแวดล้อมบทสนทนาระยะยาวจริง
การเรียนรู้นโยบายการค้นหาบนพื้นฐาน GRPO
-
ฟีเจอร์ทดลองที่ทำให้กระบวนการค้นหาเรียนรู้เป็นนโยบายด้วย reinforcement learning
-
ขั้นตอนการประมวลผล
- สร้างเส้นทางค้นหาด้วยนโยบายปัจจุบัน
- ประเมินความมีหลักฐานรองรับ ความซ้ำซ้อน และต้นทุนของผลการค้นหา
- คำนวณข้อได้เปรียบสัมพัทธ์ของกลุ่ม
- ฝึกนโยบายการค้นหาด้วยวิธี GRPO
-
ยกตัวอย่างด้วยโมเดลตระกูล Qwen 3B หรือ 7B และการ fine-tune ด้วย LoRA
-
การฝึกต้องใช้ GPU
-
เป้าหมาย
- ลดต้นทุนจากการเรียก LLM ภายนอกทุกครั้งที่ค้นหา
- สร้างกลยุทธ์ค้นหาที่ปรับให้เหมาะกับข้อมูลและงานเฉพาะ
-
ข้อจำกัด
- ต้องมีข้อมูลฝึกและเกณฑ์ประเมิน
- มีงานฝึกโมเดลและจัดการการใช้งานเพิ่มขึ้น
- สำหรับผู้ใช้ทั่วไป ซับซ้อนกว่าการค้นหาแบบ Semantic หากจะนำไปใช้ทันที
ข้อดีหลัก
- รักษารายละเอียดต้นฉบับได้โดยไม่บีบอัด
- โครงสร้างหน่วยความจำชัดเจนเพราะแยกการแสดงผลสำหรับค้นหาออกจากข้อมูลจริง
- จัดการการลบข้อมูลซ้ำและการอัปเดตหน่วยความจำได้อย่างเป็นระบบ
- เลือกใช้การค้นหาเชิงความหมาย การค้นหาด้วยคีย์เวิร์ด การค้นหาด้วย LLM หรือการค้นหาด้วย reinforcement learning ได้
- จัดการความทรงจำเชิงข้อเท็จจริง เชิงเหตุการณ์ และเชิงขั้นตอนในเฟรมเวิร์กเดียวได้
- agent หลายตัวสามารถแชร์ความทรงจำเดียวกันได้
- มีเป้าหมายให้เชื่อมต่อกับระบบ agent เดิมได้โดยปรับแก้ค่อนข้างน้อย
- รองรับได้ทั้งโครงสร้างจัดเก็บแบบ local และ remote
ข้อจำกัดเชิงโครงสร้างและข้อควรระวัง
- คุณภาพของ Primary abstraction และ Cue anchors ส่งผลโดยตรงต่อประสิทธิภาพการค้นหา
- หาก abstraction ที่สร้างอัตโนมัติไม่ถูกต้อง แม้ต้นฉบับจะถูกต้อง ก็อาจตกหล่นในการค้นหาได้
- โครงสร้างที่ไม่ทำดัชนีต้นฉบับโดยตรงอาจเสียเปรียบในการค้นหาถ้อยคำละเอียดหรือข้อมูลที่พบได้น้อย
- ระหว่างการลบข้อมูลซ้ำและการรวม เหตุการณ์ที่ต่างกันอาจถูกรวมผิดเป็นความทรงจำเดียว
- การค้นหาแบบ Prompted อาจเพิ่มต้นทุนและ latency จากการเรียก LLM หลายครั้ง
- วิธี GRPO ต้องใช้ GPU ข้อมูลฝึก และระบบประเมิน ทำให้ความซับซ้อนในการดำเนินงานสูง
- หน่วยความจำร่วมของหลาย agent ต้องออกแบบสิทธิ์เข้าถึงและการแยกข้อมูลให้ชัดเจน
- หากจัดเก็บข้อมูลส่วนบุคคลหรือบทสนทนาที่อ่อนไหว จำเป็นต้องมีนโยบายเข้ารหัส ลบ และเก็บรักษาแยกต่างหาก
- repository สาธารณะยังไม่มี release และมีผู้มีส่วนร่วมกับตัวชี้วัดการใช้งานน้อย จึงยากจะถือว่าเสถียรภาพสำหรับการใช้งานขนาดใหญ่ได้รับการพิสูจน์เพียงพอแล้ว
สรุป
วิธีหน่วยความจำระยะยาวที่เพิ่มชั้นการเข้าถึงแบบมีโครงสร้าง
-
Memora เสนอรูปแบบต่อไปนี้ แทนการ vectorize ต้นฉบับทั้งหมดแบบง่าย ๆ
- เก็บรายละเอียดไว้ใน Memory value
- แสดงความหมายหลักด้วย Primary abstraction
- สร้างเส้นทางค้นหาหลากหลายด้วย Cue anchors
-
คุณค่าหลักอยู่ที่สมดุลระหว่างการรักษาข้อมูลกับประสิทธิภาพการค้นหา
-
มีโอกาสใช้งานได้สูงกว่าการค้นหาเอกสารแบบง่ายในสภาพแวดล้อมต่อไปนี้
- agent ส่วนบุคคลที่โต้ตอบกับผู้ใช้เป็นเวลานาน
- ระบบที่สะสมเอกสารพัฒนาและเอกสารงานจำนวนมากอย่างต่อเนื่อง
- สภาพแวดล้อมที่ agent หลายบทบาทแชร์ความรู้กัน
- โปรเจกต์ที่ต้องนำการตัดสินใจและขั้นตอนงานในอดีตกลับมาใช้
ต้องตรวจสอบก่อนนำมาใช้
-
เมื่อนำไปใช้งานจริง ควรตรวจสอบองค์ประกอบต่อไปนี้ก่อน
- คุณภาพของการสร้าง abstraction และ Cue สำหรับเอกสารภาษาเกาหลี
- ความแม่นยำการค้นหาเมื่อเทียบกับ RAG เดิม
- อัตราข้อผิดพลาดในกระบวนการรวมหน่วยความจำ
- ปริมาณข้อมูลที่เพิ่มขึ้นและความเร็วการค้นหาเมื่อใช้งานระยะยาว
- ต้นทุน LLM และ embedding API
- วิธีจัดเก็บข้อมูลส่วนบุคคลและการควบคุมการเข้าถึง
-
ในระยะเริ่มต้น แนวทางที่เหมาะสมคือทำ PoC ขนาดเล็กกับเอกสารสำคัญบางส่วน แล้วเปรียบเทียบประสิทธิภาพกับ RAG ทั่วไปและการค้นหาแบบ hybrid
ยังไม่มีความคิดเห็น