DeepSeek Harness 中文检索为什么搜不到「消耗」两个字?—— unicode61 缺陷 + trigram + LIKE 回退的完整修复

发布时间:2026/8/22 22:12:05

DeepSeek Harness 中文检索为什么搜不到「消耗」两个字?—— unicode61 缺陷 + trigram + LIKE 回退的完整修复
DeepSeek Harness 中文检索为什么搜不到「消耗」两个字—— unicode61 缺陷 trigram LIKE 回退的完整修复️标签#DeepSeek-Harness #FTS5 #中文全文检索 #trigram #SQLite关键词DeepSeek Harness 中文检索, FTS5 unicode61, trigram tokenizer, LIKE 回退, sessionQuery, CJK 分词摘要DeepSeek Harness 的会话全文检索sessionQuery用 SQLite FTS5 的unicode61tokenizer对连续汉字不切词——整段中文被当成一个 token且查询被整体包成单短语。结果是Token消耗、索引优化这类中文子串查询必然 0 命中。本文从源码机制讲清楚为什么给出可复现的 node:sqlite 验证并分享一套trigram 双表 1–2 字 LIKE 回退的完整修复含通配符转义与 snippet 处理。https://github.com/QIANLING-0831/dsh-memory-plus1. 现象中文子串搜索全部落空在 DSH 里搜一句旧会话里的中文比如文档索引优化减少Token消耗的句子查询Token消耗→0 命中查询索引优化→0 命中只有把完整整句原样打出来才命中英文/代码没问题中文一塌糊涂。这不是 DSH 特有的 bug而是 FTS5unicode61tokenizer 对 CJK 的固有行为 查询方式叠加的结果。2. 机制为什么必然 0 命中unicode61按 Unicode 类别把字母/数字当作词内字符对中文汉字同样如此。于是连续汉字在分词后是一个 token——索引优化减少Token消耗的句子整个是一坨被索引成一个 token索引优化减少token消耗的句子 ← 单个 tokenunicode61 视角而session-query的查询侧quoteFtsData把用户输入整体包成一个短语functionquoteFtsData(query){return${query.replaceAll(\,\\)};}短语查询要求短语的 token 序列 文档的 token 序列所以索引优化要等于整段 token 才命中——永远不相等于是0 命中。3. 可复现node:sqlite无需 DSHimport{DatabaseSync}fromnode:sqlite;constdbnewDatabaseSync(:memory:);db.exec(CREATE VIRTUAL TABLE u USING fts5(text, tokenizeunicode61));db.exec(CREATE VIRTUAL TABLE t USING fts5(text, tokenizetrigram));db.exec(INSERT INTO u(text) VALUES (索引优化减少Token消耗的句子));db.exec(INSERT INTO t(text) VALUES (索引优化减少Token消耗的句子));constn(sql,...a)db.prepare(sql).get(...a).c;console.log(unicode61 Token消耗 :,n(SELECT count(*) c FROM u WHERE u MATCH ?,Token消耗));console.log(unicode61 索引优化 :,n(SELECT count(*) c FROM u WHERE u MATCH ?,索引优化));console.log(trigram Token消耗 :,n(SELECT count(*) c FROM t WHERE t MATCH ?,Token消耗));console.log(trigram 索引优化 :,n(SELECT count(*) c FROM t WHERE t MATCH ?,索引优化));console.log(trigram 消耗(2字) :,n(SELECT count(*) c FROM t WHERE t MATCH ?,消耗));console.log(trigram 优(1字) :,n(SELECT count(*) c FROM t WHERE t MATCH ?,优));console.log(LIKE 消耗 :,n(SELECT count(*) c FROM t WHERE text LIKE ? ESCAPE \\,%消耗%));结果与 DSH 同一 SQLite 引擎查询unicode61上游trigramLIKE 回退Token消耗中英混合0✅ 命中—索引优化0✅ 命中—完整整句✅唯一方式✅—消耗/索引2 字00✅ 命中优1 字00✅ 命中关键点来了trigram 也不完美——它只索引 ≥3 字符的连续子串所以消耗、索引、优这类 1–2 字中文查询在 trigram 表上照样 0 命中。1–2 字中文恰是高频查询形态必须回退。4. 完整修复三级路由 LIKE 回退我做在开源插件dsh-session-query-sqlite-cjk里思路是双表双 tokenizer 按查询内容路由// 路由规则functionqueryMatchMode(query){if(!containsCjk(query))returnunicode61;// 纯 ASCII → 原表行为与上游一致returnArray.from(query).length3?like:trigram;// CJK3 字走 LIKE否则 trigram}含 CJK 且总长 ≥ 3→ trigram 表Token消耗的 CJK 部分只有 2 字但整体 ≥3 字符ke消是合法 trigram直接命中含 CJK 且总长 3→LIKE %词%回退ESCAPE \转义%/_/\纯 ASCII→ 原 unicode61 表英文/代码检索行为与上游完全一致零回归。4.1 LIKE 回退的三个细节通配符转义LIKE %词%里%/_是通配符查询里若含这些字符必须转义否则完%会误中完成constpattern%${query.replace(/[\\%_]/g,(ch)\\${ch})}%;// SQL: WHERE text LIKE ? ESCAPE \snippet 定位trigram 表走 FTS5highlight()自动标记命中LIKE 表没有高亮需用instr/substr手工把首个命中位置包上标记字符DSH 用\u{FDD0}/\u{FDD1}作标记这样 snippet 仍能居中定位CASEWHENinstr(text,?)0THENsubstr(text,1,instr(text,?)-1)||?||substr(text,instr(text,?),length(?))||?||substr(text,instr(text,?)length(?))ELSEtextENDASmarked_textmatch_count排序用highlight计数靠标记字符LIKE 表改按字节差统计全部出现次数(length(CAST(textASBLOB))-length(CAST(replace(text,?,)ASBLOB)))/?4.2 别忘了 FTS5 的坑LIKE 不能用裸表名WHERE 表名 LIKE ?不生效FTS5 的裸表名语法只配MATCH用必须写列名-- 错WHERE live_docs_cjk LIKE ? → 0 命中-- 对WHERE ld.text LIKE ? ESCAPE \ → 命中5. 若想合入上游三处集成点DERIVED_USER_TABLES白名单新增 FTS5 表名persisted_docs_cjk等必须同步进白名单否则已有库下次打开会被assertDerivedUserTables判为 unrecognized 拒开SCHEMA_VERSION递增加表/换 tokenizer 是不兼容变更老库靠版本不一致就地 reset 重建查询分支复用现有 persisted live 的UNION ALL第三个分支按查询路由替换 MATCH 表达式即可。另注trigram 的case_sensitive默认关闭与 unicode61 的大小写折叠一致保持默认即不回归英文/代码检索。6. 测试12 个单测trigram 命中、中英混合命中、ASCII 回退、1 字/2 字 LIKE 回退、通配符转义、短查询无命中、会话级检索、持久化会话双分支检索、无命中场景依赖包dsh-memory-index8 单测回归通过。仓库https://github.com/QIANLING-0831/dsh-memory-plus packages/dsh-session-query-sqlite-cjkMIT欢迎试用、提 issue。

相关新闻

Resynthesizer 纹理合成:3个场景修图出贴图,免费GIMP插件直接上手

Resynthesizer 纹理合成:3个场景修图出贴图,免费GIMP插件直接上手

2026/8/22 22:12:05

Resynthesizer 纹理合成:3个场景修图出贴图,免费GIMP插件直接上手 【免费下载链接】resynthesizer Suite of gimp plugins for texture synthesis 项目地址: https://gitcode.com/gh_mirrors/re/resynthesizer Resynthesizer(GIMP Res…

激光焊接设备数字化能力怎么评估?五维对比

激光焊接设备数字化能力怎么评估?五维对比

2026/8/22 22:12:05

所谓激光焊接设备数字化能力,就是设备把焊接这件事"数据化"的程度——能不能自动记录工艺参数、能不能实时监控焊接过程、能不能对接MES追溯、能不能远程诊断维护。过去选设备看功率、看速度、看价格,如今越来越多的工厂发现:设备数…

5 分钟用 qmcdump 完成 QQ 音乐解密,文件原样可用

5 分钟用 qmcdump 完成 QQ 音乐解密,文件原样可用

2026/8/22 22:02:05

5 分钟用 qmcdump 完成 QQ 音乐解密,文件原样可用 【免费下载链接】qmcdump 一个简单的QQ音乐解码(qmcflac/qmc0/qmc3 转 flac/mp3),仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump qmcdump 做…

医疗AI项目如何平衡开发周期与效果?

医疗AI项目如何平衡开发周期与效果?

2026/8/22 23:12:07

医疗AI项目如何平衡开发周期与效果选型核心原则在选择医疗AI优化方案时,关键在于找到一个既能满足项目时间要求又能保证最终效果的平衡点。本文旨在提供一套通用的选型标准,并以凤扬AI为例进行具体分析,同时简要介绍其他品牌的适配边界。全文…

Git远程仓库配置详解:从origin报错到高效协作

Git远程仓库配置详解:从origin报错到高效协作

2026/8/22 23:12:07

1. 问题引入:当Git告诉你“不认识origin”相信每一个和Git打过交道的开发者,都见过这个让人心头一紧的报错信息:fatal: origin does not appear to be a git repository...。它通常在你信心满满地敲下git push origin main或git pull origin …

辽宁入户门单扇、子母、对开门怎么选?快来看这些建议尺寸!

辽宁入户门单扇、子母、对开门怎么选?快来看这些建议尺寸!

2026/8/22 23:12:07

在辽宁,选择合适的入户门至关重要,它不仅关乎家居安全,还影响着居住的舒适度。而单扇、子母、对开门各有特点,以下为您详细分析。不同类型入户门特点及适用场景单扇入户门单扇门结构简单,安装方便,占用空间…

FOC算法核心数学工具:正余弦查找表、极值运算与反正切函数优化实践

FOC算法核心数学工具:正余弦查找表、极值运算与反正切函数优化实践

2026/8/22 23:12:07

1. FOC算法中的数学基石:为什么这些公式如此关键?如果你正在捣鼓无刷电机的FOC(磁场定向控制),或者正准备从简单的六步方波转向这个听起来更高级的算法,那你肯定绕不开一堆让人头大的数学公式。别慌&#x…

SAP ABAP Excel数据导入:彻底解决CONVT_NO_NUMBER千分位转换错误

SAP ABAP Excel数据导入:彻底解决CONVT_NO_NUMBER千分位转换错误

2026/8/22 23:12:07

1. 项目概述:当Excel遇上SAP ABAP的“数字鸿沟”在SAP ABAP开发中,通过程序上传Excel数据到SAP系统,是一个再常见不过的需求。无论是批量创建物料主数据、导入采购订单,还是处理财务凭证,Excel因其灵活性和用户友好性&…

ShawzinBot:免费的MIDI转译工具,3步实现Warframe自动化演奏

ShawzinBot:免费的MIDI转译工具,3步实现Warframe自动化演奏

2026/8/22 23:02:07

ShawzinBot:免费的MIDI转译工具,3步实现Warframe自动化演奏 【免费下载链接】ShawzinBot Convert a MIDI input to a series of key presses for the Shawzin 项目地址: https://gitcode.com/gh_mirrors/sh/ShawzinBot 把MIDI文件拖进窗口&#x…

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

2026/8/21 21:41:19

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

2026/8/22 11:09:22

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

2026/8/22 11:09:22

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

多尺度智能体控制:从宏观密度场到微观决策的架构与实践

多尺度智能体控制:从宏观密度场到微观决策的架构与实践

2026/8/22 0:00:52

1. 从宏观到微观:多尺度智能体控制的核心挑战在智能体(Agent)技术日益普及的今天,我们面临着一个越来越普遍的难题:如何同时管理成千上万个,甚至百万级别的智能体?无论是城市交通中的自动驾驶车…

CUBE标准:统一AI智能体评测的度量衡与架构解析

CUBE标准:统一AI智能体评测的度量衡与架构解析

2026/8/22 0:00:52

1. 项目概述:为什么我们需要一个统一的智能体评测标准?最近在折腾各种AI智能体项目,从简单的自动化脚本到复杂的多模态交互系统,我发现了一个让人头疼的共性问题:评测。每次开发完一个智能体,想看看它到底行…

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

2026/8/22 0:00:52

在电子硬件开发领域,PCB(印制电路板)的沉金工艺是提升产品可靠性和焊接质量的关键环节。对于需要高密度互连、长期稳定运行或高频信号传输的板卡,如“黍姐仿通行证”这类可能涉及身份识别、数据交互的硬件项目,选择正确…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/22 4:13:47

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/22 1:32:34

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…