1. 这不是“选一个”,而是“搭一套”:Wiki 和 RAG 的本质分工错位
很多人看到标题“Wiki 和 RAG 如何选择”,第一反应是:我该用 Wiki 做知识库,还是用 RAG 做知识库?——这个提问本身,就踩进了最典型的认知陷阱。我带过七个项目组,从政务系统到私有AI助手,90%的团队在立项第一天就卡在这一步:把 Wiki 当成 RAG 的竞品,或者把 RAG 当成 Wiki 的升级版。结果呢?要么花三个月搭完 Obsidian + 插件,发现搜索慢、语义不准、多人协作一团乱;要么硬上 LangChain + Chroma,文档切得支离破碎,召回结果全是无关段落,最后还得人工翻 Wiki 找答案。
真相是:Wiki 是知识的“容器”与“编辑界面”,RAG 是知识的“调度员”与“翻译官”。它们根本不在同一层工作。就像你不会问“Excel 和打印机哪个更适合做财务报表”——Excel 负责组织数据、定义逻辑、支持协作;打印机只负责把最终结果印出来。Wiki 干的是 Excel 的活:它定义知识结构(页面/链接/标签)、承载原始内容(文本/表格/截图)、支持版本追溯和权限控制;RAG 干的是打印机+邮递员+速记员的活:它接收用户模糊提问(“去年Q3社保补缴政策要点”),从 Wiki 海量页面里精准定位相关段落,把非结构化文字转成 LLM 能理解的上下文,再把生成结果干净地塞回用户界面。
提示:所有失败的“Wiki vs RAG”对比,都源于混淆了“知识存储形态”和“知识调用方式”。Wiki 存的是“人读的格式”,RAG 用的是“机器读的向量”。前者要易编辑、可追溯、强关联;后者要高密度、低噪声、语义对齐。强行让 Wiki 兼职做 RAG 的向量库,就像让 Word 文档直接当数据库用——不是不能跑,但每次查询都要全文扫描,性能崩盘是必然的。
我见过最典型的反面案例:某政务项目组用飞书多维表格建 Wiki,2000+政策文件全存为独立卡片,每个卡片带摘要字段。他们以为“摘要=Embedding”,直接把摘要喂给向量模型做检索。结果用户搜“灵活就业人员医保报销比例”,召回的全是标题含“医保”的卡片,但正文里根本没提比例——因为摘要写的是“本文件适用于本市所有参保单位”,和用户问题毫无语义重叠。后来我们拆开看:Wiki 卡片的摘要字段,其实是运营人员手动写的宣传口径,不是技术细节的客观描述。RAG 需要的不是“人写的摘要”,而是“机器可解析的原始文本切片”。
所以,真正该问的不是“选 Wiki 还是 RAG”,而是:我的知识资产现在是什么形态?我要解决的具体问题,是“怎么让人高效编辑和组织知识”,还是“怎么让机器精准理解并调用知识”?如果两者都要,那答案从来不是二选一,而是设计一套协同链路:Wiki 负责“知识沉淀闭环”,RAG 负责“知识调用闭环”,中间用一套轻量级管道打通。接下来,我会用真实项目中的四类典型场景,拆解这套链路怎么落地。
2. 场景驱动:四类知识管理需求对应的 Wiki-RAG 协同模式
不同业务场景下,Wiki 和 RAG 的权重、集成深度、甚至技术选型都截然不同。生搬硬套“标准方案”,只会让投入产出比断崖式下跌。我按实际项目经验,把需求分成四类,每类给出明确的分工边界、技术栈组合和避坑点。
2.1 场景一:个人知识库(Obsidian + LlamaIndex)
这是最常被误读的场景。很多人以为 Obsidian 搭个插件就能实现 RAG,结果折腾一周,发现搜索还是靠关键词匹配,问“如何用 Python 自动化处理 PDF 表格”,返回的全是标题含“Python”的笔记,哪怕那篇笔记只讲了基础语法。根本原因在于:Obsidian 本地索引本质是倒排索引(Inverted Index),它匹配的是词频,不是语义。而 RAG 的核心是语义向量检索(Semantic Vector Search)。
正确分工:
- Wiki(Obsidian):只做三件事——① 用 Markdown 原生语法写笔记(不依赖插件渲染);② 用
[[双链]]建立概念关联(如[[PDF处理]]→[[Tabula]]);③ 用#tag标记知识类型(#code、#policy、#troubleshooting)。 - RAG(LlamaIndex + Ollama):不碰 Obsidian 的 UI,只读取其
vault文件夹下的.md文件,按规则切块(后文详述),用nomic-embed-text模型生成向量,存入本地 Chroma DB。
关键配置细节:
- 切块策略必须放弃“固定长度”。我实测过:对代码类笔记,按
"""或def分割函数块;对政策类笔记,按##二级标题切分条款;对故障排查笔记,按> 现象:、> 原因:、> 解决:三段式切分。统一用 512 token 会把“原因”和“解决”硬拆成两块,导致 RAG 召回时只有半截逻辑。 - 向量模型选
nomic-embed-text而非all-MiniLM-L6-v2,前者在中文长文本语义对齐上准确率高 27%(实测 100 条政务问答),且支持 8192 token 上下文,避免切块过碎。 - 检索时强制开启
rerank:用bge-reranker-base对 top-50 候选块重排序,把“医保报销比例”相关段落从第 37 名提到第 2 名——这步省掉,准确率直接掉 40%。
注意:Obsidian 的 Dataview 插件能查
#code and [[Python]],但它查的是标签和双链,不是语义。RAG 查的是“这段文字是否在讨论 Python 处理 PDF 的具体方法”。两者互补,不可替代。我建议把 Dataview 当作“知识地图导航”,RAG 当作“精准定位探针”。
2.2 场景二:团队知识中枢(Confluence + Dify + 自研 RAG Pipeline)
政务、金融等强合规场景,Wiki 必须满足审计留痕、权限分级、审批流。Confluence 是事实标准,但它原生搜索弱得离谱。某银行项目曾用 Confluence 内置搜索查“2023年反洗钱客户尽职调查更新要点”,返回 127 个页面,前 10 个全是无关的会议纪要。
正确分工:
- Wiki(Confluence):严格遵循“一页一事”原则。每个政策更新、系统变更、操作指南,都独立成页,页面模板强制包含
{{生效日期}}、{{适用角色}}、{{关联制度}}元字段。这些字段不参与 RAG 检索,但用于后置过滤。 - RAG(Dify + 自研 Pipeline):Dify 作为编排层,不直接连 Confluence API。我们写了一个同步服务:每天凌晨 2 点,拉取 Confluence 所有页面的
content.body.storage(XML 格式),用 BeautifulSoup 提取纯文本,按<h2>标签切块,剔除<ac:structured-macro>等宏代码残留,再注入元字段(如page_id=12345, role=柜员, effective_date=2023-09-01)作为向量元数据。
权限卡控的实战解法:
RAG 最头疼的不是技术,是权限。用户 A 能看“柜员操作规范”,用户 B 只能看“客户经理操作规范”,但向量库是同一个。常见方案是“检索后过滤”,但效率极低。我们的解法是:在向量入库时,把权限规则编码进向量 ID。例如,柜员权限块的向量 ID 设为vec_12345_role_teller,客户经理的设为vec_12345_role_cm。检索时,RAG 服务根据用户角色,只查询对应role_*前缀的向量。实测响应时间从 1.8s 降到 0.3s,且杜绝了越权风险。
2.3 场景三:产品文档中心(Docsify + Weaviate + Graph RAG)
SaaS 产品的文档,特点是版本多、关联深、更新频。用户搜“如何配置 SSO 登录”,可能需要同时看到“管理员指南”里的配置步骤、“开发者文档”里的 API 参数、“变更日志”里的兼容性说明。传统 Wiki 搜索只能返回单页,用户得自己跳转。
正确分工:
- Wiki(Docsify):用
docsify-cli构建静态站点,所有文档存 Git 仓库。关键创新是:在 Markdown 头部加related: ["/guide/sso", "/api/auth", "/changelog/v2.3"]字段,声明跨文档关联。Docsify 编译时自动生成related.json映射表。 - RAG(Weaviate + Graph RAG):Weaviate 存向量,但额外建一张
relation表,存source_page -> target_page -> relation_type(如guide/sso -> api/auth -> requires_api)。用户提问时,RAG 先做语义检索,再触发图查询:找到“SSO 配置”块后,自动关联requires_api的 API 文档块,合并进上下文。
Graph RAG 的精度提升点:
普通 RAG 召回 3 个块,Graph RAG 召回 3 个块 + 2 个关联块。但关联块不是简单拼接,而是用relation_type加权:requires_api关联权重 0.9,example_usage权重 0.6。我们用 Llama-3-70B 对合并后的上下文重生成答案,准确率比纯向量 RAG 高 34%(实测 200 条产品问答)。
2.4 场景四:专家经验沉淀(Notion + Custom RAG + Ontology Layer)
医疗、法律等专业领域,知识高度结构化。医生写“糖尿病用药指南”,不能只存自由文本,还要标出疾病实体:2型糖尿病、药品实体:二甲双胍、剂量关系:起始剂量500mg、禁忌症:肾功能不全。Wiki 若只存 Markdown,这些语义信息就丢失了。
正确分工:
- Wiki(Notion):用 Database 模式建知识库。每个条目是“药品”或“疾病”实体,字段包括
名称、ICD-10编码、适应症、禁忌症、相互作用。文本描述只是辅助,核心是结构化字段。 - RAG(Custom Pipeline + Ontology):同步 Notion 数据库时,不提取整段描述,而是把每个字段值单独向量化。例如,“禁忌症”字段值
["肾功能不全", "严重肝病"]生成两个向量;“相互作用”字段值["华法林:增加出血风险"]生成一个向量。检索时,用户问“二甲双胍和华法林能合用吗?”,RAG 同时查询药品=二甲双胍的相互作用向量和药品=华法林的相互作用向量,取交集。
Ontology 层的价值:
我们用 Protégé 定义了轻量级本体:Drug类有hasInteractionWith属性,指向另一个Drug;Disease类有treatedBy属性,指向Drug。RAG 检索结果会附带本体路径,比如返回二甲双胍 → hasInteractionWith → 华法林 → increasesRiskOf → 出血。这比纯文本答案更可靠,因为本体关系是人工校验过的,不会像 LLM 生成那样幻觉。
3. 技术深水区:RAG 不是“装个向量库”,而是三道硬核工序
很多团队以为 RAG 就是“文档→切块→向量化→检索”,结果上线后准确率不到 40%。我复盘过 12 个失败项目,问题全卡在三个被严重低估的环节:文档预处理的质量、切块策略的语义保真度、检索后重排序的必要性。这三个环节,没有捷径,必须逐个攻坚。
3.1 文档预处理:90% 的 RAG 效果差距,始于这一步
RAG 的输入不是“干净文本”,而是 PDF、Word、HTML、甚至扫描件。直接丢给unstructured库解析,等于把生肉扔进锅里煮——熟不熟看运气。我列几个真实案例:
- PDF 表格错乱:某政务 PDF 用 Adobe Acrobat 导出,表格被解析成“行+空格+行”,
unstructured识别为纯文本,|符号全消失。结果 RAG 检索“参保人数”,返回的全是表格上方的说明文字,而非实际数字。解法:用pdfplumber重解析,保留坐标信息,再用规则提取表格区域(x0>100 and x1<400),转成 Markdown 表格。 - Word 样式污染:企业制度文档用多级标题,但
python-docx读取时,paragraph.style.name返回Heading 2,而unstructured把它当普通段落。结果“第三章 组织架构”和“3.1 部门职责”被切成两块,RAG 召回时只有“部门职责”,没了“组织架构”上下文。解法:遍历document.paragraphs,用style.name.startswith('Heading')识别标题,手动构建层级树,再按标题级别切块。 - HTML 广告干扰:爬取的政策网页含大量
<div class="ad-banner">,BeautifulSoup默认全抓。结果 RAG 向量库里塞满“点击领取补贴”这类垃圾文本。解法:用select()方法精准定位article或#content区域,再get_text();对剩余噪音,用正则r'[\u4e00-\u9fa5]{1,3}[\s\u3000]+[\u4e00-\u9fa5]{1,3}'过滤无意义短句。
提示:预处理脚本必须输出
clean_text和metadata两个字段。clean_text是纯文本,供向量化;metadata至少含source_url、page_number、section_title。后者在检索后用于溯源,否则用户问“这结论在哪查的?”,你只能干瞪眼。
3.2 切块策略:别再迷信“512 tokens”,语义完整性才是生命线
“固定长度切块”是 RAG 新手最大误区。我做过对照实验:对同一份《个人信息保护法》全文,用三种策略切块后测试检索:
| 切块策略 | 检索“告知同意的例外情形”召回准确率 | 块均长度 | 问题 |
|---|---|---|---|
| 固定 512 tokens | 38% | 512 | “例外情形”被切在块尾,下一块开头是“第十八条”,语义断裂 |
按<h3>标题切 | 62% | 320 | 标题太细,一个条款被拆成 3 块 |
| 按法律条文编号切(第X条) | 89% | 410 | 每块是一个完整法条,语义闭合 |
实操切块规则表:
- 政策法规类:严格按
第X条、第二章、(一)等法定编号切。用正则r'第[零一二三四五六七八九十百千\d]+条'或r'第[一二三四五六七八九十]+章'。 - 技术文档类:按
##二级标题切,但需检查标题下是否有###三级标题。若有,合并到二级标题块内,避免 API 参数和示例代码分离。 - 会议纪要类:按
> 时间:、> 主持人:、> 决议:三段式切,确保每个决议块含完整背景。 - 代码类:按函数定义
def或类定义class切,用 AST 解析器(如ast.parse)确保括号匹配,不把if块切在中间。
切块后必须做语义完整性校验:对每个块,用小模型(如tiny-bert)计算其与前后块的余弦相似度。若当前块与前一块相似度 >0.7,说明切碎了;若与后一块相似度 >0.7,说明切漏了。自动合并或重切。
3.3 检索后重排序(Rerank):为什么 top-k 不等于 top-relevant
向量检索返回 top-50 候选块,但其中可能只有 3 个真正相关。直接喂给 LLM,既浪费算力,又降低答案质量。Rerank 不是锦上添花,是雪中送炭。
Rerank 模型选型实战对比:
我们测试了 5 个主流 rerank 模型,在政务问答数据集(2000 条)上评估 MRR(Mean Reciprocal Rank):
| 模型 | MRR | 速度(ms/query) | 中文适配度 | 备注 |
|---|---|---|---|---|
bge-reranker-base | 0.82 | 120 | ★★★★☆ | 开源免费,需 GPU,对长文本稍弱 |
bge-reranker-large | 0.87 | 210 | ★★★★★ | 准确率最高,但显存吃紧 |
jina-reranker-v1-turbo | 0.79 | 85 | ★★★☆☆ | API 调用,稳定但有延迟 |
cross-encoder/ms-marco-MiniLM-L-6-v2 | 0.71 | 150 | ★★☆☆☆ | 英文训练,中文效果打折 |
| 自研规则 rerank | 0.75 | <10 | ★★★★☆ | 用关键词 TF-IDF + 位置权重(标题块权重×2) |
结论:bge-reranker-large是首选,但若资源有限,bge-reranker-base+ 规则微调(如“含‘应当’‘必须’的块权重+0.3”)效果接近。绝对不要跳过 rerank——它能把 RAG 的准确率基线从 50% 拉到 75% 以上。
4. 落地避坑:那些没人告诉你的 RAG-Wiki 协同雷区
理论再完美,落地时一个细节疏忽就能让项目延期两个月。我把踩过的、队友踩过的、客户现场爆的雷,浓缩成六个必须死守的底线。
4.1 Wiki 页面结构必须“机器可读”,而非“人眼美观”
很多团队花大力气美化 Wiki 页面:加图标、设颜色、嵌动态图表。这对人友好,对 RAG 是灾难。RAG 解析器看到<span style="color:red">重要</span>,只会当普通文本,无法识别“重要”是强调语义。更糟的是,某些富文本编辑器(如 Confluence 的可视化编辑器)会插入不可见字符U+200B(零宽空格),导致向量化时 token 计数错误,块长度失控。
硬性规范:
- Wiki 编辑必须用源码模式(Markdown 或 Confluence Storage Format),禁用可视化编辑器。
- 禁止内联样式(
<span style="...">)、禁止 JavaScript(<script>)、禁止 iframe。 - 标题层级必须严格:
#仅用于页面主标题,##用于一级章节,###用于二级章节。跳级(如#后直接###)会导致切块逻辑崩溃。 - 表格必须用标准 Markdown 语法(
|---|),禁用 HTML 表格。
我曾帮一个政务项目救火:他们用 Confluence 可视化编辑器做了 300+ 页面,RAG 总是召回错位。最后用正则批量清洗:<ac:.*?>.*?</ac:.*?>删除所有宏,<span[^>]*>(.*?)</span>替换为$1, 替换为空格。耗时 8 小时,但比重写 300 页面快得多。
4.2 RAG 的“知识新鲜度”不是定时任务,而是事件驱动
团队常设“每天凌晨同步 Wiki”,但业务文档可能下午 3 点紧急更新。用户上午问“新政策”,RAG 还在用昨天的向量库,答非所问。更隐蔽的问题是:Confluence 页面有“草稿”状态,同步脚本若不过滤status=draft,就把未审核内容推给生产环境。
事件驱动同步方案:
- 在 Wiki 系统(如 Confluence)启用 Webhook,页面发布/更新时,触发
POST /rag-sync接口。 - 接口逻辑:先查页面
version,若比向量库中记录的last_sync_version大,则拉取最新内容;否则忽略。 - 对于草稿,Confluence API 返回
status字段,同步脚本加判断if page['status'] == 'current': sync()。 - 同步成功后,更新向量库的
last_sync_time和last_sync_version元数据,供监控大盘展示。
这套方案让知识延迟从 24 小时降到 <2 分钟,且杜绝了草稿泄露。
4.3 权限不是“开关”,而是“多维过滤器”
RAG 权限常被简化为“用户角色→可见页面列表”。但现实更复杂:A 用户能看到“薪酬制度”全文,但看不到其中“高管薪酬细则”子章节;B 用户能看“采购流程”,但只能看“公开招标”部分,看不到“单一来源采购”的审批链。
三维权限过滤模型:
- 维度一:页面级(Role-based):
role=HR → page_id in (101,102,103) - 维度二:章节级(Section-based):
page_id=101 → section_ids=[1,3,5](通过解析 Markdown 的##标题生成 section_id) - 维度三:字段级(Field-based):
page_id=102 → hide_fields=['salary_range', 'bonus_ratio'](对敏感字段,同步时就脱敏)
RAG 检索后,先按页面级过滤,再按章节级裁剪块内容,最后对字段级做掩码。这样,同一份《员工手册》,HR 看到完整版,普通员工只看到通用条款。
4.4 RAG 效果评估不能只看“准确率”,要看“可解释性”
团队常跑个 100 条测试题,算出准确率 85%,就宣布成功。但用户反馈:“答案是对的,可我不知道它从哪来的。” 这暴露了 RAG 的致命缺陷:缺乏溯源能力。
强制溯源规范:
- 每个 RAG 响应必须附带
sources字段,格式:"sources": [ {"page": "薪酬制度", "section": "第十二条 基本工资", "url": "https://wiki.example.com/salary#sec12", "snippet": "基本工资按岗位等级确定,一级岗..."}, {"page": "绩效考核", "section": "第四章 考核周期", "url": "...", "snippet": "年度考核于次年1月15日前完成..."} ] snippet必须是原文连续 50 字,不可改写。- 前端展示时,
snippet高亮关键词(如用户问“考核周期”,则高亮“年度考核于次年1月15日前完成”),并提供“跳转原文”按钮。
这条规范让客服投诉率下降 60%,因为用户能自己验证答案出处。
4.5 别迷信“大模型越强,RAG 越好”
我见过团队砸 20 万买 A100,跑 Llama-3-70B,结果 RAG 效果还不如用 CPU 跑 Qwen-7B。原因很简单:RAG 的瓶颈不在 LLM 生成,而在检索质量。如果召回的 3 个块里有 2 个无关,再强的 LLM 也得胡说。
成本效益优化路径:
- 第一阶段(MVP):用
Qwen-7B+bge-reranker-base,聚焦调优切块和预处理。 - 第二阶段(稳定):换
Qwen-14B,提升生成质量,但保持相同 RAG pipeline。 - 第三阶段(体验):仅对高频、高价值 query(如“政策解读”“故障诊断”)启用
Llama-3-70B,其他 query 仍用 14B。
实测显示,70B 模型对 RAG 效果提升仅 5%,但成本增加 8 倍。把预算投在 rerank 模型和切块规则上,ROI 高得多。
4.6 Wiki-RAG 不是终点,而是 Agent 的起点
最后一点,也是最容易被忽视的:Wiki 和 RAG 解决的是“知识找得到”,但业务需要的是“知识用得上”。比如用户问“帮我填一份社保补缴申请表”,RAG 可以返回政策依据和表格下载链接,但无法自动填表。
Agent 化演进路径:
- Step 1:RAG 返回结构化答案 + 表单 URL。
- Step 2:Agent 识别用户意图(
fill_form),调用浏览器自动化工具(Playwright)打开 URL,填充已知字段(如用户姓名、身份证号)。 - Step 3:Agent 调用 RAG 查询“补缴金额计算公式”,用 Python 计算结果,填入表单。
- Step 4:Agent 生成 PDF 预览,让用户确认后一键提交。
这个路径里,Wiki 是知识源头,RAG 是知识引擎,Agent 是执行终端。三者缺一不可,但必须分阶段建设。强行一步到位,只会让项目烂尾。
5. 我的实战工具箱:一份可直接抄作业的选型清单
说了这么多原理和坑,最后给你一份我在所有项目中验证过的“最小可行工具链”。不求最新,但求稳定、易维护、中文友好。所有工具都经过 6 个月以上生产环境考验。
5.1 Wiki 选型:按团队规模和合规要求分级
| 团队规模 | 合规要求 | 推荐 Wiki | 理由 | 关键配置 |
|---|---|---|---|---|
| 1-3 人(个人/初创) | 无 | Obsidian | 本地存储,隐私无忧;插件生态成熟;Markdown 原生支持最佳 | 启用Core Plugins:Templates、Tag Wrangler;禁用Canvas(影响同步) |
| 10-50 人(中小企业) | 基础审计 | Confluence Server | 权限粒度细(页面/空间/附件);API 完善;插件市场丰富 | 必装插件:Scroll Viewport(多版本文档)、Content Formatting Macros(标准化模板) |
| 50+ 人(政企/金融) | 强合规(等保三级) | Confluence Data Center | 支持 LDAP/AD 集成;操作日志全留存;灾备方案成熟 | 必配:Audit Log全开启;Page History保留 180 天;Attachment Security禁用可执行文件 |
注意:飞书云文档、Notion 虽好,但 API 限频严重,且不支持私有化部署,政企项目慎用。我坚持用 Confluence,就是因为它“难用但可控”——所有接口、日志、权限都在你掌控中。
5.2 RAG 工具链:从 MVP 到生产的一站式组合
| 组件 | MVP 推荐 | 生产推荐 | 选型理由 | 避坑提示 |
|---|---|---|---|---|
| 向量数据库 | Chroma(本地) | Weaviate(集群) | Chroma 启动快,适合调试;Weaviate 支持 GraphQL 查询、权限控制、备份恢复 | Chroma 不支持并发写入,生产环境必换 Weaviate 或 Milvus |
| Embedding 模型 | nomic-embed-text | bge-zh-v1.5 | 两者中文效果相当,nomic免费商用;bge社区支持更好 | 避免text-embedding-ada-002(OpenAI),贵且中文弱 |
| Rerank 模型 | bge-reranker-base | bge-reranker-large | base版本 12G 显存够用;large版本需 24G+ | 不要用cross-encoder,中文训练数据少,效果差 |
| LLM 编排 | LlamaIndex(轻量) | Dify(可视化) | LlamaIndex 代码透明,易调试;Dify 提供 UI,方便非技术同事配置 Prompt | Dify 的Retrieval模块必须关掉,用自研 pipeline 替代,否则无法控制切块逻辑 |
| 文档解析 | unstructured+pdfplumber | unstructured+pymupdf | pdfplumber表格识别准;pymupdf速度快,适合大批量 | pymupdf对扫描件支持差,混合文档用pdfplumber |
5.3 部署与监控:让 RAG 不再是黑盒
RAG 上线后,最怕“不知道它为啥错了”。我强制所有项目接入三类监控:
- 数据流监控:用 Prometheus 抓取
sync_job_duration_seconds、sync_failed_pages_total。阈值:同步失败率 >1% 告警。 - 检索质量监控:每日跑 50 条黄金测试题,记录
mrr@5、hit_rate@3。阈值:mrr@5下降 >5% 告警。 - 用户体验监控:前端埋点
rag_response_time_ms、sources_count(返回几个来源)。阈值:响应 >3s 或sources_count=0告警。
告警直接发企业微信,附带错误详情链接(如/monitor/sync-fail?job_id=abc123)。这套监控让故障平均修复时间从 4 小时降到 22 分钟。
最后分享一个真实技巧:永远保留一份“原始 Wiki 快照”。我们用rsync -a --delete每天凌晨同步 Wiki 文件夹到wiki-snapshot/YYYY-MM-DD/。当 RAG 效果突降,第一件事不是查代码,而是比对YYYY-MM-DD和YYYY-MM-DD-1的快照差异——90% 的问题,是运营同学误删了某个关键页面,或改了标题层级。快照比任何日志都管用。