Skip to content

fix(memory): score Chinese recall on word boundaries - #4850

Merged
lyingbug merged 1 commit into
Tencent:mainfrom
hata33:fix/memory-chinese-lexical
Oct 30, 2026
Merged

lyingbug merged 1 commit into
Tencent:mainfrom
hata33:fix/memory-chinese-lexical

Conversation

@hata33

@hata33 hata33 commented Oct 28, 2026

Copy link
Copy Markdown
Contributor

Fixes #4846

Why

MEMORY RECALL 的词法召回按字符处理中文:tokenize() 逐字切分,bigrams() 只配相邻双字。如 #4846 所分析,「连接池」这类三字术语从不作为词级单元参与匹配,而「池配」「的默」这类跨词边界的碎片反而计入得分;共享常见单字的无关记忆也可能过线注入上下文。记忆召回是自动注入场景,弱相关条目的代价比普通检索更高。

Root cause

internal/application/service/memory/lexical.go 的 scoreItems() 只有两级特征:单字(权重 1)与相邻字符对(权重 2)。字符对直接取自相邻单字,没有任何词边界信息,也无词级单元。

What changed

复用项目已有的分词能力 types.Jieba(faq_snippet、query_expansion、qdrant retriever 均已使用),为评分增加词级特征,字符特征保留为 fallback:

  • 新增 hanSegments():把每段中文按 jieba 词边界切成多字词;分不出多字词的整段原样保留(未登录词的字符对 fallback 不丢);单字词(的了是…)丢弃——unigram 已覆盖
  • 新增 wordPairs():字符对只在词内部产生,不再跨词拼接(「连接池配置」不会再产出「池配」)
  • 评分改为三级加权:整词命中 ×4、词内字符对 ×2、单字命中 ×0.5(latin 词保持 ×1);分母为查询特征总权重,归一化语义不变
  • 未动:minRecallScore(0.15)、重要性平铺(0.01×Importance)、tokenize() 本身(consolidate 的去重路径行为不变)

Side effect analysis

  • 默认值:未改(阈值、条数上限、rune 预算均不变)
  • 向后兼容:纯英文/数字查询不产生词与字符对特征,走原 unigram 路径,行为不变(既有英文用例原样通过)
  • 下游消费者:selectRecallItems / lexicalRanking 签名不变,search.go 与 recall_trace.go 无需改动
  • 安全边界:无新增解析/网络路径;jieba 是进程内既有依赖,并发用法与现有五个调用点一致
  • 行为变化:跨词碎片不再计分、单字权重减半,仅靠共享常见单字或碎片匹配的弱相关条目更难过 0.15 线;强相关条目因整词命中权重最高,得分与排序更稳

Validation

在 golang:1.26-bookworm(与 CI 构建镜像同版本)容器中:

  • go test -count=1 ./internal/application/service/memory/ → ok,8 个既有用例 + 6 个新用例全部通过 ✓
  • 新用例 TestWordBoundariesFilterSharedCharacters 在改动前的 lexical.go 上运行确实失败、改动后通过(证明测试守住了修复)✓
  • go build ./... → OK ✓
  • go vet ./internal/application/service/memory/ → clean ✓
  • gofmt -l → clean;golangci-lint v2.12.2 --new-from-merge-base=upstream/main → 0 issues ✓

新用例覆盖 #4846 提到的全部场景:专业术语(连接池)、共享单字但语义无关(改名 vs 改选/名人堂)、中文标点边界(「改名,备案」不产出「名备」类碎片)、中英混合(K8s 集群)、未登录词(自造词「星澜」)。

AI assistance

Tool(s) used: ZCode (GLM)

How: AI 完成 issue 分析、方案设计、实现与回归测试;所有测试均在本地容器实际运行验证(含改动前失败对照)。我逐行审阅并核实了上述每一条行为声明。

  • 我读过并理解这个改动的每一行,对其负责——不是未审的 AI 输出。

@lyingbug
lyingbug merged commit c8896e4 into Tencent:main Oct 30, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: 改进 MEMORY RECALL 的中文词法切分与相关性评估

2 participants