Technical reference

เอกสารอ้างอิงการกำหนดค่าหน่วยความจำ

หน้านี้แสดงตัวเลือกการกำหนดค่าทั้งหมดสำหรับการค้นหาหน่วยความจำของ OpenClaw สำหรับภาพรวมเชิงแนวคิด โปรดดู:

การตั้งค่าการค้นหาหน่วยความจำทั้งหมดอยู่ภายใต้ agents.defaults.memorySearch ใน openclaw.json (หรือกำหนดค่าแทนที่รายเอเจนต์ด้วย agents.list[].memorySearch) เว้นแต่จะระบุไว้เป็นอย่างอื่น


การเลือกผู้ให้บริการ

คีย์ ชนิด ค่าเริ่มต้นของผู้ให้บริการ คำอธิบาย
enabled boolean true เปิดหรือปิดการค้นหาหน่วยความจำ
provider string "openai" รหัสอะแดปเตอร์การฝัง เช่น bedrock, deepinfra, gemini, github-copilot, local, mistral, ollama, openai, openai-compatible หรือ voyage; อาจเป็น models.providers.<id> ที่กำหนดค่าไว้และมี api ชี้ไปยังอะแดปเตอร์การฝังหน่วยความจำหรือ API โมเดลที่เข้ากันได้กับ OpenAI ก็ได้
model string ค่าเริ่มต้นของผู้ให้บริการ ชื่อโมเดลการฝัง
fallback string "none" รหัสอะแดปเตอร์สำรองเมื่ออะแดปเตอร์หลักล้มเหลว

เมื่อไม่ได้ตั้งค่า provider OpenClaw จะใช้การฝังของ OpenAI ตั้งค่า provider อย่างชัดเจนเพื่อใช้ Bedrock, DeepInfra, Gemini, GitHub Copilot, Mistral, Ollama, Voyage, โมเดล GGUF ในเครื่อง หรือปลายทาง /v1/embeddings ที่เข้ากันได้กับ OpenAI การกำหนดค่าแบบเดิมที่ยังระบุ provider: "auto" จะถูกแปลงเป็น openai

เมื่อไม่ได้ตั้งค่า provider, มี provider: "auto" แบบเดิมอยู่ หรือ provider: "none" เลือกโหมด FTS เท่านั้นโดยตั้งใจ การเรียกคืนหน่วยความจำยังคง ใช้การจัดอันดับ FTS เชิงคำศัพท์ได้เมื่อการฝังไม่พร้อมใช้งาน

ผู้ให้บริการที่ไม่ใช่แบบในเครื่องซึ่งระบุอย่างชัดเจนจะปฏิเสธการทำงานเมื่อเกิดข้อผิดพลาด หากคุณตั้งค่า memorySearch.provider เป็น ผู้ให้บริการที่มีแบ็กเอนด์ระยะไกลอย่างเจาะจง เช่น Bedrock, DeepInfra, Gemini, GitHub Copilot, LM Studio, Mistral, Ollama, OpenAI, Voyage หรือผู้ให้บริการแบบกำหนดเอง ที่เข้ากันได้กับ OpenAI และผู้ให้บริการนั้นไม่พร้อมใช้งานขณะรัน memory_search จะส่งคืนผลลัพธ์ว่าไม่พร้อมใช้งาน แทนการใช้การเรียกคืนแบบ FTS เท่านั้นโดยไม่แจ้งให้ทราบ แก้ไข การกำหนดค่าผู้ให้บริการ/การยืนยันตัวตน เปลี่ยนไปใช้ผู้ให้บริการที่เข้าถึงได้ หรือตั้งค่า provider: "none" หากต้องการใช้การเรียกคืนแบบ FTS เท่านั้นโดยเจตนา

รหัสผู้ให้บริการแบบกำหนดเอง

memorySearch.provider สามารถชี้ไปยังรายการ models.providers.<id> แบบกำหนดเองสำหรับอะแดปเตอร์ผู้ให้บริการเฉพาะหน่วยความจำ เช่น ollama หรือสำหรับ API โมเดลที่เข้ากันได้กับ OpenAI เช่น openai-responses / openai-completions OpenClaw จะแก้ไขเจ้าของ api ของผู้ให้บริการนั้นสำหรับอะแดปเตอร์การฝัง พร้อมคงรหัสผู้ให้บริการแบบกำหนดเองไว้สำหรับการจัดการปลายทาง การยืนยันตัวตน และคำนำหน้าโมเดล ซึ่งช่วยให้การตั้งค่าหลาย GPU หรือหลายโฮสต์สามารถจัดสรรการฝังหน่วยความจำให้แก่ปลายทางในเครื่องเฉพาะได้:

json5
{  models: {    providers: {      "ollama-5080": {        api: "ollama",        baseUrl: "http://gpu-box.local:11435",        apiKey: "ollama-local",        models: [{ id: "qwen3-embedding:0.6b", name: "Qwen3 Embedding 0.6B" }],      },    },  },  agents: {    defaults: {      memorySearch: {        provider: "ollama-5080",        model: "qwen3-embedding:0.6b",      },    },  },}

การกำหนดคีย์ API

การฝังระยะไกลต้องใช้คีย์ API แต่ Bedrock ใช้ห่วงโซ่ข้อมูลประจำตัวเริ่มต้นของ AWS SDK แทน (บทบาทอินสแตนซ์, SSO, คีย์การเข้าถึง หรือคีย์ API ของ Bedrock)

ผู้ให้บริการ ตัวแปรสภาพแวดล้อม คีย์การกำหนดค่า
Bedrock ห่วงโซ่ข้อมูลประจำตัว AWS หรือ AWS_BEARER_TOKEN_BEDROCK ไม่ต้องใช้คีย์ API
DeepInfra DEEPINFRA_API_KEY models.providers.deepinfra.apiKey
Gemini GEMINI_API_KEY models.providers.google.apiKey
GitHub Copilot COPILOT_GITHUB_TOKEN, GH_TOKEN, GITHUB_TOKEN โปรไฟล์การยืนยันตัวตนผ่านการเข้าสู่ระบบด้วยอุปกรณ์
Mistral MISTRAL_API_KEY models.providers.mistral.apiKey
Ollama OLLAMA_API_KEY (ค่าตัวยึดตำแหน่ง) --
OpenAI OPENAI_API_KEY models.providers.openai.apiKey
Voyage VOYAGE_API_KEY models.providers.voyage.apiKey

การกำหนดค่าปลายทางระยะไกล

ใช้ provider: "openai-compatible" สำหรับเซิร์ฟเวอร์ /v1/embeddings ทั่วไปที่เข้ากันได้กับ OpenAI และไม่ควรสืบทอดข้อมูลประจำตัวแชต OpenAI ส่วนกลาง

remote.baseUrlstring

URL ฐาน API แบบกำหนดเอง

remote.apiKeystring

กำหนดคีย์ API แทน

remote.headersobject

ส่วนหัว HTTP เพิ่มเติม (ผสานกับค่าเริ่มต้นของผู้ให้บริการ)

json5
{  agents: {    defaults: {      memorySearch: {        provider: "openai-compatible",        model: "text-embedding-3-small",        remote: {          baseUrl: "https://api.example.com/v1/",          apiKey: "YOUR_KEY",        },      },    },  },}

การกำหนดค่าเฉพาะผู้ให้บริการ

Gemini
คีย์ ชนิด ค่าเริ่มต้น คำอธิบาย
model string gemini-embedding-001 รองรับ gemini-embedding-2-preview ด้วย
outputDimensionality number 3072 สำหรับ Embedding 2: 768, 1536 หรือ 3072
ชนิดอินพุตที่เข้ากันได้กับ OpenAI

ปลายทางการฝังที่เข้ากันได้กับ OpenAI สามารถเลือกใช้ฟิลด์คำขอ input_type เฉพาะผู้ให้บริการได้ ซึ่งมีประโยชน์สำหรับโมเดลการฝังแบบไม่สมมาตรที่ต้องใช้ป้ายกำกับต่างกันสำหรับการฝังคำค้นและเอกสาร

คีย์ ชนิด ค่าเริ่มต้น คำอธิบาย
inputType string ไม่ได้ตั้งค่า input_type ที่ใช้ร่วมกันสำหรับการฝังคำค้นและเอกสาร
queryInputType string ไม่ได้ตั้งค่า input_type ขณะค้นหา; กำหนดแทน inputType
documentInputType string ไม่ได้ตั้งค่า input_type สำหรับดัชนี/เอกสาร; กำหนดแทน inputType
json5
{  agents: {    defaults: {      memorySearch: {        provider: "openai-compatible",        remote: {          baseUrl: "https://embeddings.example/v1",          apiKey: "${EMBEDDINGS_API_KEY}",        },        model: "asymmetric-embedder",        queryInputType: "query",        documentInputType: "passage",      },    },  },}

การเปลี่ยนค่าเหล่านี้ส่งผลต่ออัตลักษณ์แคชการฝังสำหรับการจัดทำดัชนีแบบกลุ่มของผู้ให้บริการ และควรจัดทำดัชนีหน่วยความจำใหม่หลังจากนั้น เมื่อโมเดลต้นทางตีความป้ายกำกับแตกต่างกัน

Bedrock

การกำหนดค่าการฝัง Bedrock

Bedrock ใช้ห่วงโซ่ข้อมูลประจำตัวเริ่มต้นของ AWS SDK ร่วมกับโทเค็นผู้ถือที่ OpenClaw ตรวจสอบแล้ว จึงไม่มีการจัดเก็บคีย์ API ในการกำหนดค่า หาก OpenClaw ทำงานบน EC2 พร้อมบทบาทอินสแตนซ์ที่เปิดใช้งาน Bedrock เพียงตั้งค่าผู้ให้บริการและโมเดล:

json5
{  agents: {    defaults: {      memorySearch: {        provider: "bedrock",        model: "amazon.titan-embed-text-v2:0",      },    },  },}
คีย์ ชนิด ค่าเริ่มต้น คำอธิบาย
model string amazon.titan-embed-text-v2:0 รหัสโมเดลการฝัง Bedrock ใดก็ได้
outputDimensionality number ค่าเริ่มต้นของโมเดล สำหรับ Titan V2: 256, 512 หรือ 1024

โมเดลที่รองรับ (พร้อมการตรวจหาตระกูลและค่าเริ่มต้นของมิติ):

ID โมเดล ผู้ให้บริการ มิติเริ่มต้น มิติที่กำหนดค่าได้
amazon.titan-embed-text-v2:0 Amazon 1024 256, 512, 1024
amazon.titan-embed-text-v1 Amazon 1536 --
amazon.titan-embed-g1-text-02 Amazon 1536 --
amazon.titan-embed-image-v1 Amazon 1024 --
amazon.nova-2-multimodal-embeddings-v1:0 Amazon 1024 256, 384, 1024, 3072
cohere.embed-english-v3 Cohere 1024 --
cohere.embed-multilingual-v3 Cohere 1024 --
cohere.embed-v4:0 Cohere 1536 256, 384, 512, 768, 1024, 1536
twelvelabs.marengo-embed-3-0-v1:0 TwelveLabs 512 --
twelvelabs.marengo-embed-2-7-v1:0 TwelveLabs 1024 --

ตัวแปรรุ่นที่มีส่วนต่อท้ายระบุอัตราการประมวลผล (เช่น amazon.titan-embed-text-v1:2:8k) และ ID โปรไฟล์การอนุมานที่มีคำนำหน้าภูมิภาค (เช่น us.amazon.titan-embed-text-v2:0) จะสืบทอดการกำหนดค่าของโมเดลพื้นฐาน

ภูมิภาค: กำหนดตามลำดับนี้: ค่าที่เขียนทับใน memorySearch.remote.baseUrl, การกำหนดค่า models.providers.amazon-bedrock.baseUrl, AWS_REGION, AWS_DEFAULT_REGION และค่าเริ่มต้น us-east-1

การยืนยันตัวตน: OpenClaw ตรวจหา AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY หรือ AWS_BEARER_TOKEN_BEDROCK ก่อน จากนั้นจึงใช้สายโซ่ผู้ให้บริการข้อมูลประจำตัวเริ่มต้นมาตรฐานของ AWS SDK:

  1. ตัวแปรสภาพแวดล้อม (AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY) เว้นแต่จะตั้งค่า AWS_PROFILE ไว้ด้วย
  2. SSO (เฉพาะเมื่อกำหนดค่าฟิลด์ SSO แล้ว)
  3. ไฟล์ข้อมูลประจำตัวและไฟล์การกำหนดค่าที่ใช้ร่วมกัน (fromIni รวมถึง AWS_PROFILE)
  4. กระบวนการข้อมูลประจำตัว (credential_process ในไฟล์การกำหนดค่า AWS)
  5. ข้อมูลประจำตัวจากโทเค็นข้อมูลประจำตัวเว็บ
  6. ข้อมูลประจำตัวจากข้อมูลเมตาของอินสแตนซ์ ECS หรือ EC2

สิทธิ์ IAM: บทบาท IAM หรือผู้ใช้ต้องมี:

json
{  "Effect": "Allow",  "Action": "bedrock:InvokeModel",  "Resource": "*"}

เพื่อให้มีสิทธิ์ขั้นต่ำ ให้จำกัดขอบเขต InvokeModel ไว้เฉพาะโมเดลที่ระบุ:

text
arn:aws:bedrock:*::foundation-model/amazon.titan-embed-text-v2:0
ภายในเครื่อง (GGUF + llama.cpp)
คีย์ ชนิด ค่าเริ่มต้น คำอธิบาย
local.modelPath string ดาวน์โหลดอัตโนมัติ พาธไปยังไฟล์โมเดล GGUF
local.modelCacheDir string ค่าเริ่มต้นของ node-llama-cpp ไดเรกทอรีแคชสำหรับโมเดลที่ดาวน์โหลด
local.contextSize number | "auto" 4096 ขนาดหน้าต่างบริบทสำหรับบริบทการฝังข้อมูล ค่า 4096 ครอบคลุมส่วนข้อมูลทั่วไป (128-512 โทเค็น) พร้อมจำกัด VRAM ที่ไม่ใช่น้ำหนักโมเดล ลดเป็น 1024-2048 บนโฮสต์ที่มีทรัพยากรจำกัด "auto" ใช้ค่าสูงสุดที่โมเดลได้รับการฝึกมา ซึ่งไม่แนะนำสำหรับโมเดลขนาด 8B ขึ้นไป (Qwen3-Embedding-8B: สูงสุด 40 960 โทเค็นอาจเพิ่มการใช้ VRAM เป็นประมาณ 32 GB)

ติดตั้งผู้ให้บริการ llama.cpp อย่างเป็นทางการก่อน: openclaw plugins install @openclaw/llama-cpp-provider โมเดลเริ่มต้น: embeddinggemma-300m-qat-Q8_0.gguf (ประมาณ 0.6 GB ดาวน์โหลดอัตโนมัติ) การเช็กเอาต์ซอร์สยังคงต้องอนุมัติการสร้างแบบเนทีฟ: pnpm approve-builds แล้วตามด้วย pnpm rebuild node-llama-cpp

ใช้ CLI แบบสแตนด์อโลนเพื่อตรวจสอบพาธผู้ให้บริการเดียวกับที่ Gateway ใช้:

bash
openclaw memory status --deep --agent mainopenclaw memory index --force --agent main

ค่าตัวเลขของ local.contextSize ยังใช้แจ้งการจัดวางเลเยอร์ GPU อัตโนมัติของ node-llama-cpp เพื่อให้น้ำหนักโมเดลและบริบทการฝังข้อมูลที่ร้องขอถูกจัดสรรร่วมกันได้ openclaw memory status --deep รายงานแบ็กเอนด์ llama.cpp, อุปกรณ์, การถ่ายโอนภาระ, บริบทที่ร้องขอ และข้อมูลหน่วยความจำพร้อมการประทับเวลาที่ทราบล่าสุดหลังจากรันไทม์โหลดแล้ว สถานะแบบพาสซีฟจะไม่โหลดโมเดล

ตั้งค่า provider: "local" อย่างชัดเจนสำหรับการฝังข้อมูล GGUF ภายในเครื่อง การอ้างอิงโมเดลแบบ hf: และ HTTP(S) รองรับในการกำหนดค่าภายในเครื่องแบบชัดเจน (ผ่านการแก้ไขโมเดลของ node-llama-cpp) แต่จะไม่เปลี่ยนผู้ให้บริการเริ่มต้น

ระยะหมดเวลาของการฝังข้อมูลแบบอินไลน์

sync.embeddingBatchTimeoutSecondsnumber

เขียนทับระยะหมดเวลาสำหรับชุดการฝังข้อมูลแบบอินไลน์ระหว่างการทำดัชนีหน่วยความจำ

เมื่อไม่ได้ตั้งค่า จะใช้ค่าเริ่มต้นของผู้ให้บริการ: 600 วินาทีสำหรับผู้ให้บริการภายในเครื่อง/โฮสต์เอง เช่น local, ollama และ lmstudio และ 120 วินาทีสำหรับผู้ให้บริการแบบโฮสต์ เพิ่มค่านี้เมื่อชุดการฝังข้อมูลภายในเครื่องที่ใช้ CPU ประมวลผลทำงานปกติแต่ช้า


ลักษณะการทำงานของการทำดัชนี

ทั้งหมดอยู่ภายใต้ memorySearch.sync เว้นแต่จะระบุไว้เป็นอย่างอื่น:

คีย์ ชนิด ค่าเริ่มต้น คำอธิบาย
onSessionStart boolean true ซิงค์ดัชนีหน่วยความจำเมื่อเซสชันเริ่มต้น
onSearch boolean true ซิงค์แบบหน่วงเวลาเมื่อค้นหาหลังจากตรวจพบการเปลี่ยนแปลงเนื้อหา
watch boolean true เฝ้าดูไฟล์หน่วยความจำ (chokidar) และกำหนดเวลาทำดัชนีใหม่เมื่อมีการเปลี่ยนแปลง
watchDebounceMs number 1500 ช่วงเวลาดีบาวซ์สำหรับรวมเหตุการณ์เฝ้าดูไฟล์ที่เกิดขึ้นอย่างรวดเร็ว
intervalMinutes number 0 ช่วงเวลาการทำดัชนีใหม่เป็นระยะในหน่วยนาที (0 หมายถึงปิดใช้งาน)
sessions.postCompactionForce boolean true บังคับทำดัชนีเซสชันใหม่หลังการอัปเดตบทถอดความที่เกิดจาก Compaction
chunking.tokensnumber

ขนาดส่วนย่อยในหน่วยโทเค็นที่ใช้เมื่อแบ่งแหล่งข้อมูลหน่วยความจำก่อนสร้างเวกเตอร์ฝังตัว (ค่าเริ่มต้น: 400)

chunking.overlapnumber

จำนวนโทเค็นที่ซ้อนทับกันระหว่างส่วนย่อยที่อยู่ติดกัน เพื่อรักษาบริบทบริเวณขอบเขตการแบ่ง (ค่าเริ่มต้น: 80)


การกำหนดค่าการค้นหาแบบผสม

ทั้งหมดอยู่ภายใต้ memorySearch.query:

คีย์ ชนิด ค่าเริ่มต้น คำอธิบาย
maxResults number 6 จำนวนผลลัพธ์หน่วยความจำสูงสุดที่ส่งคืนก่อนแทรกข้อมูล
minScore number 0.35 คะแนนความเกี่ยวข้องขั้นต่ำสำหรับรวมผลลัพธ์

และภายใต้ memorySearch.query.hybrid:

คีย์ ชนิด ค่าเริ่มต้น คำอธิบาย
enabled boolean true เปิดใช้การค้นหาแบบผสม BM25 + เวกเตอร์
vectorWeight number 0.7 น้ำหนักของคะแนนเวกเตอร์ (0-1)
textWeight number 0.3 น้ำหนักของคะแนน BM25 (0-1)
candidateMultiplier number 4 ตัวคูณขนาดกลุ่มรายการที่เป็นตัวเลือก

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

คีย์ ชนิด ค่าเริ่มต้น คำอธิบาย
mmr.enabled boolean false เปิดใช้การจัดอันดับใหม่ด้วย MMR
mmr.lambda number 0.7 0 = ความหลากหลายสูงสุด, 1 = ความเกี่ยวข้องสูงสุด

การลดทอนตามเวลา (ความใหม่)

คีย์ ชนิด ค่าเริ่มต้น คำอธิบาย
temporalDecay.enabled boolean false เปิดใช้การเพิ่มคะแนนตามความใหม่
temporalDecay.halfLifeDays number 30 คะแนนลดลงครึ่งหนึ่งทุก N วัน

ไฟล์ที่มีเนื้อหาใช้ได้เสมอ (MEMORY.md และไฟล์ที่ไม่มีวันที่ใน memory/) จะไม่มีการลดทอนคะแนน

ตัวอย่างฉบับเต็ม

json5
{  agents: {    defaults: {      memorySearch: {        query: {          maxResults: 6,          minScore: 0.35,          hybrid: {            vectorWeight: 0.7,            textWeight: 0.3,            mmr: { enabled: true, lambda: 0.7 },            temporalDecay: { enabled: true, halfLifeDays: 30 },          },        },      },    },  },}

เส้นทางหน่วยความจำเพิ่มเติม

คีย์ ชนิด คำอธิบาย
extraPaths string[] ไดเรกทอรีหรือไฟล์เพิ่มเติมที่จะทำดัชนี
json5
{  agents: {    defaults: {      memorySearch: {        extraPaths: ["../team-docs", "/srv/shared-notes"],      },    },  },}

เส้นทางอาจเป็นแบบสัมบูรณ์หรือสัมพันธ์กับพื้นที่ทำงาน ระบบจะสแกนไดเรกทอรีแบบเรียกซ้ำเพื่อค้นหาไฟล์ .md การจัดการลิงก์สัญลักษณ์ขึ้นอยู่กับแบ็กเอนด์ที่ใช้งานอยู่ โดยเอนจินในตัวจะข้ามลิงก์สัญลักษณ์ ส่วน QMD จะทำงานตามพฤติกรรมของตัวสแกน QMD ที่อยู่เบื้องหลัง

สำหรับการค้นหาบันทึกบทสนทนาข้ามเอเจนต์ที่จำกัดขอบเขตตามเอเจนต์ ให้ใช้ agents.list[].memorySearch.qmd.extraCollections แทน memory.qmd.paths คอลเลกชันเพิ่มเติมเหล่านี้ใช้รูปแบบ { path, name, pattern? } เดียวกัน แต่จะผสานแยกตามเอเจนต์ และสามารถคงชื่อที่ใช้ร่วมกันซึ่งระบุไว้อย่างชัดเจนได้ เมื่อเส้นทางชี้ออกนอกพื้นที่ทำงานปัจจุบัน หากเส้นทางที่แก้ไขแล้วเดียวกันปรากฏทั้งใน memory.qmd.paths และ memorySearch.qmd.extraCollections QMD จะเก็บรายการแรกไว้และข้ามรายการซ้ำ


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

ทำดัชนีรูปภาพและเสียงควบคู่กับ Markdown โดยใช้ Gemini Embedding 2:

คีย์ ชนิด ค่าเริ่มต้น คำอธิบาย
multimodal.enabled boolean false เปิดใช้การทำดัชนีหลายรูปแบบ
multimodal.modalities string[] -- ["image"], ["audio"] หรือ ["all"]
multimodal.maxFileBytes number 10485760 ขนาดไฟล์สูงสุดสำหรับการทำดัชนี (10 MiB)

รูปแบบที่รองรับ: .jpg, .jpeg, .png, .webp, .gif, .heic, .heif (รูปภาพ); .mp3, .wav, .ogg, .opus, .m4a, .aac, .flac (เสียง)


แคช Embedding

คีย์ ชนิด ค่าเริ่มต้น คำอธิบาย
cache.enabled boolean true แคช Embedding ของส่วนข้อความไว้ใน SQLite
cache.maxEntries number ไม่ได้ตั้งค่า ขีดจำกัดสูงสุดโดยประมาณของ Embedding ที่แคชไว้

ป้องกันการสร้าง Embedding ซ้ำสำหรับข้อความที่ไม่มีการเปลี่ยนแปลงระหว่างการจัดทำดัชนีใหม่หรือการอัปเดตบทถอดเสียง ปล่อย maxEntries ไว้โดยไม่ตั้งค่าสำหรับแคชแบบไม่จำกัด หรือกำหนดค่าเมื่อการเพิ่มขึ้นของพื้นที่ดิสก์สำคัญกว่าความเร็วสูงสุดในการจัดทำดัชนีใหม่ เมื่อกำหนดค่าแล้ว รายการที่เก่าที่สุด (ตามเวลาที่อัปเดตล่าสุด) จะถูกลบออกก่อนเมื่อแคชเกินขีดจำกัด


การจัดทำดัชนีแบบแบตช์

คีย์ ชนิด ค่าเริ่มต้น คำอธิบาย
remote.nonBatchConcurrency number 4 การสร้าง Embedding แบบอินไลน์ขนาน
remote.batch.enabled boolean false เปิดใช้ API การสร้าง Embedding แบบแบตช์
remote.batch.concurrency number 2 งานแบตช์ที่ทำงานขนานกัน
remote.batch.wait boolean true รอให้งานแบตช์เสร็จสมบูรณ์
remote.batch.pollIntervalMs number 2000 ช่วงเวลาการตรวจสอบสถานะ
remote.batch.timeoutMinutes number 60 เวลาหมดเวลาของงานแบตช์

ใช้งานได้กับ gemini, openai และ voyage โดยทั่วไปแบตช์ของ OpenAI จะเร็วที่สุดและมีค่าใช้จ่ายต่ำที่สุดสำหรับการเติมข้อมูลย้อนหลังจำนวนมาก

remote.nonBatchConcurrency ควบคุมการเรียกสร้าง Embedding แบบอินไลน์ที่ผู้ให้บริการภายในเครื่อง/โฮสต์ด้วยตนเองใช้ รวมถึงผู้ให้บริการแบบโฮสต์เมื่อ API แบบแบตช์ของผู้ให้บริการไม่ได้ทำงาน ค่าเริ่มต้นของ Ollama คือ 1 สำหรับการจัดทำดัชนีที่ไม่ใช่แบบแบตช์ เพื่อหลีกเลี่ยงการเพิ่มภาระให้โฮสต์ภายในเครื่องขนาดเล็กมากเกินไป สำหรับเครื่องที่มีประสิทธิภาพสูงกว่า ให้กำหนดค่าที่สูงขึ้น

ค่านี้แยกจาก sync.embeddingBatchTimeoutSeconds ซึ่งควบคุมเวลาหมดเวลาสำหรับการเรียกสร้าง Embedding แบบอินไลน์


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

จัดทำดัชนีบทถอดเสียงของเซสชันและแสดงผลผ่าน memory_search:

คีย์ ชนิด ค่าเริ่มต้น คำอธิบาย
experimental.sessionMemory boolean false เปิดใช้การจัดทำดัชนีเซสชัน
sources string[] ["memory"] เพิ่ม "sessions" เพื่อรวมบทถอดเสียง
sync.sessions.deltaBytes number 100000 เกณฑ์จำนวนไบต์สำหรับการจัดทำดัชนีใหม่
sync.sessions.deltaMessages number 50 เกณฑ์จำนวนข้อความสำหรับการจัดทำดัชนีใหม่

ผลการค้นพบจากบทถอดเสียงของเซสชันยังอยู่ภายใต้ข้อกำหนดของ tools.sessions.visibility การมองเห็นเริ่มต้นแบบ tree จะแสดงเฉพาะเซสชันปัจจุบันและเซสชันที่เซสชันนี้สร้างขึ้นเท่านั้น หากต้องการ เรียกคืนเซสชันที่ไม่เกี่ยวข้องกันซึ่งดำเนินการโดยเอเจนต์เดียวกันและ Gateway เป็นผู้ส่งงานจากอีก เซสชันหนึ่ง เช่น DM ให้ขยายการมองเห็นเป็น agent โดยตั้งใจ (หรือใช้ all เฉพาะ เมื่อจำเป็นต้องเรียกคืนข้ามเอเจนต์ด้วย และนโยบายระหว่างเอเจนต์อนุญาต)

ตัวอย่างด้านล่างวางการตั้งค่าเหล่านี้ไว้ภายใต้ agents.defaults นอกจากนี้ คุณยังสามารถ ใช้การตั้งค่า memorySearch ที่เทียบเท่ากันในการกำหนดค่าทับสำหรับแต่ละเอเจนต์ เมื่อควรมีเพียง เอเจนต์เดียวที่จัดทำดัชนีและค้นหาบทถอดเสียงของเซสชัน

สำหรับการเรียกคืนจาก Gateway ไปยัง DM ภายในเอเจนต์เดียวกัน:

แบ็กเอนด์ในตัว

json5
{  agents: {    defaults: {      memorySearch: {        experimental: { sessionMemory: true },        sources: ["memory", "sessions"],      },    },  },  tools: {    sessions: { visibility: "agent" },  },}

แบ็กเอนด์ QMD

json5
{  agents: {    defaults: {      memorySearch: {        experimental: { sessionMemory: true },        sources: ["memory", "sessions"],      },    },  },  memory: {    backend: "qmd",    qmd: {      sessions: { enabled: true },    },  },  tools: {    sessions: { visibility: "agent" },  },}

เมื่อใช้ QMD การตั้งค่า agents.defaults.memorySearch.experimental.sessionMemory และ sources: ["sessions"] เพียงอย่างเดียวจะไม่ส่งออกบทถอดเสียงไปยัง QMD คุณต้องตั้งค่า memory.qmd.sessions.enabled: true เพิ่มเติมด้วย


การเร่งความเร็วเวกเตอร์ด้วย SQLite (sqlite-vec)

คีย์ ชนิด ค่าเริ่มต้น คำอธิบาย
store.vector.enabled boolean true ใช้ sqlite-vec สำหรับการสืบค้นเวกเตอร์
store.vector.extensionPath string รวมมาให้ แทนที่พาธของ sqlite-vec

เมื่อ sqlite-vec ไม่พร้อมใช้งาน OpenClaw จะย้อนกลับไปใช้การวัดความคล้ายคลึงแบบโคไซน์ภายในโปรเซสโดยอัตโนมัติ


พื้นที่จัดเก็บดัชนี

ดัชนีหน่วยความจำในตัวจะอยู่ในฐานข้อมูล SQLite ของ OpenClaw สำหรับเอเจนต์แต่ละตัวที่ agents/<agentId>/agent/openclaw-agent.sqlite

คีย์ ชนิด ค่าเริ่มต้น คำอธิบาย
store.fts.tokenizer string unicode61 ตัวตัดคำของ FTS5 (unicode61 หรือ trigram)

การกำหนดค่าแบ็กเอนด์ QMD

ตั้งค่า memory.backend = "qmd" เพื่อเปิดใช้งาน การตั้งค่า QMD ทั้งหมดอยู่ภายใต้ memory.qmd:

คีย์ ชนิด ค่าเริ่มต้น คำอธิบาย
command string qmd พาธไฟล์ปฏิบัติการ QMD; ตั้งเป็นพาธสัมบูรณ์เมื่อ PATH ของบริการแตกต่างจากเชลล์ของคุณ
searchMode string search คำสั่งค้นหา: search, vsearch, query
rerank boolean -- ตั้งเป็น false เมื่อใช้ searchMode: "query" และ QMD 2.1+ เพื่อข้ามการจัดอันดับซ้ำของ QMD
includeDefaultMemory boolean true สร้างดัชนี MEMORY.md + memory/**/*.md โดยอัตโนมัติ
paths[] array -- พาธเพิ่มเติม: { name, path, pattern? }
sessions.enabled boolean false ส่งออกบันทึกการสนทนาของเซสชันไปยัง QMD
sessions.retentionDays number -- ระยะเวลาการเก็บรักษาบันทึกการสนทนา
sessions.exportDir string -- ไดเรกทอรีส่งออก

searchMode: "search" ใช้การค้นหาเชิงคำศัพท์/BM25 เท่านั้น OpenClaw จะไม่เรียกใช้การตรวจสอบความพร้อมของเวกเตอร์เชิงความหมายหรือการบำรุงรักษาเอ็มเบดดิงของ QMD สำหรับโหมดนี้ รวมถึงระหว่าง memory status --deep; ส่วน vsearch และ query ยังคงต้องใช้ความพร้อมของเวกเตอร์และเอ็มเบดดิงจาก QMD

rerank: false เปลี่ยนเฉพาะโหมด query ของ QMD และต้องใช้ QMD 2.1 หรือใหม่กว่า ในโหมด CLI โดยตรง OpenClaw จะส่ง --no-rerank; ในโหมด MCP ที่ใช้ mcporter เป็นแบ็กเอนด์ ระบบจะส่ง rerank: false ไปยังเครื่องมือสืบค้นแบบรวมของ QMD ไม่ต้องตั้งค่ารายการนี้หากต้องการใช้พฤติกรรมการจัดอันดับซ้ำของการสืบค้นตามค่าเริ่มต้นของ QMD

OpenClaw เลือกใช้รูปแบบคอลเลกชันและการสืบค้น MCP ของ QMD รุ่นปัจจุบันเป็นหลัก แต่ยังคงรองรับ QMD รุ่นเก่าด้วยการลองใช้แฟล็กรูปแบบคอลเลกชันที่เข้ากันได้และชื่อเครื่องมือ MCP แบบเก่าเมื่อจำเป็น เมื่อ QMD ระบุว่ารองรับตัวกรองหลายคอลเลกชัน ระบบจะค้นหาคอลเลกชันจากแหล่งเดียวกันด้วยโปรเซส QMD เดียว ส่วน QMD รุ่นเก่าจะยังคงใช้เส้นทางความเข้ากันได้แบบแยกตามคอลเลกชัน แหล่งเดียวกันหมายถึงคอลเลกชันหน่วยความจำถาวร (ไฟล์หน่วยความจำเริ่มต้นรวมถึงพาธแบบกำหนดเอง) จะถูกจัดกลุ่มเข้าด้วยกัน ขณะที่คอลเลกชันบันทึกการสนทนาของเซสชันยังคงเป็นอีกกลุ่มหนึ่ง เพื่อให้การกระจายแหล่งข้อมูลยังคงมีข้อมูลจากทั้งสองแหล่ง

การผสานรวม mcporter

การตั้งค่าทั้งหมดอยู่ภายใต้ memory.qmd.mcporter โดยกำหนดเส้นทางการค้นหาของ QMD ผ่านดีมอน MCP ของ mcporter ที่ทำงานต่อเนื่อง แทนการสร้างโปรเซส qmd สำหรับทุกการสืบค้น ซึ่งช่วยลดค่าใช้จ่ายในการเริ่มต้นแบบเย็นสำหรับโมเดลขนาดใหญ่

คีย์ ชนิด ค่าเริ่มต้น คำอธิบาย
enabled boolean false กำหนดเส้นทางการเรียก QMD ผ่าน mcporter แทนการสร้าง qmd สำหรับแต่ละคำขอ
serverName string qmd ชื่อเซิร์ฟเวอร์ mcporter ที่เรียกใช้ qmd mcp ด้วย lifecycle: keep-alive
startDaemon boolean true เริ่มต้นดีมอน mcporter โดยอัตโนมัติเมื่อ enabled เป็น true

ต้องติดตั้ง mcporter และให้เข้าถึงได้ผ่าน PATH รวมถึงกำหนดค่าเซิร์ฟเวอร์ mcporter ที่เรียกใช้ qmd mcp ไว้แล้ว ควรปิดใช้งานสำหรับการตั้งค่าภายในเครื่องแบบง่าย ซึ่งยอมรับค่าใช้จ่ายจากการสร้างโปรเซสแยกสำหรับแต่ละการสืบค้นได้

Update schedule
คีย์ ชนิด ค่าเริ่มต้น คำอธิบาย
update.interval string 5m ช่วงเวลาการรีเฟรช
update.debounceMs number 15000 หน่วงรวมการเปลี่ยนแปลงของไฟล์
update.onBoot boolean true รีเฟรชเมื่อตัวจัดการ QMD ที่ทำงานต่อเนื่องเปิดขึ้น; ตั้งเป็น false เพื่อข้ามการอัปเดตทันทีขณะบูต
update.startup string off การเริ่มต้น QMD เมื่อ Gateway เริ่มทำงานที่เลือกได้: off, idle หรือ immediate
update.startupDelayMs number 120000 ระยะหน่วงก่อนเรียกใช้การรีเฟรช startup: "idle"
update.waitForBootSync boolean false ระงับการเปิดตัวจัดการจนกว่าการรีเฟรชครั้งแรกจะเสร็จสมบูรณ์
update.embedInterval string 60m รอบเวลาการสร้างเอ็มเบดดิงแยกต่างหาก
update.commandTimeoutMs number 30000 ระยะหมดเวลาสำหรับคำสั่งบำรุงรักษา QMD (แสดงรายการ/เพิ่มคอลเลกชัน)
update.updateTimeoutMs number 120000 ระยะหมดเวลาสำหรับแต่ละรอบของ qmd update
update.embedTimeoutMs number 120000 ระยะหมดเวลาสำหรับแต่ละรอบของ qmd embed
Limits
คีย์ ชนิด ค่าเริ่มต้น คำอธิบาย
limits.maxResults number 4 จำนวนผลการค้นหาสูงสุด
limits.maxSnippetChars number 450 จำกัดความยาวของข้อความตัดตอน
limits.maxInjectedChars number 2200 จำกัดจำนวนอักขระที่แทรกทั้งหมด
limits.timeoutMs number 4000 ระยะหมดเวลาของการค้นหา
Scope

ควบคุมว่าเซสชันใดสามารถรับผลการค้นหาจาก QMD ได้ โดยใช้สคีมาเดียวกับ session.sendPolicy:

json5
{  memory: {    qmd: {      scope: {        default: "deny",        rules: [{ action: "allow", match: { chatType: "direct" } }],      },    },  },}

ค่าเริ่มต้นที่จัดส่งมาจะอนุญาตเฉพาะ DM/การสนทนาโดยตรง และปฏิเสธกลุ่มรวมถึงประเภทช่องทางอื่น ๆ match.keyPrefix จะจับคู่กับคีย์เซสชันที่ปรับให้เป็นรูปแบบมาตรฐานแล้ว ส่วน match.rawKeyPrefix จะจับคู่กับคีย์ดิบที่รวม agent:<id>: ไว้ด้วย

การอ้างอิง

memory.citations มีผลกับแบ็กเอนด์ทั้งหมด:

ค่า ลักษณะการทำงาน
auto (ค่าเริ่มต้น) รวมส่วนท้าย Source: <path#line> ไว้ในข้อความตัวอย่าง
on รวมส่วนท้ายเสมอ
off ละเว้นส่วนท้าย (พาธยังคงถูกส่งให้เอเจนต์ภายใน)

เมื่อเปิดใช้งานการเริ่มต้น QMD ตอนเริ่ม Gateway แล้ว OpenClaw จะเริ่ม QMD เฉพาะสำหรับเอเจนต์ที่เข้าเกณฑ์เท่านั้น หาก update.onBoot เป็นจริงและไม่ได้กำหนดการบำรุงรักษาตามช่วงเวลา/การฝังข้อมูลไว้ การเริ่มต้นระบบจะใช้ตัวจัดการแบบทำงานครั้งเดียวสำหรับการรีเฟรชตอนบูต แล้วปิดตัวจัดการนั้น หากกำหนดช่วงเวลาการอัปเดตหรือการฝังข้อมูลไว้ การเริ่มต้นระบบจะเปิดตัวจัดการ QMD ที่ทำงานระยะยาว เพื่อให้ตัวจัดการเป็นเจ้าของตัวเฝ้าดูและตัวจับเวลาตามช่วงเวลา ส่วน update.onBoot: false จะข้ามเฉพาะการรีเฟรชทันทีตอนบูตเท่านั้น

ตัวอย่าง QMD แบบเต็ม

json5
{  memory: {    backend: "qmd",    citations: "auto",    qmd: {      includeDefaultMemory: true,      update: { interval: "5m", debounceMs: 15000 },      limits: { maxResults: 4, timeoutMs: 4000 },      scope: {        default: "deny",        rules: [{ action: "allow", match: { chatType: "direct" } }],      },      paths: [{ name: "docs", path: "~/notes", pattern: "**/*.md" }],    },  },}

Dreaming

กำหนดค่า Dreaming ภายใต้ plugins.entries.memory-core.config.dreaming ไม่ใช่ภายใต้ agents.defaults.memorySearch

Dreaming ทำงานเป็นการกวาดตามกำหนดเวลาเพียงครั้งเดียว และใช้ระยะเบา/ลึก/REM ภายในเป็นรายละเอียดการนำไปใช้งาน

สำหรับลักษณะการทำงานเชิงแนวคิดและคำสั่งแบบเครื่องหมายทับ โปรดดู Dreaming

การตั้งค่าของผู้ใช้

คีย์ ชนิด ค่าเริ่มต้น คำอธิบาย
enabled boolean false เปิดหรือปิด Dreaming ทั้งหมด
frequency string 0 3 * * * รอบเวลา Cron ที่เลือกกำหนดได้สำหรับการกวาด Dreaming แบบเต็ม
model string โมเดลเริ่มต้น การแทนที่โมเดลเอเจนต์ย่อย Dream Diary ซึ่งเลือกกำหนดได้
phases.deep.maxPromotedSnippetTokens number 160 จำนวนโทเค็นโดยประมาณสูงสุดที่จะเก็บไว้จากข้อความตัวอย่างการเรียกคืนระยะสั้นแต่ละรายการที่เลื่อนระดับเข้า MEMORY.md; เมทาดาทาแหล่งที่มายังคงมองเห็นได้

ตัวอย่าง

json5
{  plugins: {    entries: {      "memory-core": {        subagent: {          allowModelOverride: true,          allowedModels: ["anthropic/claude-sonnet-4-6"],        },        config: {          dreaming: {            enabled: true,            frequency: "0 3 * * *",            model: "anthropic/claude-sonnet-4-6",          },        },      },    },  },}

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

Was this useful?
On this page

On this page