召回与注入:记忆在合适的时候出现
每次 LLM 请求都会先被 Proxy 拦截:召回 L1/L2/L3 → 预算截断 → 按注入点改写 system prompt → 转发上游。稳定内容放系统提示词尾部(可缓存),动态记忆放用户提示词前缀。
读路径 · auto-recall + Proxy Injection
① 三通道召回 MemoryCore · auto-recall.ts · 超时 5s
L1 原子记忆搜索
  • 策略:keyword / embedding / hybrid
  • keyword:FTS5 BM25 + jieba 中文分词
  • embedding:sqlite-vec cosine
  • hybrid:双路并行 + 客户端 RRF 融合(K=60)
  • TCVDB 后端:原生 hybridSearch 一次调用
scoreThreshold 0.3 maxResults 5 RRF K=60
L3 Persona 读取
  • 读 persona.md 并剥离导航
  • 无条件注入(四层中唯一)
  • 按 team+agent 作用域隔离读取
  • 内容进 appendSystemContext
L2 场景导航
  • 读 scene_index → 生成导航块
  • 全量注入,由 LLM 自行判断相关性
  • 命中场景后可用 read_file 下钻完整画像
  • 内容进 appendSystemContext
② 预算控制与稳定 / 动态分离 applyRecallBudget
预算截断
maxCharsPerMemory 单条截断(码点级切割防拆散代理对)+ maxTotalRecallChars 总量丢弃;防记忆占满上下文。
appendSystemContext
persona + 场景导航 + 记忆工具指南 —— 变化少,放 system 尾部,命中 Anthropic/OpenAI 提示词缓存。
prependContext
L1 相关记忆(<relevant-memories>)—— 每轮变化,放 user prompt 前缀,不打爆系统缓存。
③ Proxy 注入管线 MemoryProxy · InjectionPipeline
LLM 请求
Anthropic / OpenAI / Codex Responses 协议
身份识别
URL 前缀 /:agent/:spaceId/ → AgentProfile + 租户
注入器依序执行
各 injector 在四个注入点改写 system prompt
转发上游 LLM
响应原样返回 Agent
TdaiProfileMemoryInjector
注入 L2/L3 画像与场景导航(稳定部分)
system.prefix
TdaiL1RecallInjector
注入 L1 相关记忆(动态部分)
before_tools
TdaiToolsInjector / SkillInjector
注入记忆 / 技能工具清单(tdai_memory_search 等)
after_tools
KnowledgeToolsInjector
注入 Wiki / CodeGraph 工具,按需 /v3/tools/call
system.suffix
记忆工具约束:tdai_memory_search(L1)与 tdai_conversation_search(L0)每轮合计最多调用 3 次;3 次无果即停止。来源:MemoryCore/src/core/hooks/auto-recall.ts + MemoryProxy/src/injection/。