mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-10-04 00:03:59 +00:00
fix(memory): 修图记忆召回的两处能力缺失(关系重复 + 原句不回显)
针对 memory_recall / 自动注入这条图记忆召回链路的实测复核: - Recall(depth>1) 跨层不去重:每层都用已累积的 entityIDs 查邻接, 上一层刚产出的关系会在下一层被反复查回并再次 append。实测 小明→小红 在 depth=2 出现两次,memory_recall 的 10 条关系预算被 同一句话刷屏、真正的新关系(小红→小刚)被截断。改为按 relation ID 跨层去重(实体本就已去重)。 - memory_recall 从不回显 sentence_text:工具 schema 明写「填了才能日后 从图谱回到原文」、Recall 也已 JOIN 出句子,但输出只给实体名与关系类型, 该字段形同虚设。抽出 formatRecallRelations,对非空原句截断 60 字附在 关系行后;超过 10 条仍截断并提示。 测试:TestRecallWithDepth 增补去重与精确条数断言; 新增 TestFormatRecallRelations_SurfacesSentence / _Truncates。 go build/vet 干净,go test -race ./internal/memory/ ./internal/agent/core/... 全绿。
This commit is contained in:
@ -197,6 +197,28 @@ func (a *Agent) mediaContextForRelations(relations []memory.Relation) string {
|
||||
return a.mediaContextForSentences(sentenceIDsFromRelations(relations))
|
||||
}
|
||||
|
||||
// formatRecallRelations 渲染 memory_recall 的关系行,超 max 条截断。
|
||||
//
|
||||
// 带上原始句子(截断到 60 字):三元组只是「A 关系 B」,脱离原句往往看不出
|
||||
// 语气、条件与指代——`sentence_text` 的存在意义就是「日后从图谱回到原文」,
|
||||
// 而 Recall 已经把句子 JOIN 出来了。此前只回显实体名与关系类型,导致模型
|
||||
// 填了 sentence_text 也永远拿不回来,这个能力形同虚设。
|
||||
func formatRecallRelations(relations []memory.Relation, max int) []string {
|
||||
var out []string
|
||||
for i, r := range relations {
|
||||
if max > 0 && i >= max {
|
||||
out = append(out, "...更多关系被截断")
|
||||
break
|
||||
}
|
||||
line := fmt.Sprintf("- %s →(%s)→ %s", r.SourceName, r.RelationType, r.TargetName)
|
||||
if s := strings.TrimSpace(r.SentenceText); s != "" {
|
||||
line += " 原句: \"" + truncateStr(s, 60) + "\""
|
||||
}
|
||||
out = append(out, line)
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// mediaContextForInjectedEntities 为自动注入路径产出媒体说明。
|
||||
//
|
||||
// Indexer.BuildContext 刻意不返回关系(只给实体索引以省 token),
|
||||
|
||||
Reference in New Issue
Block a user