免费开源AI软件.桌面单机版,可移动的AI知识库,察元 AI桌面版:本地离线知识库的第一份 PDF 引用气泡是怎么连回原文的
本地离线知识库的第一份 PDF 引用气泡是怎么连回原文的
第一次拿一份 PDF 丢给察元AI 桌面单机版的人,多半会被一个细节吸引:回答下面跟着一组引用气泡,每一个气泡都能展开成原文段落,告诉你这句话是从文档的哪一页哪一段拼出来的。这件事看着普通,背后整条链路其实做了不少事。这一篇就拆这个。
先讲拖文件这一刻发生了什么。察元AI 的对话窗口接收 PDF 后,会把文件移到 CHAYUAN_ROOT/uploads,并触发一次入库任务。任务做的事情按顺序是:抽文本层、必要时走 OCR、按段落和句子切分成 chunk、给每个 chunk 算一份 bge-m3 嵌入、把 chunk 文本和向量写进本地离线知识库的 sqlite-vec 表,同时把每个 chunk 的页码和段落偏移写到 metadata。所有这些发生在 sidecar 进程内部,不联外网。
切分这一步是整个引用回链能不能用的关键。如果你直接把 PDF 切成几百字的滑动窗口,引用就只能给到一个区间,很难精确回到原段。chayuan-desktop 的默认切分策略会先按页码分块,再在每页内按段落切,最后才在段落内做句子级别的细分。每一段都带上原文页码 page、原段落序号 paragraph、起止字符偏移 offset_start、offset_end。这套 metadata 跟 chunk 一起进 KB。
回答阶段做的事是另一面的对照。用户发问后,察元智库 拿到 ku_ids 解析当前问句要去哪些 KB 检索,调到 retrieval/query 编排器。编排器对当前 PDF 这个 doc:* 类型的源调一次向量召回,再叠一层重排,把前若干个 chunk 喂给当前模型作为上下文。LLM 生成回答时被显式要求引用每一段事实对应的 chunk_id,输出里夹带的是若干个引用占位符。前端拿到流式输出,把占位符替换成可点击的引用气泡。
气泡上展示什么。文件名、页码、几行预览、信任度分数。信任度来自重排得分加召回得分的加权,单机版默认开启了一个轻量重排模型,跑在 CPU 上也不慢。这个分数不是给 LLM 的,是给读者一个判断的依据。点开气泡之后,右侧抽屉打开原文段落,光标停在 offset_start 那个位置,连同上下文一并展示。如果是一份扫描件 PDF,OCR 识别的文本在抽屉里同样可读,并标注了识别的源图位置。
这一整条链路在 chayuan-desktop 上是默认就跑起来的,不需要单独配置。 chayuan-wps WPS AI 插件 也是同一条链路,只不过入口换成了 WPS 文字里的任务窗格,引用气泡的展示也改在 WPS 边栏,点击之后会跳到原文档对应位置或者打开 PDF 阅读器到指定页。
拖一份 PDF 进去之后实际能感受到的差别在哪。第一,模型不会胡编 PDF 里没有的内容,因为引用气泡是强约束,模型只能从被检索到的 chunk 里取材。第二,回答里的事实可以一键回原文,不需要回头翻文档。第三,重排得分让你一眼就看到哪些是关键信息,哪些是顺带提及。第四,整份文档可以反复用,下一次开新对话仍然能复用相同的索引。
需要注意的几个地方。一是同名文件不同版本要小心,建议在文件名里带上版本号或日期,避免回答里把旧版当成新版引用。二是表格密集的 PDF 切分质量会下降,可以考虑把表格部分另存为 Excel 直接当结构化数据接,结合 text2sql 走另外的 KB 类型。三是大型 PDF 比如几百页的标书,第一次入库会有点耗时,建议放到后台跑完再对话,不要一边入库一边问。
引用回原文这个动作在察元AI 桌面单机版上是 RAG 体验里最值得守住的细节。它把模型的回答和文档之间那条线变得可见,本地离线知识库 这件事才有实际意义。
