dsh-session-query-vector:用向量语义搜索 DSH 历史会话

前言

在 DeepSeek Harness(DSH)里跑智能体,会话会不断落在本地 ~/.dsh/sessions。官方自带的 @deepseek-ai/dsh-session-query-sqlite 做的是全文检索:你输入某个词,它回答「哪条会话里出现过这个词」。当你只记得大意、换了一种说法,或者想按主题找会话时,关键词往往对不上。

社区插件 dsh-session-query-vector(维护者 minhaoli,分类:模型推理)把同一套 sessionQuery 服务换成向量后端:用自然语言提问,查询先被嵌入,再从索引里取最接近的文本块,并带上会话 ID 与摘要片段。它是官方 SQLite 后端的可替换实现,二者继承同一扩展点,同一时间只能挂载其中一个。

这是什么

一句话:面向 DSH 的语义会话搜索后端,索引与查询侧分离;嵌入可走本机 Ollama,或任意兼容 OpenAI /v1/embeddings 的端点。

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 的用户。

务必注意:

  1. 只装向量后端或只留 SQLite,不要同时挂载。
  2. 改 embedModel 或切换 provider 后,通常需要重建索引(--force 或删库重跑)。
  3. 首次搜索前索引可能为空,查询侧不会替你建索引。
  4. 嵌入调用产生延迟与费用(若走云端 API),索引全量跑一遍也会耗时。
  5. 安装与运行前阅读仓库源码与 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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜