Sessions and memory

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

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

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

หากคุณมีการสมัครสมาชิก GitHub Copilot หรือกำหนดค่า API key ของ OpenAI, Gemini, Voyage หรือ Mistral ไว้ การค้นหาหน่วยความจำจะทำงานโดยอัตโนมัติ หากต้องการกำหนดผู้ให้บริการอย่างชัดเจน:

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

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

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

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

ผู้ให้บริการที่รองรับ

ผู้ให้บริการ ID ต้องใช้ API key หมายเหตุ
Bedrock bedrock ไม่ ตรวจพบอัตโนมัติเมื่อเชนข้อมูลรับรอง AWS resolved
Gemini gemini ใช่ รองรับการทำดัชนีรูปภาพ/เสียง
GitHub Copilot github-copilot ไม่ ตรวจพบอัตโนมัติ ใช้การสมัครสมาชิก Copilot
Local local ไม่ โมเดล GGUF, ดาวน์โหลด ~0.6 GB
Mistral mistral ใช่ ตรวจพบอัตโนมัติ
Ollama ollama ไม่ Local, ต้องตั้งค่าอย่างชัดเจน
OpenAI openai ใช่ ตรวจพบอัตโนมัติ รวดเร็ว
Voyage voyage ใช่ ตรวจพบอัตโนมัติ

การค้นหาทำงานอย่างไร

OpenClaw เรียกใช้เส้นทางการดึงข้อมูลสองแบบพร้อมกันและรวมผลลัพธ์:

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" ตรงกับ "เครื่องที่กำลังรัน OpenClaw")
  • การค้นหาคำสำคัญ BM25 ค้นหารายการที่ตรงกันแบบเป๊ะๆ (ID, สตริงข้อผิดพลาด, คีย์การกำหนดค่า)

หากมีเพียงเส้นทางเดียวที่พร้อมใช้งาน (ไม่มี embeddings หรือไม่มี FTS) อีกเส้นทางจะทำงานเพียงลำพัง

เมื่อ embeddings ไม่พร้อมใช้งาน OpenClaw ยังคงใช้การจัดอันดับตามคำศัพท์เหนือผลลัพธ์ FTS แทนที่จะถอยกลับไปใช้เฉพาะการเรียงลำดับแบบตรงกันเป๊ะดิบๆ โหมดที่ลดระดับนี้จะเพิ่มน้ำหนักให้ชิ้นข้อมูลที่ครอบคลุมคำค้นได้ดีกว่าและมีพาธไฟล์ที่เกี่ยวข้อง ทำให้การเรียกคืนยังมีประโยชน์แม้ไม่มี sqlite-vec หรือผู้ให้บริการ embedding

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

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

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

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

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

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

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

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

หน่วยความจำหลายรูปแบบ

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

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

คุณสามารถเลือกทำดัชนีทรานสคริปต์ของเซสชัน เพื่อให้ memory_search เรียกคืนบทสนทนาก่อนหน้าได้ ฟีเจอร์นี้ต้องเลือกเปิดผ่าน memorySearch.experimental.sessionMemory ดู เอกสารอ้างอิงการกำหนดค่า สำหรับรายละเอียด

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

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

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

embeddings แบบ Local หมดเวลา? ollama, lmstudio และ local ใช้ค่า timeout ของ inline batch ที่ยาวกว่าโดยค่าเริ่มต้น หากโฮสต์ช้าเพียงอย่างเดียว ให้ตั้งค่า agents.defaults.memorySearch.sync.embeddingBatchTimeoutSeconds แล้วรัน openclaw memory index --force อีกครั้ง

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

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

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