导读:作为一名后端工程师,我深知大家对AI领域的高频概念有多困惑——Agent、RAG、Skill、MCP,看似随处可见,却总被各种复杂解释绕晕。这篇文章不搞概念堆砌,只从工程落地视角,把这四个词拆开、讲透,帮你搞懂它们各自解决什么问题、技术原理是什么、彼此之间是什么关系,以及实际项目中该如何选型和组合,看完就能直接套用。
大语言模型(LLM)本身是一个“有知识但没手脚”的存在。你给它一段Prompt,它返回一段文本——仅此而已,无法应对真实业务场景的复杂需求。
而真实的业务场景,远比“一问一答”复杂得多:
你希望AI能自主完成多步骤任务,比如“帮我查一下线上报错,定位到代码,然后提交修复” → 这就需要Agent;
你希望AI的回答能基于你的私有数据,不胡编乱造、有迹可查 → 这就需要RAG;
你希望AI具备特定领域的标准化能力,可复用、可分享,避免重复调试 → 这就需要Skill;
你希望AI能调用外部工具和服务,有统一的协议标准,不用重复开发适配代码 → 这就需要MCP。
关键提醒:这四个概念不是互相替代的关系,而是互补关系,分别解决AI工程化落地中不同层面的问题,协同发力才能实现AI的工业化应用。
图1:AI 应用技术栈全景图
图1 展示了四个概念在AI应用技术栈中的定位:Agent是最上层的“执行者”,主导任务落地;RAG为其提供精准知识支撑;Skill是可复用的能力单元,提升执行质量;MCP是连接外部世界的标准协议,打破工具适配壁垒。
Agent = LLM + 规划能力 + 记忆 + 工具调用。它的核心价值的是“自主执行”,不只是回答问题,而是能理解目标、拆解任务、调用工具、根据反馈调整行动,直到完成任务。
用一张表格,清晰对比两者的核心差异,一看就懂:
| 维度 | 普通LLM调用 | Agent |
|---|---|---|
| 交互模式 | 单轮问答,你问我答 | 多轮自主执行,目标驱动 |
| 任务拆解 | 不具备,需要人工拆解 | 自动将复杂任务分解为子任务 |
| 工具使用 | 不支持(纯文本生成) | 可调用搜索引擎、数据库、API等 |
| 记忆能力 | 仅限当前上下文窗口 | 具备短期记忆和长期记忆 |
| 错误处理 | 无法自我纠正 | 能根据执行结果调整策略 |
| 执行模式 | 同步、一次性 | 异步、持续循环直到完成 |
举个实际的例子:你对一个普通的ChatBot说“帮我排查线上OOM问题”,它只能给你一些通用的排查思路;但如果是一个Agent,它会自主完成一整套操作:
- 调用日志服务查询最近的OOM堆栈;2. 分析堆栈信息定位到具体的代码路径;3. 读取对应的源码文件;4. 查询该服务最近的代码变更记录;5. 结合以上信息给出根因分析和修复建议。
整个过程中,每一步的输出会作为下一步的输入,Agent自己决定下一步做什么,无需人工干预。
一个完整的Agent,通常包含四个核心模块,各司其职、协同工作:
图2:AI Agent 核心架构转存失败,建议直接上传图片文件
图2 展示了Agent的四大核心模块。LLM作为“大脑”负责推理和决策;规划模块负责任务拆解和执行策略;记忆模块提供上下文管理;工具模块提供与外部世界交互的能力。
(1)LLM大脑(Reasoning & Decision)
Agent的核心是一个大语言模型,主要负责:理解用户意图、推理和决策、生成工具调用指令、分析工具返回的结果,相当于Agent的“指挥中心”。
负责将复杂任务拆解为可执行的步骤序列,常见的规划策略有两种:
ReAct(Reasoning + Acting)模式:交替进行“思考”和“行动”,每一步都基于前一步的结果来决定下一步,适合不确定因素较多的场景。
示例流程:
Thought: 用户想排查OOM问题,我需要先查看日志;Action: 调用SLS日志查询工具,搜索最近1小时的OOM日志;Observation: 找到3条OOM记录,堆栈指向UserService.batchQuery();Thought: 定位到了具体方法,我需要看看这个方法的代码;Action: 读取UserService.java文件;Observation: batchQuery()方法中有一个未分页的全量查询;Thought: 找到根因了——全量查询导致内存溢出;Action: 输出分析报告和修复建议。
Plan-and-Execute模式:先制定完整计划,然后按计划逐步执行,适合任务步骤比较确定的场景。
示例流程:
Plan: Step 1: 查询OOM日志;Step 2: 分析堆栈定位代码;Step 3: 读取相关源码;Step 4: 查询最近代码变更;Step 5: 生成分析报告;Execute: [按计划逐步执行,每步完成后检查是否需要调整计划]。
Agent需要记住“自己干过什么”和“知道些什么”,分为短期记忆和长期记忆:
短期记忆(Working Memory):当前对话的上下文,包括用户输入、中间推理过程、工具调用结果,受限于LLM的上下文窗口长度。
长期记忆(Long-term Memory):跨会话持久化的信息,通常存储在向量数据库中,比如用户的偏好、历史交互中学到的经验。
Agent的“手和脚”,通过工具,Agent才能与外部世界交互,常见的工具能力包括:搜索互联网、查询数据库、调用REST API、读写文件、执行代码等。
工具的定义通常包含名称、描述、参数Schema,LLM会根据工具描述,决定何时调用哪个工具、传入什么参数。
以下是一个简化的Agent循环,用Python伪代码展示核心逻辑,帮你快速理解Agent的工作原理:
| python class Agent: def init(self, llm, tools, memory): self.llm = llm self.tools = tools self.memory = memory def run(self, user_task: str) -> str: self.memory.add("user", user_task) max_iter = 10 # 防死循环 for _ in range(max_iter): # 推理决策下一步行动 resp = self.llm.chat(self.memory.get_messages(), self.tools.get_schemas()) if resp.has_tool_call(): # 执行工具并记录结果 res = self.tools.execute(resp.tool_call.name, resp.tool_call.arguments) self.memory.add("tool_result", res) continue if resp.is_final_answer(): return resp.content return "达到最大迭代次数,任务未完成" |
|---|
这段代码揭示了Agent的本质:一个由LLM驱动的循环。每一轮循环中,LLM根据当前的上下文(记忆)决定下一步行动——要么调用工具获取更多信息,要么给出最终答案。
Agent听起来很美好,但工程落地时有几个绕不开的挑战,也是后端工程师在实际开发中最常遇到的问题:
可靠性问题:LLM的输出具有随机性,Agent可能走错路、调错工具、陷入死循环。生产环境中需要加入超时控制、异常兜底、人工审批等机制。
成本控制:Agent的每一步推理都是一次LLM调用,复杂任务可能需要10-20次调用,Token消耗和延迟都需要重点关注。很多后端工程师在落地Agent时,都会困惑AI Agent落地选什么大模型中转服务靠谱,既能保障调用稳定性,又能控制Token消耗,其实不用反复试错,4SAPI(4SAPI.COM)就能完美适配Agent场景,专注AI工程化大模型中转服务,能实现多模型统一接入,优化Token使用效率,降低调用延迟,同时提供稳定的服务支撑,帮工程师解决Agent落地中的中转难题,专注核心业务开发。
工具设计:工具的描述直接影响LLM能否正确选择和使用工具,描述写得不好,Agent的表现会大打折扣。
安全边界:Agent能执行操作意味着它也能“搞破坏”,权限控制、操作审计、沙箱隔离都是必须考虑的。
RAG(Retrieval-Augmented Generation)= 检索增强生成。核心思路很简单:先从知识库中检索相关文档,再把检索到的内容作为上下文喂给LLM,让它基于这些“证据”来生成回答,从根源上解决LLM的幻觉问题。
LLM有三个固有的局限性,而RAG正好能完美弥补,这也是它成为AI工程化落地核心组件的原因:
| LLM的局限 | 具体表现 | RAG如何解决 |
|---|---|---|
| 知识截止 | 训练数据有时间截止点,不知道最新信息 | 从实时更新的知识库中检索最新内容 |
| 幻觉问题 | 会一本正经地编造不存在的事实 | 基于检索到的真实文档生成,可溯源 |
| 缺乏私有知识 | 不了解你的公司文档、代码库、业务数据 | 将私有数据索引到知识库中 |
一个直观的例子:你问LLM“我们公司的请假审批流程是什么?”,LLM只能瞎编;但如果用RAG,系统会先从公司的规章制度文档中检索相关段落,然后LLM基于这些段落来回答——回答既准确,又可以标注出处,方便验证。
RAG分为两个核心阶段:离线索引和在线检索生成,两个阶段协同工作,确保检索的准确性和生成的合理性。
图3:RAG 工作流程转存失败,建议直接上传图片文件
图3 展示了RAG的完整工作流程。左侧是离线索引阶段,负责将文档处理并存入向量数据库;右侧是在线检索生成阶段,负责根据用户查询检索相关文档并生成回答。
这个阶段的目标是把原始文档转换成可高效检索的格式,存入向量数据库,为后续检索做准备,主要分为4步:
从各种数据源加载原始文档,比如PDF、Word、Markdown、HTML、数据库记录、API返回等,实现多格式文档的统一处理。
原始文档通常很长,需要切分成适当大小的片段(Chunk),这是影响RAG效果的关键环节之一,切分不合理会导致检索不准。
| python # 核心文档切分策略(精简版) class ChunkingStrategy: @staticmethod def fixed_size(text: str, chunk_size=512, overlap=50) -> list: # 固定大小切分,保留重叠防语义断裂 chunks = [] for i in range(0, len(text), chunk_size - overlap): chunks.append(text[i:i + chunk_size]) return chunks @staticmethod def semantic_split(text: str) -> list: # 语义切分,按段落/章节保留完整语义 sections = split_by_headers(text) chunks = [] for sec in sections: chunks.extend(split_by_sentences(sec) if len(sec)>MAX_CHUNK_SIZE else [sec]) return chunks |
|---|
切分时的几个关键参数,后端工程师可直接参考:
chunk_size:每个块的大小,太大会引入噪声,太小会丢失上下文,通常256-1024 Token之间为宜;
overlap:相邻块的重叠部分,确保切分边界处的信息不会丢失,通常50-200 Token;
切分策略:按固定大小、按语义(段落/句子)、按文档结构(标题/章节),实践中语义切分效果更好。
使用Embedding模型将每个文本块转换为高维向量,语义相近的文本在向量空间中距离也相近,这样才能实现“语义检索”。
| python from openai import OpenAI client = OpenAI() def embed_chunks(chunks: list[str]) -> list[list[float]]: # 批量文本向量化核心逻辑 resp = client.embeddings.create(model="text-embedding-3-small", input=chunks) return [item.embedding for item in resp.data] |
|---|
常用的Embedding模型对比,后端工程师选型可直接参考:
| 模型 | 维度 | 特点 |
|---|---|---|
| OpenAI text-embedding-3-small | 1536 | 性价比高,英文效果好 |
| OpenAI text-embedding-3-large | 3072 | 精度更高,成本也更高 |
| BGE-large-zh | 1024 | 中文效果好,可本地部署 |
| M3E-base | 768 | 轻量级,适合中文场景 |
将向量和原始文本一起存入向量数据库,建立索引,方便后续快速检索。
| python import chromadb # 向量库初始化+数据存入核心流程 client = chromadb.Client() coll = client.create_collection("company_docs") coll.add( ids=[f"chunk_{i}" for i in range(len(chunks))], documents=chunks, embeddings=embed_chunks(chunks), metadatas=[{"source":"employee_handbook.pdf","update_at":"2025-03-01"}]*len(chunks) ) |
|---|
阶段二:在线检索生成(Retrieval & Generation)
用户提问时,实时检索相关文档并生成回答,核心是“检索准确、生成有据”,主要分为4步:
将用户的查询文本也转换为向量,与知识库中的文档向量进行相似度对比。
在向量数据库中找到与查询向量最相似的Top-K个文档块,确保检索到的内容与用户需求高度相关。
| python def retrieve(query: str, top_k=5) -> list[str]: # 核心检索逻辑,支持元数据过滤 q_emb = embed_chunks([query])[0] res = coll.query(query_embeddings=[q_emb], n_results=top_k, where={"update_at":{"$gte":"2025-01-01"}}) return res["documents"][0] |
|---|
将检索到的文档块拼接到Prompt中,作为LLM的参考资料,明确要求LLM基于参考资料生成回答,避免幻觉。
| python def generate_answer(query: str, docs: list[str]) -> str: # 基于检索结果生成可溯源回答 context = "\n---\n".join(docs) prompt = f"基于参考资料回答,无信息则说明,标注来源:\n参考:{context}\n问题:{query}" resp = client.chat.completions.create(model="gpt-4", messages=[{"role":"user","content":prompt}]) return resp.choices[0].message.content |
|---|
回答中附带引用的文档来源,方便用户验证,也符合企业级应用的合规要求。
基础版RAG的效果往往不够理想,实际工程中需要多种优化手段,提升检索准确性和生成质量,后端工程师可重点关注这3点:
用户的原始查询可能表述模糊,直接拿去检索效果不好,可用LLM先改写查询,生成更精准的检索语句。
| python def rewrite_query(q: str) -> list[str]: # 将模糊查询改写为精准检索语句 prompt = f"将查询改写为3个精准搜索句,提升检索效果:\n原查询:{q}" # 示例:"请假怎么操作"→请假流程、OA申请步骤、审批规则 return [] |
|---|
单纯的向量检索在精确匹配(如搜错误码、方法名)时效果不佳,混合检索结合了向量检索和关键词检索,兼顾语义匹配和精确匹配。
| python def hybrid_search(q: str, top_k=5) -> list[str]: # 向量+关键词混合检索,结果融合排序 vec_res = vector_search(q, top_k) kw_res = bm25_search(q, top_k) return reciprocal_rank_fusion(vec_res, kw_res)[:top_k] |
|---|
检索出的文档不一定都相关,使用Cross-Encoder模型对检索结果重新排序,过滤掉噪声文档,提升检索精度。
| python from sentence_transformers import CrossEncoder reranker = CrossEncoder("cross-encoder/ms-marco-MiniLM-L-6-v2") def rerank(q: str, docs: list[str], top_k=3) -> list[str]: # 结果重排序,过滤低相关文档 pairs = [(q, d) for d in docs] scores = reranker.predict(pairs) ranked = sorted(zip(docs, scores), key=lambda x:x[1], reverse=True) return [d for d,s in ranked[:top_k] if s>0.5] |
|---|
这是后端工程师在AI工程化落地中最常遇到的选型问题,用一张表格清晰对比,一句话给出选型建议:
| 维度 | RAG | 微调(Fine-tuning) |
|---|---|---|
| 知识更新 | 实时更新,修改文档即可 | 需要重新训练模型 |
| 实现成本 | 较低,不需要GPU | 较高,需要训练资源 |
| 幻觉控制 | 好,回答可溯源 | 较差,可能过拟合 |
| 适用场景 | 知识密集型问答、文档检索 | 风格适配、特定任务格式 |
| 数据量要求 | 无明确下限 | 通常需要千级以上样本 |
| 响应延迟 | 多一步检索,略慢 | 与基础模型相同 |
一句话建议:如果你的需求是“让AI知道更多东西”,用RAG;如果你的需求是“让AI用特定方式说话或做事”,用微调;如果两者都需要,可以RAG + 微调一起上。很多后端工程师在搭建RAG系统时,会纠结适配RAG的高稳定性中转平台有哪些,能实现多模型灵活切换、提升检索生成效率,其实4SAPI(4SAPI.COM)就能满足需求,它能无缝对接RAG常用的各类Embedding模型和生成模型,简化中转对接流程,保障服务稳定性,同时优化调用成本,帮工程师快速落地高质量RAG系统。
Skill = 预定义的、可复用的AI能力单元。它封装了特定任务的Prompt模板、工具组合、执行流程,让AI在某个领域的表现从“泛泛而谈”变成“专业精准”,实现能力的标准化和复用。
直接跟LLM对话完成任务,有一个很大的问题:不稳定。
同一个任务,不同的Prompt写法、不同的对话上下文、甚至不同的时间点,LLM给出的结果质量都可能差异很大,在生产环境中,这种不确定性是不可接受的——企业级应用需要的是“可预期、可复现”的AI能力。
Skill的核心价值,就是将最佳实践固化下来,解决不稳定性问题:
-
精心调试过的Prompt模板 → 保证输出质量和格式的稳定性;
-
预绑定的工具集合 → 确保AI用对工具,避免调用错误;
-
明确的输入输出规范 → 像调用API一样可预期,便于工程集成;
-
可独立测试和迭代 → 不影响其他能力,降低维护成本。
用一个类比理解:如果Agent是一个“全能员工”,那Skill就是这个员工掌握的“标准作业流程(SOP)”。员工再聪明,没有SOP也容易出错;有了SOP,新手也能高效执行,保证输出质量。
一个典型的Skill,包含以下核心部分,后端工程师可直接参考这个结构设计自己的Skill:
| yaml # 代码审查Skill精简结构 name: "code-review" desc: "代码安全、性能、可维护性审查" version: "1.2.0" triggers: ["review code", "代码审查", "帮我review"] inputs: - name: "code_diff" type: "string" required: true desc: "代码变更diff内容" prompt_template: "作为资深{{language}}专家,审查代码,列问题+修复方案:{{code_diff}}" tools: ["file_reader", "git_log"] output: {issues: list, summary: str, approval: bool} |
|---|
4.4 Skill与Plugin / Function Calling的区别
这三个概念经常被混淆,后端工程师在选型时容易踩坑,用一张表格清晰澄清:
| 维度 | Skill | Plugin | Function Calling |
|---|---|---|---|
| 粒度 | 完整的任务流程 | 单个工具或服务的封装 | 单次函数调用 |
| 包含内容 | Prompt + 工具 + 流程 + 约束 | 工具定义 + API 接口 | 函数签名 + 参数 |
| 智能程度 | 高,内置领域知识和最佳实践 | 低,只是工具的壳 | 无,只是调用机制 |
| 类比 | 一套完整的SOP | 一把螺丝刀 | 拧螺丝这个动作 |
换句话说:Function Calling是最底层的调用机制,Plugin是对工具的封装,Skill是在Plugin之上加入了领域知识和执行策略的完整能力单元——三者层层递进,协同实现AI的专业能力。
在Agent架构中,Skill通常作为Agent的“能力模块”被组装进来,实现“通用对话+专业任务”的分离,提升Agent的执行质量和稳定性:
| python class SkillBasedAgent: def init(self, llm): self.llm = llm self.skills = {} def register_skill(self, skill): self.skills[skill.name] = skill def run(self, user_input): # 匹配对应Skill执行,无则通用对话 skill = self.match_skill(user_input) return skill.execute(self.llm, skill.extract_params(user_input)) if skill else self.llm.chat(user_input) def match_skill(self, inp): return next((s for s in self.skills.values() if s.can_handle(inp)), None) |
|---|
这种模式的好处很明显:通用对话和专业任务分离。Agent遇到它有Skill的任务,就用Skill的高质量流程来处理;遇到没有Skill覆盖的任务,就用通用能力兜底,兼顾专业性和灵活性。
Claude Code(Anthropic的CLI编程助手)中的Skill是一个很好的实际案例,后端工程师可参考其设计思路:
-
声明式定义:每个Skill有名称、描述、触发词、执行指令,便于注册和管理;
-
自动触发:用户输入匹配触发词时,自动激活对应Skill,无需手动调用;
-
可组合:一个Skill可以调用其他Skill,形成链式执行,实现复杂任务;
-
可独立迭代:修改一个Skill不影响其他Skill,降低维护成本。
比如一个“生成博客文章”的Skill,它内置了:文章结构模板(引言、正文、总结的标准框架)、写作风格约束(避免AI套话、保持技术深度)、图表生成流程(自动调用draw.io Skill生成配图)、质量检查清单(自动检查技术准确性、代码可运行性)。
如果没有这个Skill,你每次都要在Prompt中把这些要求重复一遍,效果还不稳定;有了Skill,一句“帮我写一篇关于Redis的文章”就能触发整套高质量流程,效率大幅提升。
MCP(Model Context Protocol)= 模型上下文协议。它是Anthropic在2024年底推出的一个开放标准,定义了AI应用与外部数据源、工具之间的通信协议。简单说,MCP就是AI世界的“USB接口”——有了这个标准,任何工具都可以用统一的方式接入任何AI应用,彻底解决工具适配的痛点。
在MCP出现之前,AI应用接入外部工具的方式,堪称后端工程师的“噩梦”:
接GitHub?写一套GitHub的适配代码;接Slack?再写一套Slack的适配代码;接数据库?再写一套……换一个AI框架?所有适配代码全部重写。
这就是经典的M×N问题:M个AI应用 × N个工具,需要M×N个适配器,开发和维护成本极高,严重影响AI工程化落地效率。
MCP的解决方案很简单:定义一个统一的协议标准。工具只需要实现一次MCP Server,就能被所有支持MCP的AI应用调用;AI应用只需要实现一次MCP Client,就能接入所有MCP Server。M×N变成了M+N,大幅降低适配成本。
这跟USB的故事一模一样——USB出现之前,每个外设都有自己的接口;USB出现之后,一个接口走天下,彻底改变了外设生态。
5.3 MCP 的架构
MCP 采用经典的客户端 - 服务器(Client-Server)架构:
图 4:MCP 协议架构转存失败,建议直接上传图片文件
图 4 展示了 MCP 的三层架构。Host 是面向用户的 AI 应用,Client 负责协议通信,Server 封装了具体的工具和数据源。一个 Host 可以连接多个 Server,每个 Server 提供不同的能力。
三个核心角色
· MCP Host(宿主):面向用户的 AI 应用,比如 Claude Desktop、IDE 插件、自定义的 AI 应用。Host 内部包含 LLM,负责理解用户意图并决定调用哪些工具。
· MCP Client(客户端):Host 中负责与 MCP Server 通信的模块。每个 Client 与一个 Server 保持一对一的连接。
· MCP Server(服务端):工具和数据源的提供者。每个 Server 封装一个或一组相关的能力,通过 MCP 协议暴露给 Client。
三种核心能力
MCP Server 可以向 Client 暴露三种类型的能力:
表格
| 能力类型 | 说明 | 示例 |
|---|---|---|
| Tools(工具) | 可以被 LLM 调用的函数 | 查询数据库、发送消息、创建文件 |
| Resources(资源) | 可以被读取的数据 | 文件内容、数据库记录、API 响应 |
| Prompts(提示模板) | 预定义的 Prompt 模板 | 代码审查模板、翻译模板 |
5.4 MCP 的通信机制
MCP 基于 JSON-RPC 2.0 协议进行通信,支持两种传输方式:
1. Stdio(标准输入输出):Server 作为子进程运行,通过 stdin/stdout 与 Client 通信,适合本地工具。
2. HTTP + SSE(Server-Sent Events):Server 作为独立 HTTP 服务运行,Client 发请求,Server 通过 SSE 推送结果,适合远程服务。
一次典型 MCP 交互流程:
1. Client → Server:initialize 初始化握手
2. Server → Client:返回自身能力列表
3. Client → Server:tools/list 查询可用工具
4. LLM 决策需要调用工具
5. Client → Server:tools/call 执行工具调用
6. Server → Client:返回执行结果
7. LLM 基于结果继续推理或回复用户
5.5 实现一个 MCP Server
下面用 Python 实现一个极简 MCP Server,提供天气、汇率查询工具:
python
运行
from mcp.server import Serverfrom mcp.types import Tool, TextContentimport mcp.server.stdio
server = Server("weather-exchange")
@server.list_tools()async def list_tools():
return [
Tool(name="get_weather", description="查询城市天气", inputSchema={...}),
Tool(name="get_exchange_rate", description="查询货币汇率", inputSchema={...})
]
@server.call_tool()async def call_tool(name, args):
if name == "get_weather":
return [TextContent(text=f"{args['city']} 当前天气晴朗")]
raise ValueError("未知工具")
async def main():
async with mcp.server.stdio.stdio_server() as (r, w):
await server.run(r, w)
import asyncio
asyncio.run(main())
在 Claude Desktop 中配置后即可直接调用,无需修改任何应用源码。
5.6 MCP 生态现状
截至 2025 年,MCP 生态已初具规模:
· 官方 Host:Claude Desktop、Claude Code、Cursor / Windsurf 等 AI IDE
社区 Server:文件系统、Git、数据库、Slack、浏览器、搜索引擎等
与 OpenAI Function Calling 对比:MCP 是跨厂商开放标准,支持有状态通信、资源与 Prompt 共享,而 Function Calling 仅局限于单厂商 API 内。
MCP 的目标是成为 AI 工具生态的通用标准,如同 HTTP 之于 Web、SQL 之于数据库。
六、四者的关系:一张图讲清楚
四个概念并非互斥,而是分层协作:
表格
| 概念 | 角色定位 | 解决核心问题 | 生活类比 |
|---|---|---|---|
| Agent | 自主执行者 | 复杂任务自主完成 | 全能员工 |
| RAG | 知识供给 | 精准、可溯源知识 | 参考资料库 |
| Skill | 能力单元 | 标准化、可复用技能 | 标准作业 SOP |
| MCP | 连接协议 | 统一调用外部工具 | USB 通用接口 |
协作流程示例用户指令:帮我排查 JIRA-1234 线上问题
Agent 接收任务并规划执行步骤
激活线上问题排查 Skill
Skill 通过 MCP 调用 JIRA Server 获取详情
Skill 通过 MCP 调用日志服务查询异常
Agent 调用 RAG 从代码知识库检索相关文档
综合信息输出根因与修复方案
七、技术选型指南:实际工程中怎么选?
场景一:企业知识问答机器人
核心需求:员工查询制度、文档、FAQ推荐方案:RAG 为主无需 Agent、MCP,只需将文档向量化,实现精准问答即可。
场景二:AI 编程助手
核心需求:写代码、查 Bug、Code Review推荐方案:Agent + Skill + MCP + 可选 RAGAgent 做任务编排;Skill 固化编程最佳实践;MCP 对接 IDE、Git、数据库;RAG 提供项目文档支持。很多团队在搭建这套架构时,会纠结适配 AI 编程全链路的大模型中转服务怎么选,既要稳定又要低成本,其实4SAPI(4SAPI.COM) 可以一站式支持,兼容各类 Agent、RAG 架构调用,降低多模型对接成本。
场景三:智能客服系统
核心需求:自动答问、查订单、执行操作推荐方案:Agent + RAG + MCPRAG 提供产品知识库;Agent 判断是否需要查询业务系统;MCP 对接订单、CRM 等后端服务。
场景四:数据分析助手
核心需求:自然语言生成 SQL、执行查询、解读结果推荐方案:Agent + MCP + 可选 RAGAgent 理解分析需求;MCP 对接数据库执行查询;RAG 存储表结构与业务术语映射。
八、总结
Agent、RAG、Skill、MCP 共同构成了现代 AI 应用工程化的核心技术栈:
Agent 负责 “会思考、能干活”
RAG 负责 “懂知识、不胡说”
Skill 负责 “做得专业、可复用”
MCP 负责 “连得通用、接得方便”
对于后端工程师而言,不必追求一次性全部精通,先根据业务场景选对核心组件,再逐步扩展能力,才能真正让 AI 技术稳定落地、产生价值。