一个问题是怎么被回答的,而任何数据都没有离开你的机器

SecureRAG 是一条跑在单个浏览器标签页里的检索增强生成(RAG)管线。你的文档在内存中被解析、切成片段、转成向量、在本地建立索引,并在你提问时被检索。这一页逐步说明每个环节,以及整个应用唯一会发出的那个网络请求。

最后更新:

把文件拖进来的那一刻发生了什么

四个阶段依次执行,全部在你的设备上完成。每个阶段都是普通的 JavaScript,并且都会上报进度,你能看见时间花在了哪一步。

01

摄取

文件经浏览器 File API 读入 ArrayBuffer。格式识别用的是魔数而不是扩展名,所以改了后缀的文件不会悄悄变成空文本。PDF 的文字层、Word 的标题层级、Markdown 的结构都会被保留下来。

02

规范化与分块

重复的页眉页脚会被剔除,段落内的硬换行会被重新拼接,然后按标题、段落、句子的顺序切分——每块约 700 字符、15% 重叠,保证一个句子不会和它的上下文被硬切开。

03

向量化

每个块由一个小型量化 Transformer 模型在 Web Worker 中转成 384 或 512 维向量。向量做均值池化并 L2 归一化,于是相似度计算就变成了点积。

04

建索引

文本块与向量写入你浏览器配置目录下的 IndexedDB。这意味着刷新页面不会丢失进度,而清除站点数据就能彻底删除,不会在别处留下副本。

检索是怎么挑出关键段落的

你提问时,问题本身会用同一个模型转成向量,索引同时被两条路径搜索。稠密向量检索找出“换个说法但意思相同”的段落;基于 BM25 的关键词检索找出包含完全相同词元的段落——合同编号、型号、定义术语——这类东西单靠向量检索经常漏掉。两份排序用倒数排名融合(RRF)合并,再用最大边际相关(MMR)剔除近重复段落,最后把前六段交给回答环节。

表 1 — 为什么用两种检索而不是一种
方法擅长找到会漏掉
向量检索(嵌入)换说法的内容:问“通知期”能命中“解约需事先书面通知”少见的精确词元,如“§8.2”或内部编号
关键词检索(BM25)精确标识符、数字、定义术语、产品名你没碰巧用到的同义词与表述
组合(RRF 融合)以上两者的并集,分别排序后合并没有白拿的好处——融合可能把两边各一个弱段落推上来
融合为什么在实战中重要: 一个合同问题通常同时包含一个精确标识(“第 8.2 条”“乙方”)和一个换说法的概念(“提前退出”“通知期”)。纯向量检索经常把语义相近但条款不对的段落排在前面;纯关键词检索则完全找不到换说法的那个。

回答是怎么生成的

有两档,由你决定启用哪一档。默认的检索档中,没有任何语言模型参与写作:系统按覆盖率与相似度从检索到的段落里挑出最相关的句子,按原文顺序拼接,每句都保留指回来源的编号引用。可选的生成档会下载一个小型指令微调模型(0.5B–1.5B 参数)在本地运行,用同样的检索段落写出通顺回答。无论哪一档,引用都在文本到达你眼前之前就已挂好——我们不会让模型自己产出引用,因为模型会编造引用。

严格度由你决定。 在「仅依据文档」模式下,如果语料里没有任何段落越过相似度阈值,回答就是“文档中未找到”,而不是一个看起来合理的猜测。在「允许推理」模式下,助手可以跨多个段落归纳,但每句没有直接来源支撑的话都会被标注为推断。

到底有什么会离开你的设备

一个请求,只在首次使用时发出,此外什么都没有。下表的内容与站内「网络盾牌」面板实时显示的完全一致。

表 2 — 应用发出的全部外发请求
请求目标载荷首次使用之后
模型权重(GET)公开模型托管站(HuggingFace 或镜像)只有模型文件名——不含文档、不含问题、不含任何标识没有请求;由浏览器缓存提供,可离线工作
文档解析哪儿都没有不适用任何请求都没有
向量化与检索哪儿都没有不适用任何请求都没有
回答生成哪儿都没有不适用任何请求都没有
动手验证: 打开开发者工具 → Network,清空日志,添加一份文档并连问三个问题。你只会看到那一次模型请求。然后把 DevTools 切到 Offline 继续提问——它照常工作。

这套方案会在哪里出错

我们更愿意把失败情形列清楚,而不是假装它们不存在。每一种都会在界面上明确提示,而不会藏在一句自信的话后面。

  • 没有文字层的扫描件 PDF 完全抽不出文本。SecureRAG 会检测到并告诉你,而不是返回一个空回答。
  • 长文档可能在分块边界处被切开,导致一个定义和它的例外条款被分开。提高重叠比例、或切换到生成档都能缓解;《提升检索准确率》那篇指南里有详细做法。
  • 本地小模型的文笔不如云端前沿模型。这就是你付出的代价,对比页里写得很直白。
  • 移动浏览器的内存限制更严。手机上文档数量上限会自动调低,工具会明确告诉你,而不是在建立索引到一半时崩掉。

五分钟内自己验一遍

  1. 打开工具页,并另开一个窗口打开开发者工具的 Network 面板。
  2. 添加两份你手边的文件——一份 PDF、一份 Word。看着索引进度走,同时注意没有任何请求发出。
  3. 问一个你已知答案的问题。点一下引用编号,确认它跳到了正确的段落。
  4. 把严格度设为「仅依据文档」,再问一个文档里根本答不出的问题。确认你得到的是“未找到”而不是编出来的答案。
  5. 把 DevTools 切到 Offline,重复第 3 步。然后清除站点数据,确认文档库已空。