mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-10-04 00:03:59 +00:00
refactor(memory): 裁剪与召回收敛到唯一入口 memoryPass
把「踢出去(prune)」与「取进来(recall)」从两处各写一遍,收敛为 memoryPass(query, trigger, prune, recall) 单一入口,统一: - 同一份清洗后的 query(避免噪声带偏相关性打分); - 同一次 token 预算与召回截断; - 同一条带 trigger 的审计日志(谁、据什么触发了哪种操作)。 落地: - 新增 memorypass.go:memoryPass + pruneByQuery(原 pruneOnInput 的执行体); - pruneOnInput 只解析声明,执行委托 memoryPass; - stepToolAfter 的裁剪/召回改为一次 memoryPass 调用(去掉重复的 topK 逻辑); - 抽出 recallText,输入侧 buildTaskMemoryContext 与工具侧 recallTextFor 共用; - 输入侧召回 query 改用 CleanInput(清洗文本),与裁剪侧同一语义; - QQ qq_get_history 补齐声明 ContextPolicy=prune + RecallPolicy=auto (内容类工具:真实聊天正文既当轮用完即裁,又据正文召回)。 测试:新增 memorypass_test.go,锁死 no-op / 两轴同时生效 / 正交不互相触发 / 输入侧用清洗 query。go build/vet 干净,internal/... 全绿,qq 插件模块测试通过。
This commit is contained in:
@ -373,20 +373,13 @@ func (a *Agent) emitResponse(evt *agentIO.InputEvent, response string) {
|
||||
//
|
||||
// 查询向量取**清洗后**的输入(通道 Cleaner 的输出),与工具侧同一套语义:
|
||||
// 原始输入里的 ANSI/base64/JSON 包装会把相关性打分带偏,裁掉本该保留的事件。
|
||||
//
|
||||
// 实际执行交由 memoryPass(与召回共用入口、query、预算与审计)。
|
||||
func (a *Agent) pruneOnInput(evt *agentIO.InputEvent, cleanInput string) int {
|
||||
if a.context == nil || !a.pruneDeclared(evt) {
|
||||
if !a.pruneDeclared(evt) {
|
||||
return 0
|
||||
}
|
||||
// **动态上下文**是父 agent 专属能力:轻量内核(驻留子)用传统上下文,
|
||||
// 不做按相关度的裁剪与向 doc 记忆的归档(子也没有 doc 记忆)。
|
||||
if a.isLightKernel() {
|
||||
return 0
|
||||
}
|
||||
topK := a.maxContextSize - 1
|
||||
if topK < 1 {
|
||||
topK = 1
|
||||
}
|
||||
return a.context.Prune(cleanInput, topK, a.docStore)
|
||||
return a.memoryPass(cleanInput, "input:"+evt.Source, true, false).Archived
|
||||
}
|
||||
|
||||
// pruneDeclared 判定这次输入是否显式声明了裁剪。
|
||||
|
||||
Reference in New Issue
Block a user