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插件直接上手

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

2026/8/24 2:03:56 阅读更多 →
macOS光标主题在Windows和Linux上怎么装?Apple Cursor上手指南

macOS光标主题在Windows和Linux上怎么装?Apple Cursor上手指南

macOS光标主题在Windows和Linux上怎么装?Apple Cursor上手指南 【免费下载链接】apple_cursor Free & Open source macOS Cursors. 项目地址: https://gitcode.com/gh_mirrors/ap/apple_cursor Apple Cursor 是一款开源的 macOS 风格鼠标指针主题&#x…

2026/8/22 22:10:55 阅读更多 →
15 分钟把日文 Unity 游戏译成中文:XUnity Auto Translator 安装、配置与排错完整指南

15 分钟把日文 Unity 游戏译成中文:XUnity Auto Translator 安装、配置与排错完整指南

15 分钟把日文 Unity 游戏译成中文:XUnity Auto Translator 安装、配置与排错完整指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity Auto Translator 是一款面向 Unity 游戏的免费自…

2026/8/22 22:10:55 阅读更多 →

最新新闻

揭秘大厂面试室:科技与心理学的完美结合

揭秘大厂面试室:科技与心理学的完美结合

1. 互联网大厂面试室的秘密武器推开那扇磨砂玻璃门,扑面而来的是精心调试到22度的恒温空气。互联网大厂的面试室从来不只是个物理空间,它是用毫米级精度设计的压力测试场。去年我作为某大厂面试流程优化项目组成员,用热力图分析仪追踪过187场…

2026/8/24 6:12:07 阅读更多 →
AI实习生技术架构与应用实践指南

AI实习生技术架构与应用实践指南

1. 从"AI实习生"概念看未来工作范式变革最近看到谷歌资深研究员Jeff Dean关于"未来人人标配50个AI实习生"的访谈观点,这个提法让我想起十年前第一次接触云计算时的震撼。当时我们还在为服务器运维发愁,谁能想到今天连小学生都能通过…

2026/8/24 6:12:07 阅读更多 →
8G显存跑AI视频:LTX2.5整合包实战评测与避坑指南

8G显存跑AI视频:LTX2.5整合包实战评测与避坑指南

如果你最近在尝试用AI生成视频,大概率会遇到两个让人头疼的问题:要么是生成的视频分辨率低、画面模糊,要么就是对硬件要求太高,动不动就需要16G、24G甚至32G的显存,让普通玩家望而却步。市面上很多号称“低门槛”的AI视…

2026/8/24 6:12:07 阅读更多 →
传音控股技术岗位薪资竞争力与求职策略分析

传音控股技术岗位薪资竞争力与求职策略分析

1. 职场薪酬观察:传音薪资竞争力分析最近在职场圈里,传音控股的薪资待遇成为热议话题。作为一家专注于海外市场的手机厂商,传音这几年的发展势头确实令人瞩目。我在科技行业从业多年,也持续关注着各家企业的薪酬变化,今…

2026/8/24 6:12:07 阅读更多 →
AI智能体互操作协议治理缺口剖析:MCP、A2A、ACP的安全与合规挑战

AI智能体互操作协议治理缺口剖析:MCP、A2A、ACP的安全与合规挑战

1. 项目概述:当智能体开始“对话”,我们发现了什么?最近在折腾几个主流的AI智能体(Agent)互操作协议,包括MCP(Model Context Protocol)、A2A(Agent-to-Agent)…

2026/8/24 6:12:07 阅读更多 →
基于LangChain与Streamlit的智能简历生成与分析系统

基于LangChain与Streamlit的智能简历生成与分析系统

1. 项目概述:用大模型技术重构简历处理流程作为一名从Java转型AI开发的工程师,我深刻理解求职过程中简历优化的重要性。传统简历制作存在几个痛点:格式呆板缺乏个性、内容与岗位匹配度低、自我评价主观性强。而市面上的简历工具大多停留在模板…

2026/8/24 6:11:07 阅读更多 →

日新闻

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践 前端安全依赖分层防护。没有任何单一配置能替代输出编码、权限校验和依赖更新。 把不可信内容当作数据 默认使用框架的转义能力;确需渲染 HTML 时,先在服务端或可信的客户端库中进行白名单过滤。避免把用户输入直接赋给 inne…

2026/8/24 1:08:15 阅读更多 →
Windows登录密码存储机制全解析:从哈希算法到安全加固实战

Windows登录密码存储机制全解析:从哈希算法到安全加固实战

1. 项目概述:Windows登录密码的“黑匣子”每次你按下CtrlAltDel,输入密码,然后看到那个熟悉的桌面,这背后发生了一系列复杂而精密的操作。作为一名长期与Windows系统打交道的从业者,我经常被问到:“我的密码…

2026/8/24 1:08:15 阅读更多 →
AI面试系统安全挑战与解决方案

AI面试系统安全挑战与解决方案

1. 项目概述:AI面试系统的安全挑战去年参与某跨国企业AI面试系统部署时,遇到一个典型案例:候选人在视频面试中无意提到竞争对手产品名称,系统竟自动将该信息关联到企业知识库并生成竞品分析报告。这个看似"智能"的功能&…

2026/8/24 1:08:15 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/24 0:06:02 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/24 0:20:20 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/24 0:14:11 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/23 18:47:06 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/23 12:10:44 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →