Sessions and memory
การค้นหาหน่วยความจำ
memory_search ค้นหาโน้ตที่เกี่ยวข้องจากไฟล์หน่วยความจำของคุณ แม้ข้อความที่ใช้จะ
แตกต่างจากต้นฉบับ โดยจะแบ่งหน่วยความจำเป็นส่วนย่อย ๆ และ
ค้นหาด้วย embeddings, คีย์เวิร์ด หรือทั้งสองอย่าง
เริ่มต้นอย่างรวดเร็ว
OpenClaw ใช้ embeddings ของ OpenAI เป็นค่าเริ่มต้น หากต้องการใช้ผู้ให้บริการรายอื่น ให้กำหนด อย่างชัดเจน:
{ agents: { defaults: { memorySearch: { provider: "openai", // หรือ "gemini", "voyage", "mistral", "bedrock", "local", "ollama", "lmstudio", "github-copilot", "openai-compatible" }, }, },}provider ยังสามารถอ้างอิงรายการ models.providers.<id> แบบกำหนดเองได้ (เช่น
ollama-5080) ตราบใดที่รายการนั้นกำหนด api เป็น "ollama" หรือ
ID ผู้ให้บริการรายอื่นที่มีอะแดปเตอร์ embedding สำหรับหน่วยความจำ
สำหรับ embeddings ภายในเครื่องที่ไม่ต้องใช้คีย์ API ให้ติดตั้ง Plugin ผู้ให้บริการ llama.cpp อย่างเป็นทางการ
และกำหนด provider: "local":
openclaw plugins install @openclaw/llama-cpp-providerเช็กเอาต์ซอร์สยังคงต้องอนุมัติการบิลด์แบบเนทีฟ: pnpm approve-builds จากนั้น
pnpm rebuild node-llama-cpp
ปลายทาง embedding บางแห่งที่เข้ากันได้กับ OpenAI ต้องใช้ป้ายกำกับ input_type
แบบไม่สมมาตร เช่น "query" สำหรับการค้นหา และ "document"/"passage" สำหรับส่วนย่อย
ที่จัดทำดัชนี กำหนดค่าเหล่านี้ด้วย queryInputType และ documentInputType; ดู
ข้อมูลอ้างอิงการกำหนดค่าหน่วยความจำ
ผู้ให้บริการที่รองรับ
| ผู้ให้บริการ | ID | ต้องใช้คีย์ API | หมายเหตุ |
|---|---|---|---|
| Bedrock | bedrock |
ไม่ | ใช้เชนข้อมูลรับรอง AWS |
| DeepInfra | deepinfra |
ใช่ | โมเดลเริ่มต้น BAAI/bge-m3 |
| Gemini | gemini |
ใช่ | รองรับการจัดทำดัชนีรูปภาพ/เสียง |
| GitHub Copilot | github-copilot |
ไม่ | ใช้การสมัครใช้งาน Copilot ของคุณ |
| ภายในเครื่อง | local |
ไม่ | โมเดล GGUF ดาวน์โหลดอัตโนมัติประมาณ 0.6 GB |
| LM Studio | lmstudio |
ไม่ | เซิร์ฟเวอร์ภายในเครื่อง/โฮสต์เอง |
| Mistral | mistral |
ใช่ | |
| Ollama | ollama |
ไม่ | เซิร์ฟเวอร์ภายในเครื่อง/โฮสต์เอง |
| OpenAI | openai |
ใช่ | ค่าเริ่มต้น |
| เข้ากันได้กับ OpenAI | openai-compatible |
โดยทั่วไป | ปลายทาง /v1/embeddings ทั่วไป |
| Voyage | voyage |
ใช่ |
วิธีการทำงานของการค้นหา
OpenClaw เรียกใช้เส้นทางการดึงข้อมูลสองเส้นทางแบบขนานและรวมผลลัพธ์:
flowchart LR
Q["คำค้น"] --> E["Embedding"]
Q --> T["แยกเป็นโทเค็น"]
E --> VS["การค้นหาเวกเตอร์"]
T --> BM["การค้นหา BM25"]
VS --> M["รวมแบบถ่วงน้ำหนัก"]
BM --> M
M --> R["ผลลัพธ์อันดับต้น ๆ"]- การค้นหาเวกเตอร์ จับคู่ความหมายที่คล้ายกัน ("โฮสต์ Gateway" จับคู่กับ " เครื่องที่ใช้งาน OpenClaw")
- การค้นหาคีย์เวิร์ด BM25 จับคู่คำที่ตรงกันทุกประการ (ID, สตริงข้อผิดพลาด, คีย์การกำหนดค่า)
- การค้นหาชื่อไฟล์ จัดทำดัชนีพาธแยกจากเนื้อหาโน้ต พาธเต็มที่ตรงกันทุกประการ ชื่อไฟล์ฐาน และส่วนต้นของชื่อไฟล์ จะมีอันดับสูงกว่าพาธที่ตรงกันเพียงบางส่วน ขณะที่ส่วนข้อความและคะแนนคีย์เวิร์ดของเนื้อหายังคงมาจากเนื้อหาโน้ต
หากมีเพียงเส้นทางเดียวที่พร้อมใช้งาน ระบบจะเรียกใช้เส้นทางนั้นเพียงอย่างเดียว
โหมด FTS เท่านั้น กำหนด provider: "none" เพื่อปิดใช้งาน embeddings โดยเจตนา
และค้นหาด้วยคีย์เวิร์ดเท่านั้น หากไม่กำหนด provider หรือกำหนดเป็น "auto"
ระบบจะใช้การจัดอันดับด้วยคีย์เวิร์ดเท่านั้นเช่นกันหากไม่มีการกำหนดค่าการยืนยันตัวตนสำหรับ embedding
โดยไม่รายงานข้อผิดพลาด และ provider: "local" (ผู้ให้บริการ GGUF/llama.cpp)
ก็จะทำเช่นเดียวกันเมื่อทำงานล้มเหลว
ผู้ให้บริการที่ระบุไว้อย่างชัดเจนไม่พร้อมใช้งาน หากคุณระบุผู้ให้บริการรายอื่นอย่างชัดเจน
(เช่น openai, ollama, gemini) และผู้ให้บริการนั้นไม่พร้อมใช้งาน
ในเวลาที่ส่งคำขอ (การยืนยันตัวตนไม่ถูกต้อง เครือข่ายล้มเหลว) memory_search จะรายงานว่า
หน่วยความจำไม่พร้อมใช้งานแทนที่จะลดระดับเป็นผลลัพธ์แบบ FTS เท่านั้นโดยไม่แจ้งให้ทราบ วิธีนี้ทำให้
ปัญหาของผู้ให้บริการที่กำหนดค่าไว้ยังคงมองเห็นได้ กำหนด provider: "none" หากต้องการเรียกคืนข้อมูล
แบบ FTS เท่านั้นโดยเจตนา หรือแก้ไขการกำหนดค่าผู้ให้บริการ/การยืนยันตัวตนเพื่อคืนค่าการจัดอันดับเชิงความหมาย
การปรับปรุงคุณภาพการค้นหา
ฟีเจอร์เสริมสองรายการช่วยจัดการประวัติโน้ตขนาดใหญ่
การลดน้ำหนักตามเวลา
โน้ตเก่าจะค่อย ๆ สูญเสียน้ำหนักในการจัดอันดับ เพื่อให้ข้อมูลล่าสุดปรากฏก่อน
เมื่อใช้ค่าครึ่งชีวิตเริ่มต้น 30 วัน โน้ตจากเดือนที่แล้วจะได้คะแนน 50% ของ
น้ำหนักเดิม MEMORY.md และไฟล์อื่นที่ไม่มีวันที่ภายใต้ memory/ เป็นข้อมูล
ที่ใช้ได้เสมอและจะไม่มีการลดน้ำหนัก มีเพียงไฟล์ memory/YYYY-MM-DD.md ที่มีวันที่เท่านั้นที่ลดน้ำหนัก
MMR (ความหลากหลาย)
ลดผลลัพธ์ที่ซ้ำซ้อน หากโน้ตห้ารายการกล่าวถึงการกำหนดค่าเราเตอร์เดียวกันทั้งหมด MMR จะทำให้ผลลัพธ์อันดับต้น ๆ ครอบคลุมหัวข้อที่แตกต่างกันแทนการแสดงซ้ำ
เปิดใช้ทั้งสองอย่าง
{ agents: { defaults: { memorySearch: { query: { hybrid: { mmr: { enabled: true }, temporalDecay: { enabled: true }, }, }, }, }, },}หน่วยความจำหลายรูปแบบ
ด้วย gemini-embedding-2-preview คุณสามารถจัดทำดัชนีรูปภาพและเสียงควบคู่กับ
Markdown ได้ ตัวเลือกนี้ใช้เฉพาะกับไฟล์ภายใต้ memorySearch.extraPaths; รากหน่วยความจำ
เริ่มต้น (MEMORY.md, memory/*.md) ยังคงรองรับเฉพาะ Markdown คำค้นหา
ยังคงเป็นข้อความ แต่สามารถจับคู่กับเนื้อหาภาพและเสียงได้ ดู
ข้อมูลอ้างอิงการกำหนดค่าหน่วยความจำ
สำหรับการตั้งค่า
การค้นหาหน่วยความจำเซสชัน
สำหรับการเรียกคืนข้อความแบบตรงกันทุกประการจากทรานสคริปต์เซสชัน ให้ใช้ sessions_search
จากนั้นเปิดผลลัพธ์ด้วย sessions_history การค้นหาหน่วยความจำเซสชันยังคงเป็นส่วนเสริมเชิงความหมาย
ที่อยู่ในขั้นทดลอง
คุณสามารถเลือกจัดทำดัชนีทรานสคริปต์เซสชันเพื่อให้ memory_search เรียกคืน
บทสนทนาก่อนหน้าได้ ฟีเจอร์นี้ต้องเลือกเปิดใช้: กำหนด experimental.sessionMemory: true และเพิ่ม
"sessions" ลงใน sources (ค่าเริ่มต้น sources คือ ["memory"])
ผลลัพธ์จากเซสชันเป็นไปตาม tools.sessions.visibility: ค่าเริ่มต้น "tree" เปิดเผย
เซสชันปัจจุบัน เซสชันที่สร้างขึ้นจากเซสชันนี้ และเซสชันกลุ่มของเอเจนต์เดียวกันที่เฝ้าดู
ผ่านการรับรู้กลุ่มโดยรอบ เมื่อใช้ session.dmScope: "main" การตั้งค่า DM แบบหลายผู้ใช้
จะแชร์เซสชันหลักนั้น ดังนั้นผู้ใช้ที่ถูกกำหนดเส้นทางไปยังเซสชันดังกล่าวจึงเรียกคืนเนื้อหา
จากกลุ่มที่เฝ้าดูได้ ใช้ dmScope แยกตามคู่สนทนาเพื่อแยก DM หรือกำหนด
การมองเห็นเป็น "self" เพื่อไม่เข้าร่วมการอ่านเซสชันที่เฝ้าดูโดยรอบ ส่วนเซสชันอื่น
ของเอเจนต์เดียวกันที่ไม่เกี่ยวข้องยังคงต้องใช้การมองเห็นแบบ "agent"
เมื่อใช้แบ็กเอนด์ QMD ให้กำหนด memory.qmd.sessions.enabled: true ด้วย เพื่อให้
ทรานสคริปต์ถูกส่งออกไปยังคอลเลกชัน QMD; experimental.sessionMemory
และ sources เพียงอย่างเดียวจะไม่ส่งออกทรานสคริปต์ไปยัง QMD ดู
ข้อมูลอ้างอิงการกำหนดค่า
การแก้ไขปัญหา
ไม่พบผลลัพธ์? เรียกใช้ openclaw memory status เพื่อตรวจสอบดัชนี หากว่างเปล่า ให้เรียกใช้
openclaw memory index --force
พบเฉพาะคีย์เวิร์ดที่ตรงกัน? ผู้ให้บริการ embedding ของคุณอาจยังไม่ได้รับการกำหนดค่า ตรวจสอบ
openclaw memory status --deep
Embeddings ภายในเครื่องหมดเวลา? ollama, lmstudio และ local ใช้ระยะเวลา
หมดเวลาของแบตช์แบบอินไลน์ที่นานขึ้นเป็นค่าเริ่มต้น หากโฮสต์เพียงแค่ทำงานช้า ให้กำหนด
agents.defaults.memorySearch.sync.embeddingBatchTimeoutSeconds แล้วเรียกใช้
openclaw memory index --force อีกครั้ง
ไม่พบข้อความ CJK? สร้างดัชนี FTS ใหม่ด้วย
openclaw memory index --force