前言¶
在 DeepSeek Harness(DSH)里跑智能体,会话会不断落在本地 ~/.dsh/sessions。官方自带的 @deepseek-ai/dsh-session-query-sqlite 做的是全文检索:你输入某个词,它回答「哪条会话里出现过这个词」。当你只记得大意、换了一种说法,或者想按主题找会话时,关键词往往对不上。
社区插件 dsh-session-query-vector(维护者 minhaoli,分类:模型推理)把同一套 sessionQuery 服务换成向量后端:用自然语言提问,查询先被嵌入,再从索引里取最接近的文本块,并带上会话 ID 与摘要片段。它是官方 SQLite 后端的可替换实现,二者继承同一扩展点,同一时间只能挂载其中一个。
这是什么¶
一句话:面向 DSH 的语义会话搜索后端,索引与查询侧分离;嵌入可走本机 Ollama,或任意兼容 OpenAI /v1/embeddings 的端点。
- 仓库:minhaoli/dsh-session-query-vector
- 目录页:SkillHub 插件页
- 当前包版本(package.json):
0.1.0,许可证 MIT
DSH 社区插件目录是独立站点,与 DeepSeek / 幻方无官方从属关系;安装前建议自行查看源码与许可证。插件随 DSH 进程以当前用户权限运行。
与官方 SQLite 后端的区别¶
| 维度 | 官方 dsh-session-query-sqlite |
dsh-session-query-vector |
|---|---|---|
| 问法 | 包含某关键词的会话 | 与描述语义相近的会话片段 |
| 索引 | SQLite 全文 | SQLite 存向量块 + 余弦相似度 |
| 嵌入 | 查询路径不调用嵌入 API | 查询侧只对查询文本嵌入;建索引由独立脚本完成 |
架构:查询与建索引分开¶
README 明确拆成两块,避免在搜索路径上做慢速嵌入:
| 组件 | 作用 |
|---|---|
lib/index.js |
查询侧:SessionQueryEngine 子类,以插件挂载;只读索引,不在搜索时触发嵌入。索引为空则返回空结果。 |
indexer.mjs |
索引侧:独立脚本,遍历 ~/.dsh/sessions,对消息文本嵌入并写入向量库。 |
查询侧与索引侧必须使用相同的 embedModel,否则向量空间不一致,相似度分数没有意义。两侧要在配置与环境变量里保持一致。
环境要求¶
| 项 | 说明 |
|---|---|
| DSH | 0.2.1-rc.2(开发与测试针对该版本;更早版本未测试) |
@deepseek-ai/cordis |
~4.0.5 |
@deepseek-ai/schemastery |
3.18.5(随 DSH 提供) |
| Node.js | 22+(索引器使用内置 node:sqlite 的 DatabaseSync) |
| 嵌入端点 | Ollama 本地,或 OpenAI 兼容 API |
安装与启用¶
在指定 profile 下添加插件(命令来自仓库 README):
dsh plugin --profile <your-profile> add github:minhaoli/dsh-session-query-vector
包声明了 dsh.bundle.patch,dsh plugin add 会把它写入 dsh.profile.bundles,下次启动时由加载器挂载。
随包附带的 cordis.patch.yml 会禁用官方 SQLite 后端(二者都注册 sessionQuery),并插入向量后端的默认配置,例如:
- id: session-query-sqlite
disabled: true
- insert:
- id: session-query-vector
name: 'dsh-session-query-vector'
config:
provider: ollama
baseUrl: 'http://127.0.0.1:11434'
embedModel: bge-m3
openAt: first-search
若希望保留官方后端,应去掉禁用官方的那一行,且不要挂载本包——两者不能共存。
配置¶
在 profile 的 cordis.patch.yml 中修改。注意 patch 会整体替换目标行的 config,不会与旧键合并,需要保留的键要全部写回。
# ~/.dsh/profiles/<profile>/cordis.patch.yml
- insert:
- id: session-query-vector
name: 'dsh-session-query-vector'
config:
path: 'C:/Users/<you>/.dsh/storages/session-query-vector.sqlite'
provider: openai
baseUrl: 'https://api.siliconflow.cn/v1'
apiKey: 'sk-...'
embedModel: 'BAAI/bge-m3'
openAt: first-search
topK: 20
minScore: 0.45
常用配置项(默认值见 README 表格):
| 键 | 含义摘要 |
|---|---|
path |
索引 SQLite 路径,默认 ~/.dsh/storages/session-query-vector.sqlite |
openAt |
startup / first-search / never(never 则完全关闭搜索) |
provider |
ollama 或 openai(后者表示任意兼容 /v1/embeddings 的端点) |
baseUrl |
嵌入服务地址;末尾 /v1 会被规范化处理 |
apiKey |
非空时作为 Authorization: Bearer;Ollama 通常不需要 |
embedModel |
须与索引器一致 |
topK / minScore / relMargin |
候选数量、余弦下限、相对最佳分的截断 |
snippetChars / readWindowMax |
结果摘要长度与引擎读取窗口 |
嵌入端点约定¶
Ollama(provider: ollama)¶
先拉取模型:
ollama pull bge-m3
请求形如 POST {baseUrl}/api/embeddings,body 为 { "model": "bge-m3", "prompt": "..." },响应含 embedding 数组。
OpenAI 兼容(provider: openai)¶
POST {baseUrl}/v1/embeddings,input 可为字符串数组;响应按 data[].index 排序后再用。SiliconFlow、OpenAI、Azure、Together、本地 vLLM / LM Studio 等只要满足该契约即可,按服务商文档设置 baseUrl、apiKey、embedModel。
建索引(indexer.mjs)¶
索引不会由 DSH 自动跑,需要在查询侧配置好后自行执行。脚本要能 import @deepseek-ai/*,一般用 DSH 自带的 Node 环境运行。
# 默认:先 layer 1(用户消息),再 layer 2(助手消息)
node indexer.mjs
node indexer.mjs --layer=1 # 仅用户消息,最快得到可用搜索
node indexer.mjs --layer=2 # 仅助手消息
node indexer.mjs --limit=200 # 本次最多处理会话数
node indexer.mjs --status # 只看进度,不写索引
node indexer.mjs --force # 强制重扫未变更会话
node indexer.mjs --quiet
node indexer.mjs --skip-active=5 # 跳过最近 5 分钟内写入的会话
环境变量需与插件 config 对齐,尤其是 VEC_DB(等于插件 path)、VEC_PROVIDER、VEC_BASE_URL、VEC_API_KEY、VEC_MODEL。可选 VEC_CHUNK(默认 1200 字符一块)、VEC_BATCH(默认每批 16 块)、VEC_SUBAGENTS=1 纳入 subagent 会话。
桌面版 Electron 打包后,@deepseek-ai/* 在 app.asar 内,需设置 DSH_MODULES 并用应用二进制以 Node 模式执行 indexer.mjs;源码目录下可直接 node indexer.mjs。细节见 README「Running the indexer against the packaged desktop app」。
适用场景与注意¶
适合:本地或自托管 DSH、会话量大、希望用自然语言找回「当时讨论过某类问题」的会话;已有 Ollama 或硅基流动等嵌入 API 的用户。
务必注意:
- 只装向量后端或只留 SQLite,不要同时挂载。
- 改
embedModel或切换 provider 后,通常需要重建索引(--force或删库重跑)。 - 首次搜索前索引可能为空,查询侧不会替你建索引。
- 嵌入调用产生延迟与费用(若走云端 API),索引全量跑一遍也会耗时。
- 安装与运行前阅读仓库源码与 MIT 许可证;插件以当前 DSH 进程权限访问会话与索引文件。
结尾¶
dsh-session-query-vector 在 DSH「一切皆插件」的思路下,把会话检索从「命中关键词」扩展到「语义相近」,查询与建索引解耦,搜索路径保持轻量。若你已在用 DSH 并需要按主题翻历史会话,可按 README 安装插件、对齐嵌入配置、跑 indexer.mjs 后再在 Harness 里用自然语言搜索。
- 目录页:https://www.skillhub.cn/plugins/minhaoli/dsh-session-query-vector
- GitHub:https://github.com/minhaoli/dsh-session-query-vector