不只是能跑,是能交给别人维护
大多数 RAG 项目绕不开「改配置 → 跑脚本 → 重启」。这个项目把这些全搬到了网页上。
15 家厂商,选中就自动填
DeepSeek、通义千问、火山方舟、智谱、Kimi、千帆、OpenAI、Claude、Gemini、Ollama… 选中厂商自动填 Base URL 和模型名,点「🔄」还能拉取你账号真正可用的模型列表。
双协议适配
OpenAI 的 /chat/completions 和 Anthropic 的 /messages 都支持,切协议自动更新地址。认证头两种都发,兼容各家网关的实现差异。
结构感知切分
识别【章节】、Markdown 标题、第X章、Q&A 对、Excel 工作表,沿语义边界切分并保留标题上下文。实测检索得分从 0.719 提升到 0.791。
三种向量库
Chroma(本地文件、零部署)、Qdrant(生产级)、Milvus(含零安装 Lite 模式)。同一套接口,页面上切换。
回答策略可选
默认严格 RAG:资料外一律拒答,每句话都能追溯到你的文档。也可以开关允许 AI 用自身知识补充回答。
组件零依赖
单文件原生 JS,免构建免打包,不引入任何第三方库。内置 Markdown 渲染和链接识别,支持文件上传和四语言切换。丢到任何页面都能跑。
断点续传入库
大知识库入库遇到厂商配额限制会自动降批、退避重试。中断后进度保留,再点「入库」从上次位置继续,不重复消耗配额。
跨平台嵌入
网站、微信小程序 web-view、Electron、Tauri、iOS/Android WebView 全覆盖。三种嵌入方式,代码一键复制。
MIT 协议
完全开源免费,可商用、可二次开发、可闭源分发。代码里留了大量「为什么是这个值」的注释,方便你改。
后台登录鉴权
管理后台需要登录,首次启动自动建号(admin / 123456),有效期 7 天。配置类和文档类接口全部受保护,聊天接口与嵌入组件仍对访客公开。改密码会立即让其他设备下线。
四语言 · 离线也判断得对
简中 / 繁中 / 日语 / 英语,后台、组件、独立聊天页都能切。默认语言按浏览器时区判断,不查 IP —— 纯内网、断网部署一样选得对。切换后 AI 回答也跟着换语言。
检测更新,但不擅自改代码
比对当前版本与 GitHub 最新 Release,有新版时按钮上出现红点,展示更新说明和更新命令 —— 只检测,不自动 pull。自动拉取会覆盖你未提交的改动,不适合放在一个按钮后面。
换 Embedding 模型,一键重建向量库
向量集合与建库时的模型终身绑定:维度不同直接报 dimension of 2048, got 1024,维度相同也会让检索静默变成噪声。点「测试并探测维度」发现不兼容时弹确认框,确认后后台自动删集合、重建、把全部文档重新嵌入,进度可见、限流退避、断点续跑。
15 项预设,两家火山产品分开列
选中厂商自动填 Base URL 和默认模型,点 🔄 还能拉取你账号下真正可用的模型列表。
| 厂商 | 协议 | 说明 |
|---|---|---|
| DeepSeek(深度求索) | OpenAI 兼容 | 性价比高 |
| 阿里云 · 通义千问 / 百炼 | OpenAI 兼容 | 共用 DashScope 兼容地址 |
| 火山方舟 · 包月套餐 | 双协议 | /api/plan/v3(OpenAI)与 /api/plan/v1(Anthropic),模型固定填 ark-code-latest |
| 火山方舟 · 豆包(按量付费) | OpenAI 兼容 | /api/v3 |
| 智谱 GLM | OpenAI 兼容 | — |
| Kimi(Moonshot 月之暗面) | OpenAI 兼容 | — |
| 百度千帆(ERNIE) | OpenAI 兼容 | v2 端点 |
| OpenAI | OpenAI 兼容 | 国内访问需代理 |
| Anthropic Claude | Anthropic 原生 | 官方 Messages 协议 |
| 胜算云(模型路由) | OpenAI 兼容 | 一个 Key 聚合多家模型 |
| 优云智算 ⚠ | OpenAI 兼容 | 预填参数未经实测,请自行核实 |
| Google Gemini ⚠ | OpenAI 兼容 | 通过 OpenAI 兼容端点接入 |
| Ollama(本地部署)⚠ | OpenAI 兼容 | localhost:11434,Key 随便填 |
| 自定义 · OpenAI 协议 | OpenAI 兼容 | vLLM / one-api / LiteLLM / 自建网关 |
| 自定义 · Anthropic 协议 | Anthropic 原生 | 任何 Anthropic 兼容层 |
⚠ 标记表示预填地址/模型未经实测核实,页面会显示橙色提示。请对照厂商文档确认,或点 🔄 拉取真实模型列表;其余各项均已实际验证可用。
⚠️ 火山方舟用户:两个计费产品别选错
ARK 有两个计费不同的产品,Base URL 不通用 —— 用错地址会产生额外费用。
| 你的情况 | 选哪项 | Base URL |
|---|---|---|
| 买了 Coding Plan 包月套餐 | 火山方舟 · 包月套餐 | /api/plan/v3(OpenAI)或 /api/plan/v1(Anthropic) |
| 按量付费 | 火山方舟 · 豆包 | /api/v3 |
包月套餐模型名固定填 ark-code-latest,路由到哪个具体模型在火山控制台选。报 401 十有八九是这里选错了。
三种向量库,同一个切换入口
页面上切换,选中哪个就只显示它需要的参数。切换向量库需重启后端并重新入库(向量数据不跨库迁移);只是换 Embedding 模型则不用手动删库,见下面的一键重建。
| 类型 | 说明 | 需要额外服务? |
|---|---|---|
| Chroma(默认) | 本地文件持久化到 ./data/chroma_db |
❌ 开箱即用 |
| Qdrant | Rust 实现,生产级 | ✅ docker compose up -d qdrant |
| Milvus | 企业级;填 .db 路径走 Milvus Lite(零安装),填 http://host:19530 连服务器,也支持 Zilliz Cloud |
视模式而定 |
换了 Embedding 模型?一键重建向量库
向量集合与建库时的 Embedding 模型终身绑定,换模型后旧向量无法继续使用:
维度不同(如 2048 维多模态模型 → 1024 维 text-embedding):新向量写不进去,入库直接报 Collection expecting embedding with dimension of 2048, got 1024。即使把文档全删光也没用 —— 空集合依然锁着旧维度;
维度相同但模型不同:不报错,但两个模型的向量空间互不相通,检索会静默变成噪声。
正确做法:清空集合 + 全部文档重新嵌入,已做成页面上的一键操作
「模型配置」页改好向量模型,点 🔌 测试并探测维度
检测到不兼容时弹确认框:旧模型 → 新模型、两边维度、涉及文档数、预计消耗配额 —— 你确认了才执行
后台流水线执行:探针嵌入(Key 不对在动数据前就失败)→ 删集合并按真实维度重建 → 重置文档行 → 逐篇重新解析/切分/嵌入,进度实时可见
几个设计细节
| 设计点 | 行为 |
|---|---|
| 弹确认框,不全自动 | 只是试模型也会点「测试连接」,全自动可能在你还没决定时给 9000 片段的知识库白烧配额 |
| 限流自动退避 | 429 / 限流 / 超时自动等待重试(60 秒起、最多 4 倍);坏文件、Key 失效这类确定性错误立即失败并列出文件名 |
| 断点续跑 | 每 50 个片段一批;中断或重启后再点重试,已完成的文档和片段不重复嵌入、不重复耗配额 |
| 模型签名 | 配置里记录建库用的 {provider, model, base_url, dim};只轮换 API Key 不触发重建 |
| 空集合维度锁探测 | 直接读现存集合锁定的维度,「文档全删了集合是空的却还报维度错」进页面就能看到提示 |
结构感知切分:检索得分 0.719 → 0.791
默认策略。相比按字数硬切,它沿语义边界切分并保留标题上下文。以 595 字的示例知识库为例:
| 固定窗口 | 结构感知 | |
|---|---|---|
| 片段数 | 2 | 6 |
| 问题 | 四个章节混在一片;另一片从 Q3 中间开始,丢了章节上下文 | 每章节独立成片,标题完整保留 |
| 问「保修期」Top-1 得分 | 0.719 | 0.791 |
能识别的结构:【章节】 · Markdown #~######(含层级)· 第X章 · Q:/A: 问答对 · ## Sheet:(Excel)· ## Page N(PDF)。编号列表如「1. 整机保修期为 12 个月」不会被误判成标题。
在页面上调(RAG 设置 → 文本切分)
- 切分策略 —— 结构感知 / 固定窗口
- 标题前缀开关 —— 长章节被拆时每片带
[技术规格]前缀 - 🔍 预览切分效果 —— 立刻看到片段数、长度分布、章节归属,不用真的入库、不耗 embedding 配额
中文 embedding 即使完全无关也有 0.65 左右的相似度;而 similarity_threshold 必须保持低值(0.5),否则「登录页」这类短查询会什么都检索不到。实测本站知识库:站内问题分数 0.813~0.905,站外问题 0.649~0.711,中间间隔 +0.102,于是用 relevance_threshold = 0.76 区分「检索到了」和「检索到了答案」。
严格 RAG,还是允许自主回答
「RAG 设置 → 回答策略」的开关,默认关闭(严格 RAG)。
| 关闭(默认) | 开启 | |
|---|---|---|
| 知识库有相关内容 | 依据资料回答 | 依据资料回答,资料不足时可补全 |
| 知识库没有相关内容 | 「抱歉,知识库中没有相关信息」 | 用模型自身知识回答 |
| 可追溯性 | ✅ 每句都能追溯到你的文档 | ❌ 用户分不清哪句来自资料 |
| 适用场景 | 价格、政策、承诺等不能出错的场景 | 通用问答、技术咨询 |
实测(问「珠穆朗玛峰的海拔」):关闭时回「抱歉,知识库中没有相关信息」;开启时答出「8848.86 米,2020 年 12 月中尼共同宣布」。开启后站内问题不受影响,知识库有的内容照样优先依据资料回答。