2026-07-15-使用RAG与上下文工程构建多模态AI系统

4331 个字
22 分钟
2026-07-15-使用RAG与上下文工程构建多模态AI系统

一、综述#

llm的能力局限#

每当将大模型应用于实际业务场景时发现,通用的基础大模型基本无法满足实际业务需求,主要有以下几方面原因:

知识截止:大模型自身的知识完全源于训练数据,而现有的主流大模型(deepseek、gpt、通义千问…)的训练集基本都是构建于网络公开的数据,对于一些实时性的、非公开的或私域的数据是没有。此外模型的训练数据有明确的时间边界,一旦问到边界之后的事情,比如"2025 年诺贝尔奖得主是谁",它便无从知晓,而 RAG 可以通过实时检索外部知识库来补上这段空白。

幻觉问题:所有的深度学习模型的底层原理都是基于数学概率,模型输出实质上是一系列数值运算,大模型也不例外,所以它经常会一本正经地胡说八道,尤其是在大模型自身不具备某一方面的知识或不擅长的任务场景。面对不确定的内容,模型倾向于"一本正经地编造"看似合理的答案,虚构出并不存在的论文或数据,而 RAG 让回答建立在检索到的真实文档之上,并且可以溯源。

领域知识缺失:企业的私有数据、专业领域的知识往往不在训练集里,像"公司上季度的销售额是多少"这样的问题模型根本答不上来,而 RAG 恰好能把企业知识库、文档系统连接进来。对于企业来说,数据安全至关重要,没有企业愿意承担数据泄露的风险,尤其是大公司,没有人将私域数据上传第三方平台进行训练会推理。这也导致完全依赖通用大模型自身能力的应用方案不得不在数据安全和效果方面进行取舍。

上下文窗口有限:即便模型支持 128K 乃至 1M token,也塞不下一个百万级文档的知识库,RAG 则通过精准检索,只把最相关的片段注入上下文。

RAG:检索增强生成#

RAG,全称Retrieval Augmented Generation(检索增强生成),其工作原理为:当用户提问时,系统先从海量知识库中检索出与问题相关的实时或私有信息,并将这些信息作为参考背景与问题一起提供给大模型,让模型像做开卷考试一样,基于提供的可靠证据生成更准确、实时且可溯源的回答。

https://arxiv.org/pdf/2005.11401 Facebook AI 2020 年提出 RAG 概念的开山之作,定义了「检索器 + 生成器」联合训练范式

RAG
RAG

RAG 的工作链路#

RAG 的工程链路通常分两个阶段:离线索引和在线检索生成。索引阶段把原始文档处理成可检索的数据结构;在线阶段在用户提问时完成查询理解、检索召回、上下文构建和答案生成。详细的实现会在之后进行说明。

索引阶段

输入文档:文本文件、PDF、网页、数据库记录等。

清理文档:去掉 HTML 标签、特殊字符等噪声。

增强文档:补充元数据,比如时间戳、分类标签,为后续检索提供过滤维度。

文档拆分(Chunking):用文本分割器把文档切成较小片段。这一步要兼顾语义完整性、Embedding 模型输入长度、生成模型上下文窗口和召回粒度。Chunk 太大容易引入噪声,太小又可能丢上下文。拆分策略会直接影响召回质量,详细可以看 RAG 文档处理篇。

向量化表示(Embedding Generation):通过嵌入模型将文本片段映射为语义向量,也就是高维稠密向量。常见嵌入模型包括 OpenAI 的 text-embedding-3-small / text-embedding-3-large,以及 Hugging Face 上的开源模型。

存储到向量存储或索引系统:把嵌入向量、原始内容和对应元数据存入向量存储或向量索引系统,比如 Milvus、pgvector、Elasticsearch / OpenSearch 向量检索,或基于 Faiss 构建本地向量索引。向量数据库选型、索引算法和 pgvector 实践可以看 RAG 向量库篇。

索引过程通常离线完成。团队每周跑一次定时任务,把新增和变更的文档重新索引一遍。如果是用户上传文档这类动态场景,索引也可以在线完成,直接集成到主应用里。

检索阶段

检索是在线进行的。用户提问之后,系统通常会走下面这些步骤:

接收请求:拿到用户的自然语言查询。有些系统会先做查询改写或扩充,让后续检索更容易命中。

查询向量化:用嵌入模型把查询也转成向量,这样才能和文档向量在同一个空间里比较。

信息检索(R):在向量库里做相似性搜索,把和查询向量最相关的文档片段捞出来。

上下文增强(A):把检索片段、原始问题、系统指令和引用要求组织成 Prompt,交给 LLM。

输出生成(G):LLM 输出自然语言回复,同时附上参考资料链接。

结果反馈:用户不满意时可以反馈,系统再调整 Prompt 或检索策略。有些实现也支持多轮对话来逐步完善回答。

检索效果不稳定时,问题往往出在查询改写、召回策略、排序或上下文质量上。

MCP:LLM 与后端数据和工具对话的协议层#

RAG解决的是"如何把外部知识喂给大模型"的问题,但是如果把视角从"知识"扩展到"能力"——让大模型不仅能读到数据,还能调用真实的业务功能时,就需要一个标准化的连接层,于是我们需要 MCP

MCP (Model Context Protocol,模型上下文协议)起源于 2024 年 11 月 25 日 Anthropic 发布的文章:Introducing the Model Context Protocol。其定义了应用程序和 AI 模型之间交换上下文信息的方式。这使得开发者能够以一致的方式将各种数据源、工具和功能连接到 AI 模型(一个中间协议层),就像 USB-C 让不同设备能够通过相同的接口连接一样。MCP 的目标是创建一个通用标准,使 AI 应用程序的开发和集成变得更加简单和统一。

用最简单的场景举例,设想我们的系统里有这样几个工具:一个用来获取库存订单数据,一个用来获取天气数据。这些工具原本只是后端内部的普通函数或接口,而 MCP 层的作用,就是把它们统一封装、暴露成大模型能够理解和请求的标准工具。于是后端就多了一个"工具层",里面登记着所有可供 LLM 调用的能力。

无论后端用的是 Java Spring 还是 Python Flask,技术栈差异并不重要,我们希望在后端沉淀出一批可被大模型调用的工具(Tools)

MCP 的调用流程#

以一个用户查询为例,整个链路是这样流转的:

  1. 前端发起请求。前端识别出"这是一个需要调用大模型的查询",于是把用户的查询发送出去,准备交给 LLM 处理。
  2. 后端把查询连同工具清单一起交给 LLM。这一步是关键:发给模型的不只是查询本身,还附带了 MCP 服务器当前可用的工具列表。这样 LLM 才能"知道"自己手上有哪些牌可打——比如它看到有一个"获取天气数据"的工具。
  3. LLM 判断并向 MCP 请求工具。如果模型判断回答这个问题需要天气数据,它就会向 MCP 层发出请求:"请给我调用天气数据工具的权限。"
  4. MCP 层执行工具并回传数据。MCP 层根据登记的功能真正去执行这个工具,取到数据后再把结果交回给 LLM。
  5. LLM 处理数据并生成回答。模型基于拿到的真实数据组织出最终回答。

另外,LLM 与 MCP 之间是一种双向通信:模型可以反复地"要工具、拿结果、再要工具",直到它认为信息足够为止。所有操作完成后,响应会沿原路返回——从 LLM 回到后端,再传到前端展示给用户。整个闭环可以概括为:

前端(发起查询)
│ 查询
后端 ──── 查询 + 工具清单 ────► LLM
▲ │ ①请求某个工具
│ ▼
│ MCP 层(工具:库存订单/天气数据…)
│ │ ②执行工具,回传数据
│ ▼
│ ◄──── 最终响应 ──── LLM(基于真实数据生成)
前端(展示结果)

MCP 服务器是如何运作的#

后端集成 MCP 背后有不少细节要处理。在一个最小可用 (MVP) 的实现里,主要围绕四个步骤展开:

注册工具

这一步是让模型就知道自己能做什么,所以初始阶段必须先把工具登记清楚。我们可以向 MCP 服务器注册大量工具,它们的来源五花八门 —— 可能是数据库里的数据,可能是某种数组或数据的加工处理,也可能是来自第三方 API 的实时数据。具体做法就是定义一个个网关函数,比如 "获取价格" 或 "查询数据库", 然后由 MCP 服务器把这些能力暴露给 AI 模型。

设置传输通道

这一步是在 LLM 与服务器之间建立起可靠的通信链路。先创建端点(通常基于 HTTP ),让大模型能通过一套标准化的协议与服务器通信。传输通道可以支持会话 (有状态), 也可以是无会话 (无状态) 的,这里可以看具体需求而定。

处理请求

服务器需要接收模型传来的工具调用请求, 执行对应的业务逻辑,最后把一个结构化的响应返回给模型。以 "获取天气" 的函数为例,无论它底层调用的是什么功能还是实时数据 API, 都要完成 "执行 — 取数 — 整理" 这套动作。这里有个关键点:LLM 对返回格式是有要求的,所以取到的数据不能原样丢回去,必须按模型能接受的特定格式组织好再传递。这套请求处理机制使得 LLM 与服务器之间才能进行双向交互,模型要什么工具,服务器就处理什么,来回协商,而不是一次性把所有事情做完。

把结果呈现给用户

当模型基于工具返回的数据生成了最终响应,还要把它和前端整合起来。无论前端是 Angular 还是 React, 或是别的技术栈,目的都是把结果流畅、无缝地展示给用户。至此,一条完整的 MCP 工作流就走完了:注册工具 → 设置传输 → 处理请求 → 展示结果。

以天气 MCP 服务器为例,假设我们有一个天气 MCP 服务器,它对外提供一个网关工具。当用户问出 "帮我看看天气" 这类问题时,大模型会判断需要外部数据,于是向 MCP 请求调用这个网关工具;网关在服务器侧完成处理,取到数据后整理成结构化响应,再回传给大模型;大模型拿到结果后,用自然语言把它组织出来 —— 比如 "伦敦现在气温多少度"—— 最终呈现在用户面前。整个过程里,大模型负责理解和表达,而实时数据的获取则完全依赖 MCP 工具, 两者各司其职,配合完成了一次看似简单、实则跨越了多层的问答。

RAG 与 MCP 的结合#

"静态、稳定、不常变" 的知识都是 RAG 的主场 —— 公司文档、产品目录、常见问题 (FAQ) 与售后文章、互联网知识库、历史记录等等。但一套架构再好也有边界,一旦需求需要从 API、数据库或文件里动态检索,RAG 就触及了它的局限:处理的是已被索引的静态内容,拿不到实时数据。这时候 MCP 就该登场与 RAG 配合使用,由它去调用外部 API、访问动态数据源,调度多个工具、编排 GPT、Gemini 等多个 LLM,承担所有工具与集成的中枢。

假设用户提出"把我的销售报告和今天的实时汇率对比一下。" 这个问题同时踩中了两条数据线:一条是存放在文档里的历史报告,另一条是随时变动的实时数据。设计的系统会这样拆解并处理:

首先,RAG 负责取回文档数据。应用通过检索流程,从文档存储 (比如 Firebase 里的文档) 中找到并召回相关的销售报告,这一步 RAG 的检索与重排 (re-ranking) 能力就发挥了作用,确保拿到的是最相关的内容。接着 MCP 工具负责取回实时数据。系统调用一个 MCP 工具,通过外部 API 获取当前的实时汇率。到这里两路数据都已就位。

然后进入上下文整合 (Context Integration)环节。系统把来自两个数据源的信息合并成一份完整的上下文,再交给大模型 (Deepseek,GPT) 去处理。模型同时看到了 "历史销售报告" 和 "实时汇率" ,才能给出一个有依据、贴合当下的响应, 准确性也随之大幅提升。

这套架构对任何想构建 AI 系统、既要用好自有数据、又要接入实时数据的公司来说都极具价值。落地到产品,用户只需和 AI 助手对话,就能拿到分散在文档、数据库、实时接口里的全部数据,提高结果的可靠性。

从"回答"到"行动":Agentic RAG 系统的诞生#

Agentic RAG系统(智能体系统),即 RAG 与 MCP 协同后诞生的、会自主决策与行动的应用。

当 RAG 和 MCP 协同运转时,应用就从被动应答进化到自主做决策、规划合理的步骤,并自动选用正确的工具的闭环。模型会自己判断"何时该从文档中检索信息",会综合所有已知事实进行推理,把多个工作流串联起来,完成一连串多步推理(multi-step reasoning)。它会通过 MCP 挑选正确的工具去执行动作;它还会维护对话历史,在需要时回溯过往的信息。类似O.G.A.S ,会主动采取行动去找到正确答案。这正是生成式智能体系统的内核。

很多产品早已把它落地。OpenAI 推出了名为 Atlas 的浏览器,基于它可以做网页搜索、获取实时数据,还能执行代码、进行多模型推理——检索、工具、推理在一个产品里被打通。GitHub Copilot 能在代码编辑器、终端和仓库里为你提供带上下文的编码帮助,大多数时候都能给出相当准确的结果。Gemini 通过底层的工具层( MCP 式的能力层)去获取实时信息——本质上是借助谷歌搜索拿到最新内容——并执行较复杂的操作,其内部集成了大量功能。可以预见,随着后续版本迭代,这类能力只会越来越强。智能体应用是未来,理解一个会思考、会行动的系统是怎样炼成的,并把这份认知应用到自己的系统里在现代软件工程中相当重要。

这些产品把检索、工具调用与自主推理结合在了一起,并且已经跑在真实的生产环境里。这一套完全可以在自己的应用中复刻:让 AI 查询我们自有的数据,只用一次提问,就从中提取、汇总出更多信息。

过去这几年,行业发生了巨大的变化,而这个方向正是需要主动构建能力、去适应市场的关键所在。如今相当一部分代码已经是借助 AI 完成的,如何与 AI 协作已经成为一项必备技能,不过当然要注意一下AI的安全风险和隐私风险。

从理论到实践#

从理论到实践逐步推进,最简单的,实现RAG并整合MCP工具,构建具备自主推理和多步骤流程的完整AI应用,后续的论述见下一篇文章

分享到社交平台

将本文分享给你的朋友们

2026-07-15-使用RAG与上下文工程构建多模态AI系统
https://zhongye1.github.io/posts/2026/2026-07-15-使用rag与上下文工程构建多模态ai系统/
作者
Zhongye
发布于
2026-07-15
版权声明
CC BY-NC-SA 4.0

评论

Profile Image of the Author
Zhongye
南漂中
公告
新的博客站!旧站点传送门 👇
音乐
专辑封面

音乐

暂无播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章数
144
分类数
14
标签数
205
总字数
423,694
运行天数
0
最后更新
0 天前
总访问量
42296
访客数
29212

目录