Replies: 2 comments
|
补一个生态数据点,你的 benchmark 覆盖面可能比你列的更广。 你描述的「trigram + LIKE 兜底」形态,在 Pi 插件生态的 所以如果 jieba 双索引的 94% 精确率站得住,除了你列的 sage-mem 一族,这类 Pi 生态记忆包也是潜在受益者,值得把集成提案发过去。 顺带:我们在 DSH 上对这个包做过端到端验证(经 pi2dsh 引擎直装,example),但验的是跨会话召回链路,不是中文检索质量——你这份 benchmark 正好是我们没测的那半,这也是我觉得它有价值的原因。利益相关:pi2dsh 是我们维护的。 |
|
感谢这份 benchmark,特别是把「召回 100% / 精确 45%」这一行单独测出来——这正是我这类实现最薄弱的环节,而中文技术场景里 我维护的正是你说的那一族( 1. 你的两条批评我都复现了,而且是结构性的。
2. 但有一个坑,我建议在提案里点名:trigram 表里的 1–2 字查询是"永远 0 命中",不是"慢"。 trigram 索引里不存在 1–2 字的 gram,所以对 trigram 表做
这一点很关键:如果只换 trigram 而不单独处理短查询,用户会以为"中文修好了",但最常用的 1–2 字查询还是搜不到——症状和没修一样,只是原因从"不切词"变成了"索引里没有那个 gram"。#3698 那个帖子记的就是我踩这个坑的过程。 3. 对 jieba 方案的问题(不是在挑刺,是我真要拿来做取舍时会卡住的点):
4. 一个生态数据点:这位在 #1999 提了官方侧的可配置 tokenizer 提案( 最后,如果你想把「召回靠 trigram / 精确靠分词」合成一个方案,我认为可行的形态是:分词表负责高精度命中并排序靠前,trigram 表作为"任意子串"的兜底召回,两者用 RRF 之类融合。这样短查询、跨词边界、误记原话三种情况都有覆盖。你要是愿意,我可以把这个形态的具体接缝(两张表怎么保证一致性、schema 版本怎么管、路由怎么判)写清楚发过来,你评估要不要做。 实现与实测数据:https://github.com/QIANLING-0831/dsh-memory-plus( |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
问题
所有社区 memory 插件(sage-mem、dsh-memory、dsh-mnemon 等)都使用 SQLite FTS5 做全文检索。默认的
unicode61分词器按空格/标点切词,对英文没问题,但对中文完全失效。根因
中文没有词边界。FTS5 的
unicode61分词器会把一整句中文当成一个 token:sage-mem 的作者发现了这个问题,改用 trigram 分词 +
LIKE兜底,部分解决了搜索不到的问题,但有明显缺陷:LIKE '%keyword%'是 O(n) 全表扫描修复方案
使用 jieba(Rust 实现,无需 native 编译)做中文分词:
实现
我做了一个 DSH 插件:dsh-chinese-search
架构:
@node-rs/jieba(Rust 实现,零 native 依赖)做分词Benchmark(1,000 条中文记忆数据):
索引构建:1,000 条数据 347ms(事务批量写入)。
对非中文用户也有用
不只是中文问题——jieba 对中英混合文本(如 "使用DeepSeek模型")的分词也明显更好,这在技术场景中很常见。
仓库
GitHub:
github.com/xzy-jason/dsh-chinese-search如果现有 memory 插件的作者感兴趣,可以直接集成这套分词方案。
Tags: dsh-plugin, i18n, search, memory
All reactions