Sessions and memory

การค้นหาหน่วยความจำ

memory_search ค้นหาโน้ตที่เกี่ยวข้องจากไฟล์หน่วยความจำของคุณ แม้เมื่อ ถ้อยคำแตกต่างจากข้อความต้นฉบับ โดยทำงานด้วยการจัดทำดัชนีหน่วยความจำเป็น ชิ้นส่วนเล็ก ๆ แล้วค้นหาชิ้นส่วนเหล่านั้นโดยใช้ embeddings, คีย์เวิร์ด หรือทั้งสองอย่าง

เริ่มต้นอย่างรวดเร็ว

การค้นหาหน่วยความจำใช้ OpenAI embeddings เป็นค่าเริ่มต้น หากต้องการใช้ แบ็กเอนด์ embedding อื่น ให้ตั้งค่า provider อย่างชัดเจน:

json5
{  agents: {    defaults: {      memorySearch: {        provider: "openai", // or "gemini", "local", "ollama", "openai-compatible", etc.      },    },  },}

สำหรับการตั้งค่าหลาย endpoint ที่มี provider เฉพาะสำหรับหน่วยความจำ provider ยังสามารถ เป็นรายการ models.providers.<id> แบบกำหนดเองได้ เช่น ollama-5080 เมื่อ provider นั้นตั้งค่า api: "ollama" หรือเจ้าของ adapter embedding หน่วยความจำรายอื่น

สำหรับ embeddings ภายในเครื่องโดยไม่ต้องใช้ API key ให้ติดตั้ง @openclaw/llama-cpp-provider และตั้งค่า provider: "local" เช็กเอาต์ซอร์สโค้ด อาจยังต้องอนุมัติการ build แบบ native: pnpm approve-builds แล้วตามด้วย pnpm rebuild node-llama-cpp

endpoint embedding ที่เข้ากันได้กับ OpenAI บางรายการต้องใช้ label แบบไม่สมมาตร เช่น input_type: "query" สำหรับการค้นหา และ input_type: "document" หรือ "passage" สำหรับชิ้นส่วนที่จัดทำดัชนี กำหนดค่าสิ่งเหล่านี้ด้วย memorySearch.queryInputType และ memorySearch.documentInputType; ดู เอกสารอ้างอิงการกำหนดค่าหน่วยความจำ

provider ที่รองรับ

provider ID ต้องใช้ API key หมายเหตุ
Bedrock bedrock ไม่ ใช้ AWS credential chain
DeepInfra deepinfra ใช่ ค่าเริ่มต้น: BAAI/bge-m3
Gemini gemini ใช่ รองรับการจัดทำดัชนีภาพ/เสียง
GitHub Copilot github-copilot ไม่ ใช้การสมัครสมาชิก Copilot
Local local ไม่ โมเดล GGUF, ดาวน์โหลดประมาณ 0.6 GB
Mistral mistral ใช่
Ollama ollama ไม่ ภายในเครื่อง/โฮสต์เอง
OpenAI openai ใช่ ค่าเริ่มต้น
เข้ากันได้กับ OpenAI openai-compatible โดยทั่วไป /v1/embeddings แบบทั่วไป
Voyage voyage ใช่

วิธีการทำงานของการค้นหา

OpenClaw รันเส้นทาง retrieval สองเส้นทางแบบขนานและรวมผลลัพธ์:

flowchart LR
    Q["Query"] --> E["Embedding"]
    Q --> T["Tokenize"]
    E --> VS["Vector Search"]
    T --> BM["BM25 Search"]
    VS --> M["Weighted Merge"]
    BM --> M
    M --> R["Top Results"]
  • การค้นหาเวกเตอร์ ค้นหาโน้ตที่มีความหมายคล้ายกัน ("gateway host" ตรงกับ "the machine running OpenClaw")
  • การค้นหาคีย์เวิร์ด BM25 ค้นหารายการที่ตรงกันแบบเป๊ะ (ID, ข้อความ error, คีย์ config)

หากมีเพียงเส้นทางเดียว อีกเส้นทางจะทำงานลำพัง โหมด FTS-only แบบตั้งใจ (provider: "none") และการเลือก provider แบบอัตโนมัติ/ค่าเริ่มต้นยังสามารถใช้ การจัดอันดับแบบ lexical ได้เมื่อ embeddings ไม่พร้อมใช้งาน

provider embedding แบบไม่ใช่ภายในเครื่องที่ระบุชัดเจนจะแตกต่างออกไป หากคุณตั้งค่า memorySearch.provider เป็น provider แบบเจาะจงที่มี remote backend และ provider นั้น ไม่พร้อมใช้งานขณะรันไทม์ memory_search จะรายงานว่าหน่วยความจำไม่พร้อมใช้งานแทน การใช้ผลลัพธ์แบบ FTS-only อย่างเงียบ ๆ วิธีนี้ทำให้ provider semantic ที่กำหนดค่าไว้ แต่เสียอยู่ปรากฏให้เห็น ตั้งค่า provider: "none" สำหรับการ recall แบบ FTS-only โดยตั้งใจ หรือแก้ไข การกำหนดค่า provider/auth เพื่อกู้คืนการจัดอันดับแบบ semantic

การปรับปรุงคุณภาพการค้นหา

ฟีเจอร์เสริมสองอย่างช่วยได้เมื่อคุณมีประวัติโน้ตจำนวนมาก:

การลดน้ำหนักตามเวลา

โน้ตเก่าจะค่อย ๆ สูญเสียน้ำหนักในการจัดอันดับ เพื่อให้ข้อมูลล่าสุดปรากฏก่อน ด้วยค่า half-life เริ่มต้น 30 วัน โน้ตจากเดือนที่แล้วจะได้คะแนน 50% ของ น้ำหนักเดิม ไฟล์ evergreen เช่น MEMORY.md จะไม่ถูกลดน้ำหนัก

MMR (ความหลากหลาย)

ลดผลลัพธ์ที่ซ้ำซ้อน หากโน้ตห้ารายการล้วนกล่าวถึง config router เดียวกัน MMR จะทำให้ผลลัพธ์อันดับต้น ๆ ครอบคลุมหัวข้อที่แตกต่างกันแทนการซ้ำกัน

เปิดใช้ทั้งสองอย่าง

json5
{  agents: {    defaults: {      memorySearch: {        query: {          hybrid: {            mmr: { enabled: true },            temporalDecay: { enabled: true },          },        },      },    },  },}

หน่วยความจำแบบมัลติโมดัล

ด้วย Gemini Embedding 2 คุณสามารถจัดทำดัชนีไฟล์ภาพและเสียงควบคู่กับ Markdown ได้ คำค้นหายังคงเป็นข้อความ แต่จะจับคู่กับเนื้อหาภาพและเสียง ดู เอกสารอ้างอิงการกำหนดค่าหน่วยความจำ สำหรับ การตั้งค่า

การค้นหาหน่วยความจำของเซสชัน

คุณสามารถเลือกจัดทำดัชนี transcript ของเซสชัน เพื่อให้ memory_search สามารถ recall การสนทนาก่อนหน้าได้ นี่เป็นแบบ opt-in ผ่าน memorySearch.experimental.sessionMemory และ sources: ["sessions"]; รายการ source เริ่มต้น เป็น memory-only flag ทดลองจะเปิดใช้การจัดทำดัชนี transcript ของเซสชัน ขณะที่ sources ควบคุมว่าจะค้นหาชิ้นส่วนของเซสชันหรือไม่

hit ของเซสชันทำตาม tools.sessions.visibility: การตั้งค่าเริ่มต้น tree จะ เปิดเผยเฉพาะเซสชันปัจจุบันและเซสชันที่สร้างโดยเซสชันนั้นเท่านั้น หากต้องการ recall เซสชัน gateway-dispatched ของ agent เดียวกันที่ไม่เกี่ยวข้องจากเซสชัน DM แยกต่างหาก ให้ตั้งใจ ขยาย visibility เป็น agent

เมื่อใช้ QMD ให้ตั้งค่า memory.qmd.sessions.enabled: true ด้วย เพื่อให้ transcript ถูก export ไปยัง collection QMD ดูรายละเอียดใน เอกสารอ้างอิงการกำหนดค่า

การแก้ไขปัญหา

ไม่มีผลลัพธ์ใช่ไหม รัน openclaw memory status เพื่อตรวจสอบดัชนี หากว่าง ให้รัน openclaw memory index --force

มีเฉพาะ keyword match ใช่ไหม provider embedding ของคุณอาจยังไม่ได้กำหนดค่า ตรวจสอบ openclaw memory status --deep

embeddings ภายในเครื่อง timeout ใช่ไหม ollama, lmstudio และ local ใช้ timeout batch inline ที่ยาวขึ้นเป็นค่าเริ่มต้น หาก host เพียงแค่ช้า ให้ตั้งค่า agents.defaults.memorySearch.sync.embeddingBatchTimeoutSeconds แล้วรันซ้ำ openclaw memory index --force

ไม่พบข้อความ CJK ใช่ไหม สร้างดัชนี FTS ใหม่ด้วย openclaw memory index --force

อ่านเพิ่มเติม

ที่เกี่ยวข้อง

Was this useful?
On this page

On this page