Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

附录 C:是否需要 LLM

Dr Strange 只在一组特定且有界的功能里调用外部语言模型,其余的一切都不需要任何模型 即可运行:图存储、向量与关键词索引、基于预先算得向量的混合检索、图算法、时间旅行、 变更流、备份,以及经由解析器插件的代码图化(代码仓库只产出解析事实,导入全程不发起 一次模型调用)。

本附录明确界定:究竟哪些功能需要模型支持、如何在不使用任何模型的情况下运行 Dr Strange,以及如何将这些模型功能指向一个本地模型而非托管 API。无论哪种情形,提供方 API 密钥都从服务端环境(或 [llm] 配置节)读取,绝不从请求或工具参数读取。

哪些功能需要 LLM 支持

模型在两种情形下被调用:为文本生成嵌入(把一个字符串变成一个向量),以及 对话(生成结构或计划)。依赖其一或两者的功能:

功能需要原因
为文本相似度查询生成嵌入(SEARCH … NEAR "文本"、语义 plane.find、智能体工具 search、从文本出发的混合向量信号)嵌入提供方查询字符串在检索前于服务端被嵌入
自然语言查询(ask / plane.ask)对话提供方(+ 用于有据工具的嵌入提供方)模型将问题编译为计划,并可选地调用基于嵌入的 find_edge / find_entity 工具
文档导入(digest / AIgest)对话 + 嵌入提供方模型抽取实体与关系,随后清理抽取结果(--mode);实体被嵌入

其余一切都无需模型:

  • 存储与检索你已有的向量。 向量是普通属性;声明一个索引,并以字面量向量 检索它(SEARCH … NEAR $vec)。只有文本查询才需要嵌入。
  • 关键词检索。 BM25 纯为词面。
  • 图查询与遍历。 MATCH、SEARCH … NEAR $vec、plane.query、 plane.neighbors、graph.seed / graph.expand。
  • 图算法。 PageRank、连通分量、最短路径、Louvain。
  • 时间旅行、变更流,以及备份/恢复。
  • 混合检索的关键词信号与图信号,以及给定字面量向量时的向量信号。

简而言之:仅在把文本变成向量、以及驱动 ask 与 digest 时才需要模型。若你以自己的 流水线为数据生成嵌入,并以字面量向量、关键词与图进行查询,则 Dr Strange 无需任何 模型。

在不使用 LLM 的情况下运行 Dr Strange

有两种相互独立的方式在无模型下运行:直接不使用模型功能,以及构建一个将模型代码完全 排除在外的二进制。

不使用模型功能

模型支撑的操作只有真正被调用时,才会去访问对应的提供方。不设置任何提供方密钥、 并避开 ask、digest 与文本嵌入查询,系统其余部分就能完整地运行。用你自己的 流水线为数据生成嵌入、把向量存成属性,再按下面的方式查询:

  • 字面量向量相似度 —— SEARCH (d:Doc) ON embedding NEAR $vec TOPK 10;
  • 关键词 —— 一个 BM25 索引(index keyword …);
  • 图 —— MATCH、遍历,以及各图算法。

一个对外提供服务的实例仍然暴露 ask 与 digest,但没配置提供方密钥时,两者都会 返回明确的错误;其它一切不受影响。

不带模型代码进行构建

命令行工具将模型功能门控在 digest Cargo 特性之后,该特性会引入 LLM crate。不带它 构建,即可得到一个完全没有模型依赖的精简二进制:

$ cargo build --release -p drsg --no-default-features --features native-backend

所得的 drsg 省去了 ask 与 digest 命令,其它命令都保持不变:平面、导入/导出、 查询、索引、混合检索(关键词与字面量向量信号)、算法、快照/恢复,以及 serve。

使用本地 LLM / 模型

模型功能并不要求托管 API。一个提供方要么是一个预设名,要么是一个base URL (base URL 是运维者的设置——CLI 参数与配置文件接受它;发给 drsg serve JSON-RPC API 的 请求只能指定预设,或服务端已配置的那个 URL), 因此任何 OpenAI 兼容的端点都可以提供对话与嵌入,本地端点也不例外。

Ollama

Ollama 在本地暴露一个 OpenAI 兼容的 API。内置的 ollama 预设 指向 http://localhost:11434/v1,无需密钥,默认对话用 llama3.1、嵌入用 nomic-embed-text:

$ ollama pull llama3.1
$ ollama pull nomic-embed-text

$ drsg --db graph.drsg ask "which companies does Ada work for?" \
    --plane social --chat ollama --embed ollama

$ drsg --db graph.drsg digest notes.md --plane social --apply \
    --chat ollama --embed ollama

按需以 --model 与 --embed-model 覆盖模型。

任意 OpenAI 兼容服务

vLLM、LM Studio、llama.cpp 等讲 OpenAI API 的本地推理服务,把它们的 base URL 当作提供方传入即可指定,同时要显式命名模型:

$ drsg --db graph.drsg ask "…" --plane social \
    --chat  http://localhost:8000/v1 --model       my-chat-model \
    --embed http://localhost:8000/v1 --embed-model my-embed-model

如果该端点需要密钥,把它设进环境变量,再用密钥环境变量选项指明变量名即可;不需要 密钥的本地服务则什么都不用配置。

在仪表盘、服务与 MCP 中

所有用到模型的地方,都是同一套提供方。AIgest 页与语义搜索选择器会列出这些预设, 包括 ollama;服务与 MCP 宿主从各自的环境读取提供方密钥(无需密钥的本地服务则不 读取)。对话提供方与嵌入提供方各自独立选择,因此本地对话模型可以搭配本地或托管的 嵌入模型,反过来也一样。