尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
超越检索:企业 RAG 的生产级系统设计
目录前言Demo 跑通之后真正的问题才刚刚开始一、第一件事不是选向量数据库而是搞清楚系统到底需要回答什么二、企业知识入库难的不只是把文档切成 Chunk1. 文档解析的重点是保留回答问题所需要的关系2. 比 Embedding 更值得提前设计的是知识的数据契约三、Wiki 一旦开始频繁更新RAG 就变成了一套数据同步系统1. 一次任务完成并不代表它应该被发布2. 我更推荐将索引构建与索引发布分开3. 为什么还要区分“可见”和“已写入”四、从“检索到了内容”到“能够回答问题”中间还差一次证据决策1. 有些事情应该交给程序不应该交给模型猜2. 为什么相关性高不等于证据足够3. 检索策略为什么不能一开始就堆满五、LLM 应该负责组织答案但不应该独自负责所有正确性1. “有引用”不代表“答对了”2. 多模态回答还需要处理资源引用3. 外部知识不能反过来指挥模型六、即使知识和答案都设计好了生产环境仍然可能把系统击穿1. 在线和离线应该具有明确的故障边界2. 流式输出需要区分“正在生成”和“已经完成”3. 性能优化应该先知道时间花在哪里4. 缓存和权限必须一起设计七、上线前我真正想验收的是什么八、真正成熟的设计不是从第一天就把所有组件装上九、如果让我重新设计一套企业 RAG我会留下这张架构图十、回到最初的问题企业为什么不敢让一个能跑的 Demo 直接上线参考资料从一次真实的多模态 RAG 问答问题出发聊聊企业知识库从 Demo 走向生产究竟需要怎样的系统设计。前言Demo 跑通之后真正的问题才刚刚开始假设你正在给一家企业开发内部 AI 知识助手。公司的知识散落在 Wiki、PDF 操作手册、产品文档和历史故障记录中。员工希望以后遇到问题不必翻半天资料直接问 AI 就能获得答案。于是你搭建了一套标准 RAG文档解析、Chunking、Embedding、向量检索、Prompt 组装、LLM 生成。上传几份 PDF问几个技术问题模型不仅能够回答还能引用对应的文档内容。演示效果很好。但等到产品准备推广给售后、研发、客服等部门时问题开始变得不一样了。售后问“为什么原始操作手册有截图AI 的回答却没有”研发问“Wiki 刚刚修改了为什么 AI 还在引用旧知识”客服问“V1 和 V2 的手册都在知识库里怎么保证不会混用”管理员问“这个员工没有研发文档的权限AI 会不会把内容告诉他”运维问“文档更新失败怎么办高峰期响应慢怎么办模型接口超时怎么办”这些问题不是把某个参数从 5 改成 10 就能解决的。Demo 只证明了 RAG 的主链路能够运行生产交付却要求这条链路在知识变化、权限约束、并发请求和服务故障下仍然能够可靠工作。这也是我在参与企业知识库多模态 RAG 开发以及后续研究知识更新和检索架构时逐渐意识到的一件事企业 RAG 不只是“检索 生成”而是一套持续维护知识状态、组织可信证据并向用户提供答案的系统。下面我想用一个贯穿全文的企业知识助手场景把它从 Demo 到正式交付的过程完整推演一遍。其中涉及多模态手册处理和 SSH 问答漏图的部分来自我的实际实践知识版本发布、任务乱序和生产架构等内容则是基于常见工程约束展开的设计讨论并非宣称所有方案都已在原项目中上线。一、第一件事不是选向量数据库而是搞清楚系统到底需要回答什么企业知识助手刚开始建设时很容易直接讨论技术Embedding 模型选哪个Chunk 多大用哪种检索方式需不需要 Rerank这些问题当然重要但我认为应该先确定一个更基本的前提系统究竟需要帮助什么人完成什么任务例如同样是技术知识库用户的问题可能完全不同“SSH 默认端口是多少”——需要准确事实。“如何通过 SSH 远程登录设备”——需要可执行的步骤。“V1 和 V2 的网络配置有什么区别”——需要跨版本比较。“为什么设备连接失败”——可能需要结合错误现象逐步排查。“下一代产品什么时候发布”——可能涉及未授权信息或者知识库根本没有答案。如果产品没有定义这些问题的成功标准开发就很难判断系统到底做得怎么样。我们可以把需求归纳成四个问题谁在问问的是哪个业务对象需要什么样的答案这份答案允许使用哪些知识以“如何通过 SSH 登录 V2 开发板”为例。它至少包含几个约束用户身份售后工程师 业务对象某型号开发板 产品版本V2 任务类型操作指导 期望结果能够按照步骤完成 SSH 登录 知识范围当前用户有权访问的有效文档一旦把问题定义清楚很多后续设计就有了依据。因为这是操作指导系统需要考虑步骤完整性和相关截图。因为指定了 V2检索不能只看语义相似度还需要关注版本适用性。因为用户来自售后部门系统只能使用该用户有权访问的知识。如果知识库里没有适用 V2 的资料就不能简单拿 V1 的步骤冒充正确答案。企业 RAG 的架构应该从这些约束推导出来而不是从一张流行的技术架构图倒推业务需求。二、企业知识入库难的不只是把文档切成 Chunk确定了业务任务接下来才是知识建设。我们的知识来源可能包括操作手册、研发 Wiki、FAQ、技术公告和历史故障记录。Demo 阶段可以把文本提取出来按一定长度切块再生成向量。但生产环境会遇到两个问题第一文档被切碎之后原始知识关系可能丢失。第二同一份知识可能有多个版本、多个来源和不同的访问权限。这两个问题会影响后面所有环节。1. 文档解析的重点是保留回答问题所需要的关系这一点我有比较直接的体会。在多模态 RAG 测试中我使用过一份包含大量操作截图的开发板手册并让系统回答“如何进行 SSH 网络登录”原始手册包含几张与操作有关的图片查询设备 IP 的终端截图、SSH 登录配置界面、登录成功后的界面。结果生成的文字步骤基本正确却只展示了后两张图片。查询 IP 的终端截图没有出现在最终答案里。进一步检查原始文档可以发现这张截图处于跨页位置前面的操作文字接近上一页末尾截图位于下一页开头而且缺乏明显的图注。这并不能单独证明漏图一定发生在解析阶段但它暴露了一个值得排查的风险图片被成功提取并不等于图片与正文的关系被正确建立。如果系统只把文档处理成一组彼此独立的文本 Chunk 和图片资源后续检索时就可能出现找到操作步骤却不知道应该关联哪张截图。找到一张截图却不知道它属于哪个产品版本。检索到了图片但最终回答无法定位原始页面。所以知识解析不应该只关注内容提取还要尽可能保留文档的章节结构与标题层级图片、表格与相关正文的关联跨页内容之间的语义连续性原始页码、位置与来源标识。当然不是所有文档都需要复杂的版面分析。结构清晰的 FAQ可以直接按问答单元组织。但对于操作手册、技术规范、多模态资料结构关系往往直接影响答案能否完整。好的 Chunk不只是长度合适还应该能够被放回原始知识的上下文中。2. 比 Embedding 更值得提前设计的是知识的数据契约假设系统找到一段文字“默认超时时间为 30 秒。”只看这段内容我们无法判断它能不能用于回答当前问题。至少还需要知道它来自哪份文档对应哪个产品和版本当前是否有效用户有没有权限使用原始位置在哪里因此我更倾向于把知识抽象成几类对象Document文档身份 └── Revision文档版本 ├── Section章节 │ └── Chunk检索单元 └── Asset图片、表格等资源 另外关联 Source来源 Permission权限 Index Generation索引构建代际这里有几个概念最好不要混在一起。Document ID表示同一份逻辑文档的身份。Revision表示文档内容的某次修订。Chunk ID表示解析后用于检索的内容单元。Asset ID表示可被引用和展示的图片、表格等资源。Index Generation表示某次索引构建结果。它与业务文档版本不同因为同一份文档可能在内容不变的情况下重新切块或更换 Embedding 模型。例如{ document_id: device_manual, revision: rev_12, product_version: V2, status: published, chunk_id: chunk_023, section: 网络配置/SSH, related_assets: [image_014], source_page: 13, permission_ref: acl_001, index_generation: gen_003 }这是逻辑数据结构示例不要求所有字段都必须放进同一张表。不同信息可以存放在不同存储系统中但它们之间的关联关系必须能够被可靠地维护。这样设计之后我们才有能力完成后续工作文档更新时定位旧数据。用户查看引用时回溯原始来源。查询指定版本时过滤不适用的知识。图片引用时找到正确资源。权限变更时限制派生知识的访问。这里有一个我认为特别重要的认识向量索引应该是原始知识的派生检索视图而不是企业知识唯一的事实来源。向量负责帮助我们找到相关内容。但知识的身份、来源、版本、有效性和授权需要有独立且明确的管理规则。如果这些东西在入库阶段就没有设计好后面再去补知识更新、引用校验和权限管理往往会更加麻烦。三、Wiki 一旦开始频繁更新RAG 就变成了一套数据同步系统到这里我们已经有了一套可以检索的知识资产。但企业知识不是静止的。产品手册会发布新版本研发 Wiki 会持续修改管理员也会删除过期资料。所以企业 RAG 不可能只运行一次文档导入程序。它需要一条能够持续工作的知识处理流水线。通常我们会把耗时较长的解析、切块、Embedding 和索引写入放到异步任务中。问题也随之出现。1. 一次任务完成并不代表它应该被发布假设某份 Wiki 当前对外可用的修订是 V1。管理员在 10:00 修改文档产生 V2。一分钟后他再次修改产生 V3。系统收到两个更新事件分别创建任务 A、B。但由于文档解析和模型调用耗时不同任务可能乱序完成时间事件10:00V2 更新任务 A 开始10:01V3 更新任务 B 开始10:03任务 B 完成V3 索引构建成功10:06任务 A 才完成V2 索引构建成功假设我们的逻辑是“任务成功后直接把当前文档索引替换为本次结果。”那么 10:06 时旧任务 A 就可能把已经发布的 V3 回退成 V2。这不是大模型问题也不是向量相似度问题。这是典型的异步任务乱序与并发状态更新问题。2. 我更推荐将索引构建与索引发布分开可以把文档处理设计为以下状态PENDING ↓ PROCESSING ↓ INDEXED ↓ VALIDATED ↓ PUBLISHED 异常分支 FAILED / SUPERSEDED流程分为两件事。第一件事构建。读取指定 Revision 的内容解析、切块、生成索引记录。构建完成后检查索引数据是否完整、引用关系是否有效。第二件事发布。只有通过校验、且满足当前发布策略的 Revision才允许成为可检索版本。这里的关键不是状态名称而是发布时必须做并发校验。例如使用带条件的原子更新或等效机制保证旧任务不能覆盖已经发布的新版本。对于要求始终使用最新修订的场景可以遵循如下规则目标 Revision V3 任务 A 完成 V2 V2 已不是当前目标版本 → 不允许发布 任务 B 完成 V3 V3 构建和校验成功 → 将当前可见版本切换为 V3如果 V3 构建失败则继续使用上一份已发布且仍允许使用的知识并将新版本发布失败明确记录下来。不应该把尚未完成的索引数据直接暴露给在线查询。3. 为什么还要区分“可见”和“已写入”假设一份文档被切成 100 个 Chunk。系统正在写入新版本已经完成 60 个剩余 40 个还没有处理。如果在线查询可以直接搜索所有新写入的 Chunk就可能读到一个不完整的新版本。因此可以让每个索引记录都关联构建代际并通过“已发布版本”决定哪些记录可以参与检索。在线请求只使用符合发布条件的数据。在单文档维度这可以避免查询使用未完成的修订对于跨文档的全局一致性则需要额外的快照或版本协调机制不能假设一个文档版本指针就能解决所有一致性问题。另外还需要考虑两种边界情况。第一任务重试。同一事件可能被多次投递写入必须尽量具备幂等性。一个常见做法是将 Document ID、Revision 和索引代际作为幂等依据避免产生重复的有效记录。第二文档删除。删除不能只依赖后台异步清理。对于已经被删除或禁止访问的知识应该先通过逻辑失效或查询限制阻止继续使用再异步清理索引、图片资源和相关缓存。否则原始文档消失了向量库中却可能仍然存在可被检索的旧内容。你会发现当知识开始持续更新时RAG 系统实际上已经具备了传统数据流水线的很多特征任务调度、状态转换、失败恢复、并发控制和数据一致性。这部分工程能力不会因为换一个更强的大模型而自动获得。四、从“检索到了内容”到“能够回答问题”中间还差一次证据决策现在我们终于拥有一份持续更新、状态明确的知识库。用户再次提问“V2 开发板应该如何通过 SSH 远程登录”在线服务开始工作。第一步不应该只是把整句话转换为向量。因为这个问题包含三个不同层面的信息“V2 开发板”是适用范围。“SSH”是技术主题。“如何登录”意味着用户期望获得操作步骤。因此在线问答可以分成三个阶段确定查询约束 → 获取相关证据 → 组织能够回答问题的内容。1. 有些事情应该交给程序不应该交给模型猜例如用户身份、访问权限、明确指定的产品版本。这些约束已经可以被结构化表达就没有必要让模型自由决定。用户问 V2应该优先限定适用 V2 的知识范围。用户没有某份文档的访问权限就不应该把它交给模型再指望模型自觉不回答。这类规则应该由检索服务或授权服务执行。对于模型难以确定、又会实质影响答案的业务条件例如用户没有说明设备版本可以选择进行必要的澄清。但也不必让每次查询都经过一套复杂的意图识别工作流。结构化条件能够解决的问题用确定性逻辑解决真正需要语义理解的问题再交给模型处理。2. 为什么相关性高不等于证据足够假设检索系统返回以下内容Chunk A介绍 SSH 协议 Chunk B介绍 SSH 远程登录原理 Chunk C介绍 SSH 的安全特性 Chunk D介绍设备 IP 查询步骤 Chunk E介绍 V2 设备登录配置如果只按照语义相似度排序前三段可能获得不错的分数。但用户实际需要的是完成一次远程登录。此时Chunk D 和 Chunk E 可能比某些高度相关的背景介绍更重要。对于这类任务我认为需要明确区分相关性证据和问题是否接近。适用性证据是否适用于当前产品、版本和环境。充分性这些证据能否支持用户完成当前任务。它们不是同一个概念。检索策略主要负责获得相关候选。业务约束帮助我们确定适用范围。证据组织则进一步关注回答是否缺少必要信息。例如对于操作类问题可以先抽象出目标完成 V2 设备 SSH 登录 需要覆盖 1. 获取设备网络地址 2. 配置 SSH 客户端 3. 建立连接 4. 验证是否登录成功然后把检索到的文本、表格和截图关联到相应步骤。如果某个步骤缺乏证据系统就有理由继续检索、提示信息不足或者缩小回答范围。这并不是说每个问题都必须调用一个额外的 LLM 来做证据规划。简单事实问答完全可以直接使用检索结果。但对于多步骤、跨文档和多模态问题显式组织证据能够带来更可控的回答过程。3. 检索策略为什么不能一开始就堆满语义检索、关键词检索、结果融合和 Rerank 都有各自价值。例如型号、错误码、接口名称等精确标识可能更适合关键词匹配。自然语言表达差异较大的问题语义检索通常更有优势。多路候选来源差异较大时可以考虑融合排序与精排。但每增加一个阶段都可能带来额外延迟、计算成本与维护复杂度。所以更合理的顺序是先分析真实问题中哪些证据无法被现有方案可靠找到再决定是否引入新策略。企业 RAG 的技术方案不应该由组件数量决定而应该由证据需求决定。五、LLM 应该负责组织答案但不应该独自负责所有正确性接下来模型终于拿到了适用的知识。是不是可以直接生成对于普通问答通常可以。但如果答案需要满足版本、引用和多模态要求还需要考虑生成结果是否真正对应所选证据。1. “有引用”不代表“答对了”看一个构造例子。用户问“V2 接口的默认超时时间是多少”知识库包含V1 文档默认超时时间为 60 秒 V2 文档默认超时时间为 30 秒模型回答“默认超时时间为 60 秒。”并引用了 V1 文档。引用确实存在60 秒也确实写在对应文档里。但对用户的问题而言这个答案仍然是错的。因此引用校验至少需要关注来源是否真实存在引用内容是否支持对应结论来源的版本与适用环境是否符合当前问题。对于关键数字、配置参数、版本号等结构化事实可以考虑使用程序校验与必要的模型辅助检查。模型负责把证据整理成用户能理解的语言。系统则应尽量通过确定性规则保证身份、版本、资源和引用关系不被随意改变。2. 多模态回答还需要处理资源引用如果答案中需要图片最好不要让模型凭空构造图片地址。一种比较稳妥的方式是给图片资源分配稳定的 Asset ID。检索和证据组织阶段确定哪些图片可以使用。模型生成时输出允许引用的图片标记。后端校验标记确实属于当前证据集合且用户有权访问然后再解析为可展示的资源。例如步骤 1查询设备 IP 地址。 [IMAGE_REF: image_001] 步骤 2配置 SSH 客户端。 [IMAGE_REF: image_002]这样系统能够明确区分图片是否存在是否被检索是否进入证据集合是否被模型引用是否成功展示。但图片并不是越多越好。真正重要的是它有没有帮助用户理解和完成当前任务。3. 外部知识不能反过来指挥模型还有一条与事实正确性不同的边界。企业 Wiki 是外部知识来源不是 System Prompt。如果某份文档夹带了“忽略原有指令”之类的内容它应该被当成文档数据而不是获得控制模型行为的权限。这就是间接提示词注入的风险。因此需要将检索内容明确标记为外部数据并结合知识源治理、必要的风险检测和输出校验进行防护。不过提示词边界并不是绝对安全保证。尤其对于访问权限、敏感资源等确定性安全规则必须在模型之外强制执行。不能把系统必须遵守的安全边界仅仅写成对模型的一句请求。六、即使知识和答案都设计好了生产环境仍然可能把系统击穿到这里我们讨论的主要是答案质量。但企业上线面对的是大量持续发生的请求。模型服务可能超时检索服务可能不可用文档更新任务可能失败用户还可能在回答生成过程中关闭页面。这些问题不能再靠 Prompt 解决。1. 在线和离线应该具有明确的故障边界离线任务可能需要调用文档解析服务、视觉模型和 Embedding 服务。在线问答则更关心响应时间和稳定性。两者可以共享知识存储但通常不应该互相阻塞。例如离线任务失败不应该立即影响已经发布的可用知识。新版本索引尚未构建成功不应该让所有用户无法查询旧版本。在线服务则应能够识别检索失败、模型超时和引用资源异常并返回明确状态。这里需要注意降级不等于随便返回一个看起来合理的答案。当知识证据不足时可能更适合明确告知无法可靠回答而不是跳过检索让模型凭自身知识猜测企业内部事实。2. 流式输出需要区分“正在生成”和“已经完成”为了降低等待感RAG 服务经常使用流式输出。但流式响应还有一个容易忽略的问题模型可能已经输出了一半内容连接却突然中断。前端如果把这些文字直接当成完整回答就会造成误导。因此流式协议最好具备明确的结束状态。例如STARTED ↓ STREAMING ├── COMPLETED ├── FAILED └── CANCELLED只有收到成功完成信号客户端才将本次生成视为完整结果。否则需要提示回答未完成并提供适当的重新生成或恢复入口。至于已经产生的部分内容是否保留、是否允许继续展示则需要根据业务风险决定。3. 性能优化应该先知道时间花在哪里一次 RAG 问答可能包含身份校验、查询处理、知识检索、候选排序、上下文组装、模型首 Token 等待、持续生成和引用解析。如果系统响应慢首先应该拆分这些阶段的耗时。例如检索只占很小一部分时间主要延迟来自模型输出那么优化检索索引带来的收益就可能有限。除了平均耗时还应该关注高分位延迟、超时情况和模型调用成本。同时系统需要避免无意义的重复调用。但也不能为了降低成本就无限压缩上下文导致关键证据缺失。质量、延迟和成本需要一起评估而不是只优化其中一个数字。4. 缓存和权限必须一起设计缓存可以降低模型调用与检索成本但企业知识有版本和权限。不同员工可能无法访问相同文档。相同问题在知识更新后也可能得到不同答案。因此缓存命中不能只依赖用户输入的文本是否相同还需要考虑知识版本、授权范围以及失效规则。特别是敏感内容不应该因为另一个用户曾经问过相同的问题就直接复用他有权限看到的答案。这再次说明企业 RAG 的安全和一致性设计必须覆盖原始知识、索引、缓存、引用资源和最终回答的完整链路。七、上线前我真正想验收的是什么现在系统已经有了知识处理、在线检索、生成回答和服务运行的基本能力。但要决定能不能给真实用户使用还需要完成一次系统级验收。这里我认为最有价值的不是某个综合评分而是建立一份真正可执行的测试清单。验收维度典型测试场景需要验证什么知识完整性操作手册跨页图文、复杂表格必要内容和结构关系是否保留知识更新连续修改、重复事件、任务乱序旧任务是否会覆盖新版本知识删除删除文档后再次查询已失效知识是否仍可被使用版本适用性V1、V2 文档同时存在是否使用符合问题约束的证据权限安全不同部门查询相同问题是否发生越权检索或资源访问答案可靠性缺少证据、跨文档问题是否能够正确回答或明确拒答服务稳定性模型超时、流中断、检索故障是否存在明确失败状态与恢复方式性能成本正常负载和高峰负载延迟、失败率与成本是否满足要求可观测性人为构造一次错误引用是否能够定位出错阶段其中有些问题可以使用自动化测试检查。例如版本状态、权限约束、图片 ID、接口错误和任务恢复。有些问题需要业务评测。例如回答是否完整、操作步骤是否正确、证据是否足够。这两类测试不应该混为一谈。模型评估分数再高也不能证明系统没有权限漏洞接口测试全部通过也不能证明最终答案满足用户任务。因此我更建议把评估分为三层第一层数据与流程正确性。验证索引状态、版本、权限、资源引用等确定性条件。第二层问答质量。使用代表性业务问题检查相关证据、答案完整性、事实支持和任务完成度。第三层生产运行质量。检查响应延迟、错误率、资源成本、更新时效和故障恢复。这三层共同决定系统能否满足交付要求。当然不同业务对这些指标的要求不同。具体数值应该由产品、业务、安全和技术团队共同确认而不是开发人员拍脑袋规定一个“企业级标准”。八、真正成熟的设计不是从第一天就把所有组件装上看到这里可能会觉得企业 RAG 要考虑的东西太多。那是不是一开始就应该搭建一套非常复杂的平台我反而不这么认为。复杂度应该随着实际约束增长而不是随着技术名词增长。例如设计问题简单方案已经足够时值得进一步升级时文档处理文档结构简单、来源稳定包含复杂图文关系和多种格式知识更新文档量少、更新低频更新频繁、任务并发与成本上升检索策略单路检索覆盖主要问题精确标识与语义表达都很重要多模态索引图片只需跟随相关文本展示用户会直接根据图片内容提问证据组织简单事实查询多步骤、跨文档、版本敏感任务生成校验低风险、结构简单的回答关键参数、复杂引用或高风险场景服务治理小范围内部试用多部门并发、明确可用性和成本要求但这里有个前提简单方案不意味着可以省略基本的安全要求。如果系统使用了企业私有数据访问控制和数据保护从一开始就必须成立。如果业务不能接受错误版本的知识就必须有适当的有效性约束。可以分阶段建设高级能力但不能把必要的正确性和安全边界当成以后再处理的优化项。我更推荐按照以下方式推进原型验证阶段使用代表性业务问题证明知识问答确实能够解决需求。部门试点阶段补充来源追溯、权限约束、知识更新、反馈渠道和必要的回归用例。生产交付阶段完善失败恢复、版本一致性、监控告警、负载测试和安全验收。持续优化阶段根据真实失败问题决定是否增加更复杂的检索策略、增量处理或多模态增强。这不是严格的项目管理模板而是提醒我们应该先把系统当前承担的责任做好再为新增的业务责任增加架构复杂度。九、如果让我重新设计一套企业 RAG我会留下这张架构图回顾前面的推演一套企业 RAG 可以从职责上划分为几个相对独立的部分。企业知识来源 Wiki / PDF / FAQ / 业务文档 │ ▼ 知识接入与治理 来源、权限、版本、结构解析 │ ▼ 离线知识流水线 清洗 → 切块 → 增强 → 索引构建 │ ▼ 知识发布与存储 原始知识 / 资源 / 可检索索引 │ │ 用户请求 → 身份与业务约束 → 授权检索 │ ▼ 证据选择 │ ▼ 模型生成 │ ▼ 引用与结果校验 │ ▼ 最终回答 横向保障 权限安全版本管理监控追踪质量评估 任务恢复成本治理数据删除回归测试这张架构图并不要求每一个方框都部署成独立服务。小型系统完全可以把多个职责放在同一个应用中。大型系统则可能根据任务负载、扩展需求和团队边界进行拆分。重要的是职责划分而不是微服务数量。离线部分负责让知识持续保持正确和可用。在线部分负责根据当前用户和问题组织适用证据。生成部分负责把证据转化为答案而不是替代权限和版本判断。横向保障负责确保系统在变化和故障中仍然可以运行、检查和恢复。我认为这种划分比某个具体框架的调用链更加重要。因为具体技术栈会变化模型会升级检索方案也可能替换。但知识生命周期、证据适用性、安全边界和可靠交付这些工程问题不会因为技术栈变化而消失。十、回到最初的问题企业为什么不敢让一个能跑的 Demo 直接上线因为“能跑”和“可交付”验证的根本不是同一件事。Demo 阶段我们通常验证文档能否入库问题能否检索模型能否生成回答。生产阶段我们还需要回答知识更新之后新版本是否可靠生效旧知识失效之后系统是否还会错误使用不同用户提问时权限范围能否得到保证模型生成的关键结论是否有适用的来源依据检索和模型服务出现异常时系统会怎样表现修改索引和 Prompt 后能否判断整体质量是否改善系统运行的性能与成本是否在业务能够接受的范围内这些问题并不要求我们使用最复杂的架构。恰恰相反它们要求我们知道哪些规则必须可靠执行哪些工作适合交给模型哪些复杂度值得投入哪些地方应该保持简单。这是我在研究企业 RAG 过程中逐渐形成的一个重要认识。最开始我更多关注怎样让模型从知识库里找到答案。后来我发现真正的工程工作还包括如何管理知识、维护版本、处理异常、校验证据以及在真实业务约束下持续提供服务。大模型解决的是理解与生成能力但企业 RAG 的可靠性需要由整个系统共同承担。如果让我用一句话总结这篇文章一个 RAG Demo 证明了模型能够使用企业知识一套成熟的企业 RAG则需要证明知识始终可管理、答案有依据、权限有边界、故障可恢复并且整套系统值得被长期使用。这也是为什么真正把 RAG 做成企业产品远比跑通一次检索和生成复杂。参考资料Microsoft — Design and Develop a RAG SolutionMicrosoft — RAG Preparation PhaseMicrosoft — Information Retrieval PhaseMicrosoft — RAG End-to-End EvaluationMicrosoft — Document-Level Access ControlOWASP — RAG Security Cheat Sheet本文涉及的架构方案为技术研究与工程设计讨论不代表全部方案已经在同一生产系统中落地。
RELATED

相关推荐

IPv4/IPv6寻址翻译器:从NAT64/DNS64原理到实战配置

IPv4/IPv6寻址翻译器:从NAT64/DNS64原理到实战配置

1. 从一个“翻译官”的困惑说起如果你翻过那本被网络工程师奉为圭臬的《TCP/IP详解》,大概率会在第2章“互联网地址架构”里卡一下。前面讲IPv4地址分类、子网掩码、CIDR,虽然枯燥但还能啃;到了2.5节“有特殊用途的地址”,突然冒出…

📅 2026/10/21 6:06:00
网格EA交易法:带止损纪律的机械仓位管理术

网格EA交易法:带止损纪律的机械仓位管理术

简介:本资源是一份面向中高级外汇交易者的系统性策略文档,聚焦于改进传统网格交易法的缺陷,提出融合MACD与RSI趋势判断、动态网格线触发、双向加仓与亏损控制机制的EA化交易逻辑。适用于MT4平台(如晋峰金银业STP环境)&…

📅 2026/10/21 6:06:00
网格EA交易法:ATR动态调参与几何加仓实战指南

网格EA交易法:ATR动态调参与几何加仓实战指南

简介:本资源是一份面向中高级外汇交易者的系统性策略文档,聚焦解决传统网格交易在单边行情中易爆仓的痛点,提出融合MACD与RSI趋势判断、动态网格线触发、双向加倍对冲机制的改良型网格EA交易法。适用于MT4平台(如晋峰金银业STP环境…

📅 2026/10/21 6:06:00
MORE NEWS

更多资讯

📰

知识工作插件化:构建可编程、可组合的智能工作流底座

1. 项目概述:这不是一个插件,而是一套知识工作者的“操作系统增强层”“knowledge-work-plugins”这个标题乍看像某个开源仓库的命名,但拆开来看——knowledge work(知识工作)、plugins(插件)—…

📰

SQL题目面试避坑指南:从读题拆解到查询优化全链路

写SQL题目刷了几年,也帮不少同学备过面试、带过新人,我最大的感受是:多数人不是不会写SQL,而是根本不知道一道SQL题目到底在考察什么。同一个查询,有人三行搞定,有人磨叽半小时还漏了边界;同一张…

📰

知识工作插件:面向知识工作者的模块化增强协议

1. 项目概述:这不是一个插件,而是一套知识工作者的“操作系统增强层”“knowledge-work-plugins”——光看这个名字,很多人第一反应是“又一个浏览器插件合集”或者“某款笔记软件的扩展包”。但在我过去三年深度参与多个知识管理系统的搭建与…

📰

SchoolDB四表DDL全解析:数据库设计从字段选择到约束实践

最近给团队做内部培训,我又把一套用了很多年的教学示例库脚本翻了出来——SchoolDB。场景很简单:一个学校管理系统,只有4张表:学生、教师、课程、选课。很多人觉得写DDL语句没什么技术含量,敲几行CREATE TABLE谁不会&a…

📰

订单表慢SQL优化实战:联合索引、覆盖索引与深分页方案

1. 场景回顾:慢SQL是怎么暴露出来的做订单系统的同学应该都有体会:订单表往往是整个业务库里面数据量增长最快、查询模式最多样、索引也最容易“被用坏”的一张表。这个实战项目来自某电商平台的中台订单模块,核心表trade_order存放全渠道的订…

📰

Python实战英雄联盟胜率预测:从数据清洗到SHAP模型解释

简介:LeaguePredictor 是一套面向电子竞技数据分析初学者与机器学习实践者的 Python 项目源码,聚焦英雄联盟比赛胜率预测这一具体场景,帮助读者理解如何把分类模型落地到真实赛事数据上。资源包共 24 个文件,以 22 个 py 脚本为主…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬