减少token消耗计划:unicode61 tokenizer 无法检索中文(连整句都搜不到)——附社区修复插件 #3202
Replies: 1 comment
|
English summary: source-verified at rc.7 (99f6f02) + empirically reproduced with node:sqlite (the same engine the package uses). Confirmed: FTS5 源码验证(rc.7 1. 机制确认(源码)
2. 实测数据(node:sqlite,FTS5,同一引擎)文档
结论:双表 + CJK 路由的方向正确,trigram 实测修复了子串召回(含中英混合 "Token消耗",trigram 对 ASCII 子串同样建索引)。 3. 关键坑:1-2 字中文查询在 trigram 下必然 0 命中trigram tokenizer 只索引 ≥3 字符的连续子串——"消耗"、"索引"这类二字查询(中文查询的常见形态)在 trigram 表上直接 0 命中,除非你额外处理。三种可行回退:
注意路由顺序: 4. 若合并上游:三个集成细节(社区插件不需要,但上游合并必须)
另外提醒:trigram 的 5. 回答你的问题
复现脚本(node:sqlite,可直接跑): |
Uh oh!
There was an error while loading. Please reload this page.
问题
dsh-session-query-sqlite 使用 FTS5 unicode61 tokenizer,对 CJK 文本不切词:连续汉字被索引为单个 token,中文全文检索几乎不可用。
实测(node:sqlite + FTS5):
文档:索引优化减少Token消耗的句子
查询 Token消耗 → 0 命中
查询 "索引优化"(整句短语)→ 0 命中(必须完整复现整句才可能命中)
社区方案
我做了一个独立插件 dsh-session-query-sqlite-cjk(fork 自上游,MIT):
双 tokenizer 双表:保留 unicode61(英文/代码行为不变)+ 新增 trigram 表(中文子串召回)
查询按是否含 CJK 字符自动路由,实测 Token消耗 子串命中 ✅
仓库:https://github.com/QIANLING-0831/dsh-memory (另含 dsh-tool-result-dedup 工具结果去重插件)
想请教
官方是否有计划为 session-query 增加 CJK 友好 tokenizer(trigram / 分词)?
若社区方案可行,是否考虑把 trigram 作为可选 tokenizer 合并进上游?
All reactions