From 23a08b1c3248f459f6e59381e0ce4e6b560111de Mon Sep 17 00:00:00 2001 From: sanbuphy Date: Fri, 27 Mar 2026 14:36:44 +0800 Subject: [PATCH] docs: update langgraph-advanced-rag and add llamaindex-enterprise-knowledge-base --- .../3.a2-langgraph-advanced-rag/index.md | 356 ++++++++++++++++- .../index.md | 367 ++++++++++++++++++ 2 files changed, 721 insertions(+), 2 deletions(-) create mode 100644 docs/zh-cn/stage-3/ai-advanced/3.a3-llamaindex-enterprise-knowledge-base/index.md diff --git a/docs/zh-cn/stage-3/ai-advanced/3.a2-langgraph-advanced-rag/index.md b/docs/zh-cn/stage-3/ai-advanced/3.a2-langgraph-advanced-rag/index.md index 088afad..4daec78 100644 --- a/docs/zh-cn/stage-3/ai-advanced/3.a2-langgraph-advanced-rag/index.md +++ b/docs/zh-cn/stage-3/ai-advanced/3.a2-langgraph-advanced-rag/index.md @@ -1,3 +1,355 @@ -# 中高级 RAG 与工作流编排 - 以 LangGraph 为例 +# 企业级客服 Agent 实战:用 LangGraph 搭建可升级、可审计的客服系统 -> 本章节正在编写中,敬请期待... +如果你已经做过知识库问答,下一步最值得学习的,不是再堆更多提示词,而是开始理解:一个真正进入企业客服流程的 Agent,到底应该怎样设计。 + +这一章只做一件事:用 LangGraph 的思路,拆解一个商业级智能客服系统。重点不是代码细节,而是业务 sense、异常处理、人工升级、数据设计和上线边界。 + +# 快速开始 + +如果你现在就想开始,可以先想象这样一个场景: + +用户晚上 10 点发来一句话:“我明明付了钱,为什么课程还是打不开?” 这时候,一个真正能上线的客服 Agent,不是立刻编个答案,而是先判断这是不是权限问题、需不需要补订单号、要不要查支付系统、有没有必要直接转人工。 + +如果你只能记住一句话,那就是: + +> 企业级客服 Agent 的目标不是“多回答一点”,而是“在该自动时自动,在不确定时补问,在高风险时转人工”。 + +# 1. 业务侧:先决定这个客服系统要做什么 + +企业里的客服 Agent,不是先从“模型很强,能不能做点什么”开始设计的,而是先从“业务到底希望它承担什么工作”开始设计的。 + +最常见的判断方式,是先看下面这些问题: + +1. 哪些问题出现频率最高? +2. 哪些问题规则明确、最适合自动化? +3. 哪些问题风险太高,不能自动做决定? +4. 哪些问题必须接业务系统,不能只靠知识库? + +如果这些问题没想清楚,后面无论你用 LangGraph、Dify,还是别的 Agent runtime,系统都很容易做成“演示时很聪明,真实业务里不敢放出去”的样子。 + +## 1.1 先把客服当成业务流程,而不是聊天机器人 + +LangGraph 适合客服,不是因为它“更会聊天”,而是因为客服本身就是状态流转问题。 + +比如用户说: + +> “我昨天买的课程还是打不开,能帮我看一下吗?” + +一个成熟客服系统不会立刻回答,而是会先判断: + +1. 这属于支付、权限、退款还是账号问题? +2. 订单号、账号、时间是否齐全? +3. 该查知识库,还是该查业务系统? +4. 是普通请求,还是高风险投诉? +5. 这件事该自动处理,还是该升级给人工? + +下面是一张最小但足够真实的客服流程图: + +```mermaid +flowchart TD + A["用户发来问题"] --> B["识别问题类型"] + B --> C["抽取关键字段"] + C --> D{"信息是否完整"} + D -- 否 --> E["追问用户补充信息"] + E --> C + D -- 是 --> F{"查知识库还是查业务系统"} + F -- 知识规则 --> G["检索 FAQ / SOP / 退款规则"] + F -- 实时状态 --> H["查询订单 / 权限 / 支付系统"] + G --> I["生成客服回复"] + H --> I + I --> J{"是否高风险 / 是否要求人工"} + J -- 是 --> K["转人工并附带上下文"] + J -- 否 --> L["直接回复用户"] +``` + +这张图里最重要的不是节点名字,而是它表达的企业逻辑: + +1. 信息不完整时先停下来 +2. 文档问题和实时数据问题分开处理 +3. 高风险问题不要硬答 + +## 1.2 用一个真实业务场景把系统搭起来 + +为了让这一章更像企业方案,而不是抽象框架介绍,我们用一个在线教育平台客服来举例。这个 Agent 主要处理四类问题: + +1. 课程打不开、会员没开通 +2. 订单支付成功但页面状态异常 +3. 退款规则解释与退款进度查询 +4. 投诉、重复扣费、人工请求 + +对应的真实用户输入可能是: + +- “我昨天付了钱,但是课程还是锁着的。” +- “为什么我登录后还是看不了高级章节?” +- “订单扣款了,但是页面没显示成功。” +- “我这个订单现在能不能退款?” +- “我要找人工,你们这个机器人一直没解决。” + +这些输入都不结构化,所以企业客服系统的第一原则不是“尽快回答”,而是“先把任务理解清楚”。 + +你可以先用一个 prompt,把第一步的业务判断做出来: + +```text +你是企业客服系统里的“问题分流与补信息助手”。 + +你的任务不是直接解决所有问题,而是先做这几件事: +1. 判断用户问题属于哪一类:FAQ、订单/权限查询、退款/投诉、高风险人工升级。 +2. 抽取关键字段:账号、订单号、时间、商品名、渠道。 +3. 如果字段不足,不要猜测,不要直接给结论,而是生成一句最短、最自然的追问。 +4. 如果用户明确要求人工,或者出现重复扣费、投诉、法务、隐私、情绪激烈表达,直接标记为高风险升级。 + +输出格式: +- 问题类型: +- 关键信息: +- 是否缺信息: +- 下一步动作: +- 给用户的话: +``` + +这类 prompt 最大的价值,不是为了“让模型显得聪明”,而是为了让系统第一步就有业务边界。 + +## 1.3 商业级客服真正关心的,不只是回复,而是路由 + +如果你去看 Zendesk、Intercom、Salesforce 这一类商业客服方案,会发现它们几乎都在做同一件事:先把请求按业务价值和风险等级分开。 + +一个更接近企业实践的分层,通常是这样的: + +### 高并发、低风险、自助可闭环 + +这类问题最适合优先自动化,因为频率高、规则清楚、ROI 直接。 + +例如: + +1. 密码重置 +2. 课程 / 会员 / 权限是否已开通 +3. 订单是否支付成功 +4. 发票、下载、登录入口 +5. 基础退款规则解释 + +### 需要补信息才能继续的问题 + +很多用户不会一次把信息说全,所以系统要学会先追问。 + +例如: + +- “我付款了但课程还是打不开。” +- “帮我看一下这个订单是不是有问题。” +- “为什么我的会员还没到账?” + +这类问题最常见的 badcase,就是系统直接猜。 + +### 需要系统查询的半自动问题 + +这类问题不能只看知识库,因为真正答案在业务系统里。 + +例如: + +1. 订单有没有支付成功 +2. 退款是否进入财务流程 +3. 用户是不是 VIP +4. 某个课程权限是否真的开通 + +### 必须升级到人工或专门队列的问题 + +这才是企业级系统的分水岭。 + +典型高风险问题包括: + +1. 重复扣费 +2. 投诉与激烈情绪 +3. 法务、隐私、合规请求 +4. 盗刷、封号、欺诈 +5. 高价值客户负面请求 + +下面是一张更接近商业客服方案的升级路由图: + +```mermaid +flowchart TD + A["识别到用户请求"] --> B{"是否命中高风险条件"} + B -- 是 --> C["立即升级人工/专门队列"] + B -- 否 --> D{"是否需要实时系统查询"} + D -- 是 --> E["查订单/支付/CRM/权限系统"] + D -- 否 --> F["查知识库/SOP/FAQ"] + E --> G["生成回复"] + F --> G + G --> H{"用户是否继续不满/再次要求人工"} + H -- 是 --> C + H -- 否 --> I["结束会话"] +``` + +# 2. 技术侧:再决定这些功能怎么实现 + +当业务侧已经想清楚“哪些问题要自动化、哪些问题必须转人工、哪些需要查系统”之后,技术侧的目标才会清楚。 + +这时你真正要实现的,不是一个“会聊天”的机器人,而是下面这些模块: + +1. 意图分类模块 +2. 关键信息抽取模块 +3. 补信息模块 +4. 知识库查询模块 +5. 业务系统查询模块 +6. 风险判断模块 +7. 人工交接模块 + +## 2.1 模块流转怎么落地 + +如果你想把整套流程落到工程里,可以先把它理解成一个很简化的模块流转骨架: + +```ts +type CustomerServiceState = { + userMessage: string + intent?: "faq" | "order" | "refund" | "risk" + missingFields: string[] + riskLevel?: "low" | "medium" | "high" + knowledgeResult?: string + businessResult?: string + finalReply?: string + handoffToHuman: boolean +} + +function runCustomerServiceFlow(state: CustomerServiceState) { + state = classifyIntent(state) + state = extractFields(state) + + if (state.missingFields.length > 0) return askForMoreInfo(state) + if (state.intent === "faq") state = searchKnowledgeBase(state) + else state = queryBusinessSystems(state) + + state = evaluateRisk(state) + if (state.handoffToHuman) return handoffWithContext(state) + return generateReply(state) +} +``` + +这段代码故意写得很省略。你不用先关心框架 API,先看懂一件事就够了:企业客服 Agent 的本质不是“模型回答一次”,而是“状态在几个模块之间流转”。 + +## 2.2 数据、监控和异常处理 + +真正的商业客服系统依赖的数据,远不只是聊天记录。 + +至少要有三层: + +1. 输入侧数据:用户原话、渠道、语言、最近对话、是否重复提问、是否要求人工 +2. 业务侧数据:账号、订单、支付状态、权限状态、客户等级、历史投诉、地区、套餐 +3. 运营侧数据:自动解决率、升级率、首次响应时间、重复进入率、失败率、满意度 + +如果这些数据没有被结构化,系统就很难真正 enterprise。 + +同样重要的是异常处理。企业客服最不能接受的,不是模型回答短,而是它在不确定时还假装知道答案。 + +这里有四类常见 badcase: + +1. 信息不全却强行回答 +2. 系统超时却假装查到了结果 +3. 用户已经明显不满,却继续自动回复 +4. 高风险问题仍然走普通 FAQ 流程 + +你可以用下面这个 prompt,把异常处理和人工升级写成系统规则: + +```text +你是企业客服系统里的“异常与升级判断助手”。 + +请对当前会话判断是否需要人工升级或降级处理。 + +满足以下任一条件时,优先升级人工: +1. 用户明确要求人工 +2. 出现重复扣费、投诉、法务、隐私、欺诈、封号、退款争议 +3. 用户情绪明显激烈,或连续两轮表达不满 +4. 业务系统查询失败、超时、返回冲突结果 +5. 当前证据不足,无法保证结论正确 + +如果不升级人工,也必须输出: +1. 当前风险等级 +2. 是否允许自动回复 +3. 如果自动回复,最保守的回复方式是什么 +4. 如果查询失败,应该如何向用户解释 + +输出格式: +- 风险等级: +- 是否升级人工: +- 原因: +- 给用户的话: +``` + +如果要把“路由”这件事落成最小代码,通常长这样: + +```ts +function routeTicket(state: CustomerServiceState) { + if (state.riskLevel === "high") return "human_handoff" + if (state.missingFields.length > 0) return "ask_user" + if (state.intent === "faq") return "knowledge_lookup" + return "business_lookup" +} +``` + +真正的企业项目当然会更复杂,但落点通常就是这四种去向:补信息、查知识库、查业务系统、转人工。 + +# 3. 结尾:怎样判断它够不够企业级 + +一个真正能进入企业正式链路的客服 Agent,通常至少要满足这几条: + +1. 有明确服务边界:哪些能自动处理,哪些不能 +2. 有人工接管机制:升级时不能让用户重复讲一遍 +3. 有审计追踪:事后能复盘为什么这么路由 +4. 有灰度与回滚:不能一改 prompt 就全量上线 +5. 有运营指标:不是只看“像不像会聊天” + +更完整一点,你至少还要准备: + +- 权限层:不同角色能查不同数据 +- SLA 与超时回退:查不到结果时怎么处理 +- 离线评测集:覆盖常见问题、边界问题、高风险问题 +- 人工反馈闭环:把升级后的人工处理结果反哺系统 + +如果没有这些,系统最多只是一个演示不错的客服 Demo。 + +# 4. 推荐你的落地顺序 + +如果你真的要做,建议这样推进: + +1. 先只做一个高频低风险场景 +2. 先写真实用户输入,再写状态与路由 +3. 先接一个知识源和一个业务系统 +4. 再补人工升级、异常处理和运营指标 +5. 最后才考虑更复杂的 Agent 编排 + +# 总结 + +LangGraph 适合企业客服,不是因为它会让回答更花哨,而是因为它能把客服系统真正最重要的东西写清楚:路由、状态、补问、查询、升级、追踪。 + +当你开始把客服看成一个受治理的业务流程,而不是一个会说话的机器人,你才真正进入了企业级智能客服设计。 + +# 更多公开案例与延伸阅读 + +如果你想继续往企业级方向深入,下面这些资料最值得看: + +1. **LangChain 官方 `Thinking in LangGraph`** + 最适合拿来理解“客服流程为什么应该先拆状态,再写节点”。 + +2. **Klarna** + 适合看大规模客服场景里,自动化、升级率和响应效率为什么比“语气自然”更重要。 + +3. **Minimal** + 适合看多 Agent 如何真正接进 Zendesk、Front、Gorgias 这类客服平台,而不是停留在聊天窗口。 + +4. **Podium** + 适合看企业级客服为什么离不开 trace、评测和回归测试。 + +5. **Zendesk / Intercom / Salesforce** + 适合看商业产品如何处理 handoff、sentiment、VIP 路由、procedure handoff 和运营指标。 + +6. **CFPB** + 适合看监管视角下,为什么糟糕的 chatbot 会把用户困进 “doom loops”,以及为什么人工支持不是可选项。 + +# Reference + +- LangGraph Overview: [https://docs.langchain.com/oss/python/langgraph/overview](https://docs.langchain.com/oss/python/langgraph/overview) +- Thinking in LangGraph: [https://docs.langchain.com/oss/python/langgraph/thinking-in-langgraph](https://docs.langchain.com/oss/python/langgraph/thinking-in-langgraph) +- Built with LangGraph: [https://www.langchain.com/built-with-langgraph](https://www.langchain.com/built-with-langgraph) +- Klarna Customer Story: [https://blog.langchain.dev/customers-klarna/](https://blog.langchain.dev/customers-klarna/) +- Minimal Customer Support System: [https://blog.langchain.dev/how-minimal-built-a-multi-agent-customer-support-system-with-langgraph-langsmith/](https://blog.langchain.dev/how-minimal-built-a-multi-agent-customer-support-system-with-langgraph-langsmith/) +- Podium Customer Story: [https://blog.langchain.dev/customers-podium/](https://blog.langchain.dev/customers-podium/) +- Zendesk AI for Service: [https://www.zendesk.com/service/ai/](https://www.zendesk.com/service/ai/) +- Intercom Fin: [https://www.intercom.com/fin](https://www.intercom.com/fin) +- Salesforce AI for Service: [https://www.salesforce.com/service/ai/](https://www.salesforce.com/service/ai/) +- CFPB Chatbot Guidance: [https://www.consumerfinance.gov/about-us/newsroom/cfpb-issues-guidance-to-prevent-harmful-chatbot-practices/](https://www.consumerfinance.gov/about-us/newsroom/cfpb-issues-guidance-to-prevent-harmful-chatbot-practices/) diff --git a/docs/zh-cn/stage-3/ai-advanced/3.a3-llamaindex-enterprise-knowledge-base/index.md b/docs/zh-cn/stage-3/ai-advanced/3.a3-llamaindex-enterprise-knowledge-base/index.md new file mode 100644 index 0000000..7635f9a --- /dev/null +++ b/docs/zh-cn/stage-3/ai-advanced/3.a3-llamaindex-enterprise-knowledge-base/index.md @@ -0,0 +1,367 @@ +# 企业级知识库实战:用 LlamaIndex 搭建能落地的 RAG 系统 + +如果说 LangGraph 更适合解决“客服或 Agent 应该怎么跑”,那么 LlamaIndex 更适合解决另一个同样重要的问题:企业的知识,应该怎样被接入、组织、检索和回答。 + +这一章只聚焦企业知识库。重点不是写很多代码,而是理解一个真正能进入企业内部使用的知识系统,到底要解决什么问题。 + +# 快速开始 + +如果你现在就想开始,可以先想象这样一个很简单的场景: + +你的销售同事每天都会来问你同样几类问题,比如“企业版到底支不支持这个功能”“最新版和旧版差在哪里”“这段话怎么发给客户更合适”。你要做的,就是把这些分散在产品文档、FAQ、更新日志里的答案,整理成一个能随时被问、而且尽量答得稳的内部知识助手。 + +如果你只能记住一句话,那就是: + +> 企业级知识库不是“把 PDF 塞给模型”,而是“把分散知识变成一个可维护、可检索、可追溯的入口”。 + +# 1. 业务侧:先决定这个知识库要解决什么问题 + +企业知识库不是先从“接哪种检索框架”开始设计的,而是先从“业务团队每天到底在反复问什么”开始设计的。 + +如果这些问题没想清楚,后面无论你用 LlamaIndex、别的 RAG 框架,还是自建方案,系统都很容易做成“能搜,但不好用”的样子。 + +## 1.1 先把知识库当成知识系统,而不是上传页面 + +很多人第一次做知识库,会很自然地想: + +> “把文档都上传进去,不就行了吗?” + +但真实企业环境里,知识至少有这些特点: + +1. 来源很多,不只是一堆 PDF +2. 更新很频繁,旧答案很快会过时 +3. 不同文档可信度不一样 +4. 有些是文档,有些是数据库或配置表 +5. 有些问题只靠文档回答不了,还要结合实时系统 + +所以企业级知识库真正要解决的,不是“有没有文档”,而是: + +1. 去哪里找 +2. 找哪份最可信 +3. 如何避免旧版本干扰 +4. 找到之后怎么稳定组织成回答 + +下面是一张非常适合企业知识库入门的结构图: + +```mermaid +flowchart TD + A["企业知识来源"] --> B["文档接入与解析"] + B --> C["按知识域拆分索引"] + C --> D["检索与重排"] + D --> E["证据化回答"] + E --> F["业务同学使用"] + F --> G["反馈与治理"] + G --> B +``` + +这张图最重要的信号是:企业知识库不是一次性工程,而是一个持续治理的循环。 + +## 1.2 用一个真实业务场景来设计 + +为了避免太抽象,我们设定一个很常见的企业知识库场景: + +你要做的是一个 **企业内部产品知识助手**,服务对象包括客服、销售和实施团队。 + +它要回答的问题通常像这样: + +- “企业版到底能不能配置多个审批流?” +- “客户问我们和基础版相比,多出来的权限管理具体是什么?” +- “这个功能是只有管理员能看到,还是普通成员也能用?” +- “为什么我记得以前文档里写的是 100 人上限,现在好像不是了?” +- “能不能整理一段适合发给客户的更新说明?” + +这些问题都很像真实工作语言,而不是数据库查询语句。 + +也正因为如此,企业知识库的第一步不是“向量化”,而是先承认: + +> 用户怎么问,和企业文档怎么写,往往不是同一种语言。 + +你可以先用一个 prompt,把问题理解和知识路由做出来: + +```text +你是企业知识库系统里的“问题理解与知识路由助手”。 + +你的任务: +1. 判断用户问题属于哪个知识域:产品功能、套餐定价、FAQ、内部 SOP、版本更新。 +2. 判断问题更适合查文档、FAQ,还是需要结合业务系统。 +3. 如果问题涉及旧版本与新版本冲突,优先提醒系统关注最新版本文档。 +4. 如果问题超出知识库能力,不要编造,明确说明需要查业务系统或人工确认。 + +输出格式: +- 问题所属知识域: +- 推荐查询来源: +- 是否可能涉及版本冲突: +- 是否需要业务系统补充: +- 给上层系统的检索提示: +``` + +这个 prompt 的价值,在于先把“知识去哪找”这件事做对。 + +## 1.3 企业级知识库最核心的设计,不是检索,而是拆分 + +企业知识库效果差,最常见的原因不是模型太弱,而是所有文档都被混成了一锅。 + +一个更像企业项目的做法,通常会先按知识域拆开,例如: + +1. 产品功能文档 +2. 套餐与定价说明 +3. 客服 FAQ +4. 内部 SOP +5. 版本更新日志 + +为什么这样更好?因为用户问: + +> “最新版增加了什么能力?” + +和用户问: + +> “退款规则是什么?” + +显然不该优先查同一份资料。 + +下面是一张更接近企业知识库检索设计的路由图: + +```mermaid +flowchart TD + A["用户问题"] --> B["识别问题知识域"] + B --> C{"属于哪个知识域"} + C -- 产品能力 --> D["产品文档索引"] + C -- 套餐/价格 --> E["定价与套餐索引"] + C -- FAQ --> F["客服 FAQ 索引"] + C -- 内部流程 --> G["SOP 索引"] + C -- 版本变化 --> H["版本更新索引"] + D --> I["重排与过滤"] + E --> I + F --> I + G --> I + H --> I + I --> J["生成带证据的回答"] +``` + +这就是为什么 LlamaIndex 很适合企业知识库。它不是只帮你“做向量检索”,而是更方便你把不同来源、不同主题、不同规则的知识组织起来。 + +# 2. 技术侧:再决定这些功能怎么实现 + +当业务侧已经想清楚“有哪些问题最常见、哪些知识域要拆开、哪些问题不能只靠文档”之后,技术侧的目标才会清楚。 + +你真正要实现的,通常不是一个“大而全的聊天窗口”,而是下面这些模块: + +1. 问题路由模块 +2. 文档接入与解析模块 +3. 多知识域索引模块 +4. 检索与重排模块 +5. 证据化回答模块 +6. 版本与权威来源控制模块 + +## 2.1 模块流转怎么落地 + +如果你想把这个系统想成工程模块,可以先看一个极简骨架: + +```ts +type KnowledgeQuery = { + question: string + domain?: "product" | "pricing" | "faq" | "sop" | "release_notes" + needsBusinessData?: boolean +} + +function answerWithKnowledgeBase(query: KnowledgeQuery) { + const routed = routeQuery(query) + const docs = retrieveDocuments(routed) + const ranked = rerankDocuments(docs, routed) + return generateGroundedAnswer(ranked, routed) +} +``` + +这段代码故意不写具体框架 API。它只是帮助你抓住企业知识库的主干:先路由,再检索,再重排,最后基于证据回答。 + +## 2.2 治理、边界与证据 + +如果你去看更接近企业的案例,会发现真正难的不是回答本身,而是治理。 + +一个企业级知识库,通常至少要有下面这些意识: + +### 版本意识 + +用户问: + +> “我记得以前文档里写的是 100 人上限,现在还是吗?” + +这类问题最大的风险,不是检索不到,而是检索到了旧规则。 + +所以企业级系统必须尽量做到: + +1. 优先最新版本 +2. 区分历史文档 +3. 避免旧文档覆盖当前规则 + +### 权威来源意识 + +同一个问题,FAQ、产品手册、销售话术、内部 SOP 可能写得不完全一样。 + +企业系统一定要定义: + +1. 默认以谁为准 +2. 哪类文档只能内部参考 +3. 哪类文档可以对外表达 + +### 系统边界意识 + +知识库可以回答: + +1. 规则 +2. 定义 +3. 功能说明 +4. 流程解释 + +但它不应该单独回答: + +1. 某个客户是否已经开通功能 +2. 某笔退款现在走到哪一步 +3. 某个账号当前权限状态如何 + +这些问题往往还需要业务系统。 + +所以一个成熟知识库最重要的能力之一,是知道什么时候该说: + +> “这个问题需要结合业务系统查询,我现在只能先确认规则,不能直接确认当前状态。” + +# 5. 企业知识库要准备哪些数据、评测和异常处理 + +企业知识库真正依赖的数据,一般有三层: + +1. 文档侧数据:来源、版本、更新时间、知识域、权威等级 +2. 查询侧数据:用户问题、命中的知识域、检索结果、证据链 +3. 运营侧数据:哪些问题经常被问、哪些答案经常被改写、哪些文档经常被引用、哪些问题经常答错 + +一个真正的企业知识库,还要特别重视 badcase。 + +最常见的 badcase 包括: + +1. 引用了旧文档 +2. 把不同部门口径混在一起 +3. 看起来答对了,但证据来源不权威 +4. 文档里没有答案,却硬生成了结论 +5. 本该查业务系统,却只查了文档 + +你可以用下面这个 prompt,把证据约束做得更稳: + +```text +你是企业知识库系统里的“证据化回答助手”。 + +请严格根据检索到的参考内容回答问题: +1. 优先使用最新、最权威的资料。 +2. 如果不同资料之间冲突,明确指出冲突,不要自行编造统一结论。 +3. 如果证据不足,明确说明“根据当前资料无法确认”。 +4. 如果问题属于实时业务状态,请明确说明需要查业务系统。 + +输出格式: +- 核心结论: +- 依据来源: +- 是否存在版本冲突: +- 是否需要业务系统补充: +- 给用户的话: +``` + +如果你想把“证据化回答”落成一个极简模块,可以这样理解: + +```ts +function generateGroundedAnswer(docs: string[], query: KnowledgeQuery) { + if (docs.length === 0) { + return "根据当前资料无法确认,需要补充知识源或转人工确认。" + } + return llmAnswer({ + question: query.question, + evidence: docs, + rule: "只根据证据回答;证据不足时明确说不知道。" + }) +} +``` + +这段代码最重要的不是实现,而是原则:证据不足时,系统要学会停下来。 + +企业知识库真正的专业感,往往就体现在这里:不是答得长,而是答得稳。 + +## 2.3 一个最小的知识域路由 + +如果要把“知识域路由”这件事写成最小代码,通常会长这样: + +```ts +function routeQuery(query: KnowledgeQuery) { + if (query.question.includes("价格") || query.question.includes("套餐")) { + return { ...query, domain: "pricing" } + } + if (query.question.includes("更新") || query.question.includes("最新版")) { + return { ...query, domain: "release_notes" } + } + return { ...query, domain: "product" } +} +``` + +真实项目里当然不会只靠关键词,但这个最小例子很有价值,因为它说明了一点:企业知识库的关键,不是“把所有文档都搜一遍”,而是“先尽量去对的地方找”。 + +# 3. 结尾:怎样判断它够不够企业级 + +一个真正能被企业长期使用的知识库,通常至少要满足这几条: + +1. 有知识治理,而不只是上传文档 +2. 有知识域拆分,而不是一个超级大索引 +3. 有版本意识,不让历史规则覆盖当前规则 +4. 有权限控制,不是谁都看到同样内容 +5. 有评测和回溯,能持续知道哪里答错了 + +更完整一点,你最好还要准备: + +- 文档生命周期管理 +- 权威来源定义 +- 更新策略 +- 回答证据化 +- 失败时的降级路径 +- 使用反馈闭环 + +如果没有这些,系统最多只是一个“文档问答 Demo”。 + +# 4. 推荐你的落地顺序 + +建议按这个顺序推进: + +1. 先选一个窄业务对象 +2. 先收集真实问题,再决定接哪些知识源 +3. 先做知识域拆分,再做复杂检索 +4. 先解决证据与版本问题,再追求回答更自然 +5. 最后再考虑和 Agent、客服系统、CRM 做更深整合 + +# 总结 + +LlamaIndex 最适合做的,不是“另一个能聊天的框架”,而是企业知识与数据访问层。 + +当你把知识库从“上传页面”升级成“知识治理、路由检索、证据回答、持续更新”的系统时,你才真正进入了企业级知识库设计。 + +# 更多公开案例与延伸阅读 + +如果你想继续往企业级方向深入,下面这些资料最值得看: + +1. **Jeppesen(Boeing 旗下)** + 适合看工程知识场景下,知识库为什么首先是生产力基础设施。 + +2. **Microsoft + LlamaIndex** + 适合看企业知识入口如何成为企业 AI 平台的一部分。 + +3. **LlamaIndex Customers 与官网案例集合** + 适合看知识库在 KPMG、Rakuten、Salesforce、Cemex 等不同场景里的落地差异。 + +4. **LlamaCloud** + 适合看企业文档接入、解析、同步和长期维护层面的问题。 + +5. **Use Cases 与 Q&A 页** + 适合看企业知识库如何作为客户支持、企业搜索、研究助手等系统的底座。 + +# Reference + +- LlamaIndex Use Cases: [https://docs.llamaindex.ai/en/stable/use_cases/](https://docs.llamaindex.ai/en/stable/use_cases/) +- LlamaIndex Q&A Use Cases: [https://docs.llamaindex.ai/en/stable/use_cases/q_and_a/](https://docs.llamaindex.ai/en/stable/use_cases/q_and_a/) +- LlamaIndex Customers: [https://www.llamaindex.ai/customers](https://www.llamaindex.ai/customers) +- LlamaIndex Homepage: [https://www.llamaindex.ai/](https://www.llamaindex.ai/) +- Jeppesen Customer Story: [https://www.llamaindex.ai/customers/jeppesen-a-boeing-company-saves-2-000-engineering-hours-with-unified-chat-framework](https://www.llamaindex.ai/customers/jeppesen-a-boeing-company-saves-2-000-engineering-hours-with-unified-chat-framework) +- Microsoft Customer Story: [https://www.microsoft.com/en/customers/story/23695-llamaindex-azure-open-ai-service](https://www.microsoft.com/en/customers/story/23695-llamaindex-azure-open-ai-service) +- LlamaCloud Documentation: [https://docs.cloud.llamaindex.ai/](https://docs.cloud.llamaindex.ai/) +- LlamaCloud in Docs: [https://docs.llamaindex.ai/en/latest/llama_cloud/](https://docs.llamaindex.ai/en/latest/llama_cloud/)