1. 项目概述:一次高强度实习面试引发的技术反思
前几天面了个实习,过程挺有意思。面试官问的问题,从基础的CRUD一路问到RAG、Agent、MCP、Skill这些听起来就有点“硬核”的概念。面到最后,我实在没忍住,半开玩笑地反问了一句:“哥,咱就面个实习,至于上这么大强度吗?”面试官笑了笑,回了一句:“你对RAG、Agent、MCP、Skill理解得很到位,所以要求高一点。”这句话让我琢磨了很久。回来复盘,我发现这场面试其实精准地勾勒出了当前AI应用开发,特别是大模型落地实践中的一个核心趋势:从单点工具到智能体生态的演进。这不再仅仅是调用个API写个Prompt那么简单,而是要求开发者具备系统性的架构思维,理解如何让AI真正“干活”。这篇文章,我就结合这次面试的拷问和我的理解,把这几个关键概念掰开揉碎了讲清楚,聊聊它们到底是什么、怎么用、以及为什么现在企业对实习生的要求都这么“卷”了。
简单来说,这场面试考察的不是你会不会用某个库,而是你是否能看清技术演进的脉络。RAG解决了大模型“一本正经胡说八道”的幻觉问题,是给AI装上了一个可靠的外部知识库。Agent让AI从“问答机”变成了能自主规划、使用工具的“执行者”。而MCP和Skill,则是构建这个智能体生态的“基础设施”和“技能包”,它们定义了工具如何被标准化地接入、管理和调用。理解这套组合拳,意味着你能从更高的维度思考如何设计一个真正有用、可控、可扩展的AI应用。无论你是正在找工作的学生,还是想转型AI应用的开发者,搞懂这几个概念及其关联,都是当前非常硬核的竞争力。
2. 核心概念深度拆解:从RAG到智能体生态
面试官把这几个词放在一起问,绝非偶然。它们代表了构建实用化AI系统的四个关键层级,环环相扣。我们先从最基础的RAG开始,层层递进。
2.1 RAG:给大模型装上“外部记忆”
RAG,检索增强生成,可以说是当前让大模型落地应用最核心、最实用的技术之一。它的核心思想非常直观:大模型本身的知识是静态的、可能过时的,并且缺乏你私有的、特定的数据(比如公司内部文档、最新的产品手册)。RAG通过引入一个检索系统,在模型生成答案前,先从你的知识库(比如一堆PDF、网页、数据库)里找到最相关的信息片段,然后把“问题”和“检索到的相关信息”一起交给大模型,让它基于这些确凿的证据来生成答案。
这就好比一个学识渊博但记忆模糊的专家(大模型),你问他一个专业问题,他不会直接凭印象回答,而是先让你去他的专用档案室(向量数据库)里,根据问题的关键词找出几份最相关的文件(检索),他把这些文件快速浏览一遍后,再结合自己的学识,给你一个准确、有据可查的答复(生成)。这个过程极大地缓解了模型的“幻觉”问题,并使其能够处理私有、实时数据。
实操中的核心细节:
- 文档处理与分块:这不是简单地把整篇文档扔进去。你需要根据文档结构(如Markdown标题、段落)进行智能分块,块的大小和重叠度是关键参数。块太大,检索精度低;块太小,可能丢失上下文。通常,我会尝试256-512个token的块大小,并设置10%左右的重叠。
- 向量化与检索:将文本块通过嵌入模型(如
text-embedding-3-small)转化为向量,存入向量数据库(如Chroma、Pinecone、Weaviate)。检索时,将问题也向量化,通过计算余弦相似度找到最相似的几个块。这里要注意,简单的相似度检索可能不够,高级的RAG系统会引入重排序技术,即先用简单的检索器召回一批候选文档(比如100个),再用一个更精细但更耗资源的交叉编码器模型对这100个结果进行精排,选出Top-3最相关的,这能显著提升最终答案的质量。 - 提示工程:递给大模型的Prompt需要精心设计。一个经典的模板是:“基于以下上下文信息,回答用户的问题。如果上下文信息不足以回答问题,请直接说‘根据提供的信息无法回答’。上下文:{检索到的文档} 问题:{用户问题}”。这个模板强制模型基于上下文作答,并给了它“拒绝回答”的出口,增强了可控性。
注意:RAG不是银弹。如果知识库本身质量差、检索不准,或者模型无法正确理解检索到的多篇文档之间的关联,依然会得到糟糕的答案。构建RAG系统,数据清洗、分块策略和检索质量评估是持续的工作。
2.2 Agent:从“问答”到“执行”的范式跃迁
如果说RAG是增强了模型的“知识”,那么Agent则是赋予了模型“行动”的能力。一个智能体(Agent)通常由几个核心部分组成:一个“大脑”(通常是LLM),一个“记忆”模块(用于存储对话历史和上下文),一个“工具集”(Tools,比如搜索、计算、执行代码、操作API),以及一个“规划与推理”循环。
智能体的工作流程可以概括为:感知(接收用户指令)-> 规划(拆解任务,决定步骤)-> 行动(调用合适的工具)-> 观察(获取工具返回结果)-> 循环,直到任务完成或无法继续。例如,用户说“帮我分析一下上周我们产品在社交媒体上的口碑趋势”。一个简单的Chatbot可能就干瞪眼了。但一个智能体会这样工作:1. 规划:需要先获取数据,然后进行分析。2. 行动:调用“搜索Twitter API”工具,获取上周的推文;调用“情感分析API”工具,分析推文情感。3. 观察:收到原始数据和情感分数。4. 再次规划:需要将结果可视化。5. 行动:调用“生成图表”工具,输入数据。6. 最终将图表和分析摘要返回给用户。
框架选择与开发要点:目前主流的Agent开发框架有LangChain、LlamaIndex、Semantic Kernel等,新兴的如CrewAI、AutoGen也各具特色。LangChain生态繁荣,组件多,但有时显得臃肿;LlamaIndex在RAG方面非常专注;Semantic Kernel与微软系产品集成好。
在开发一个Agent时,最关键的是工具的定义。你需要将每一个可执行的操作(如查询数据库、发送邮件、调用某个内部API)封装成一个标准的工具函数,并为其提供清晰、结构化的描述。这个描述至关重要,因为LLM就是靠阅读这些描述来决定在什么情况下调用哪个工具。例如,一个“查询天气”的工具,其描述应该是:“根据提供的城市名称,查询该城市当前的天气情况和温度。输入参数:city(字符串,城市名)。” 而不是简单的“获取天气”。
2.3 MCP:智能体的“通用工具插槽”
MCP,即模型上下文协议,这是一个由Anthropic提出的开放协议。你可以把它理解为智能体世界的“USB-C标准”。在MCP出现之前,每个Agent框架(LangChain、LlamaIndex等)都有自己的一套定义和调用工具的方式,如果你想给一个基于LangChain的Agent增加一个新工具,你需要用LangChain的方式去写适配代码,换一个框架就得重写。
MCP的目标就是解决这个碎片化问题。它定义了一套标准化的协议,用于在服务器(提供工具)和客户端(使用工具的AI应用,如Claude Desktop、Cursor IDE)之间进行通信。任何实现了MCP协议的服务器,都可以作为一个工具源,向任何支持MCP的客户端暴露其工具。这意味着,工具开发者只需要写一次MCP服务器,这个工具就可以被所有兼容MCP的AI应用使用。
MCP的核心价值在于生态和解耦:
- 对工具开发者:只需关注工具本身的逻辑,用任何语言(Node.js, Python, Go等)实现一个MCP服务器,定义好工具列表和对应的执行函数即可。
- 对AI应用开发者:无需关心工具的具体实现,只需要让你的应用能连接MCP服务器,就能动态地获取和使用这些工具。例如,你可以有一个“代码仓库操作”MCP服务器、一个“数据库查询”MCP服务器、一个“内部业务系统”MCP服务器,然后在你的AI Agent中按需连接它们。
- 对终端用户:可以在像Claude Desktop、Cursor这样的AI助手客户端中,轻松配置多个MCP服务器,瞬间扩展助手的能力边界。比如,配置一个GitHub MCP服务器,你的Claude就能帮你读代码、创建PR;配置一个SQLite MCP服务器,它就能直接查询你的本地数据库。
面试中被问到的“搜索类MCP服务器(如tavily-mcp、brave-search-mcp)添加进Codex的详细步骤”,其本质就是遵循MCP协议,将搜索能力标准化地接入AI环境的过程。步骤通常包括:1. 安装或部署对应的MCP服务器(可能是一个Python包或一个独立服务)。2. 在Codex(或类似客户端)的配置文件中,添加该MCP服务器的连接信息(如服务器类型sse或stdio,以及对应的命令或URL)。3. 重启客户端,客户端会自动发现并加载该服务器提供的所有搜索工具。
2.4 Skill:封装好的“即插即用”能力包
Skill(技能)这个概念在不同语境下略有差异,但核心思想是一致的:它是比单个Tool(工具)更高级、更完整的能力封装。一个Skill可能包含多个协同工作的Tools,以及预设的Prompt模板、工作流程和最佳实践。
例如,一个“数据分析”Skill,可能内部封装了:1. 从数据库拉取数据的Tool。2. 进行数据清洗和预处理的Tool(或代码片段)。3. 几种常见图表(折线图、柱状图)的生成Tool。4. 一份指导LLM如何分步进行数据分析的Prompt系统指令。当你激活这个Skill后,AI Agent就获得了完成一个端到端数据分析任务的全部“知识”和“能力”。
在一些平台(如阿里的Comate、一些低代码AI平台)中,Skill更像是一个可市场化的插件。开发者可以将自己开发的、解决特定问题的Agent能力打包成一个Skill,发布到市场。其他用户可以直接“安装”这个Skill,无需了解内部细节,就能让他们的AI助手拥有这项能力。这极大地促进了AI应用能力的复用和生态繁荣。
Skill与Tool、MCP的关系:
- Tool:是最基础的原子操作,如“加法运算”、“发送HTTP请求”。
- MCP:是Tool的标准化“输送管道”和“通信协议”。它规定了Tool如何被描述、被发现、被调用。
- Skill:是基于一个或多个Tool(可能通过MCP接入),结合特定工作流和Prompt模板,构建的面向具体场景的解决方案。你可以把一个Skill看作一个“智能工具箱”或一个“微型专家系统”。
3. 技术栈串联与实战架构设计
理解了单个概念,我们来看看如何把它们串起来,设计一个实实在在的系统。面试官问这些,绝不是希望你只会背定义,而是期待你能勾勒出一个可落地的架构。我们以一个“智能研发助手”为例,它需要能回答技术问题(基于公司内部Wiki)、能编写和审查代码、能操作Git仓库。
3.1 架构蓝图:分层与协作
整个系统可以设计为如下分层架构:
能力接入层(MCP层):这是系统的“手”和“脚”。我们部署或连接多个MCP服务器,将各种基础能力标准化。
- 知识库MCP服务器:封装对公司内部文档、API手册、技术Wiki的RAG查询能力。输入问题,返回相关的文档片段。
- 代码仓库MCP服务器:封装Git操作,如读取文件、查看提交历史、创建分支、提交代码等。
- 开发工具MCP服务器:封装命令行操作、文件系统读写、运行测试、调用Linter(代码检查工具)等。
- 外部搜索MCP服务器:连接Tavily或Brave Search,获取最新的公开技术资讯和解决方案。
智能核心层(Agent层):这是系统的“大脑”。我们构建一个主Agent,其核心是一个强大的LLM(如GPT-4、Claude 3.5 Sonnet或本地部署的Qwen2.5)。这个Agent的“工具集”动态来源于上述MCP服务器。我们为这个Agent编写清晰的系统指令,定义它的角色(“资深研发助手”)、目标和工作原则。
技能封装层(Skill层):这是系统的“经验”和“套路”。我们将常见的复杂任务封装成Skill,降低主Agent的规划难度。
- 代码审查Skill:内部流程是:a) 通过代码仓库MCP获取变更的代码diff。b) 通过知识库MCP检索相关代码规范和设计文档。c) 调用LLM进行分析,生成审查意见。d) 通过开发工具MCP运行静态检查。
- 故障排查Skill:内部流程是:a) 解析用户描述的故障现象。b) 通过外部搜索MCP查找类似错误。c) 通过开发工具MCP查询系统日志、运行诊断命令。d) 综合所有信息,给出排查建议。
- 新功能开发Skill:引导Agent进行需求澄清、技术方案设计、代码实现、单元测试等一系列步骤。
应用交互层:这是系统的“面孔”。可以是一个Web聊天界面、一个IDE插件(如Cursor、VS Code Copilot Chat)、或者一个Slack/Discord机器人。它接收用户请求,传递给智能核心层,并将结果呈现给用户。
3.2 关键实现细节与配置示例
以连接一个“SQLite数据库查询”MCP服务器到Cursor IDE为例,展示如何将能力接入Agent环境:
实现或获取MCP服务器:假设我们使用一个现成的
sqlite-mcp服务器。通常可以通过npm或pip安装。pip install sqlite-mcp-server配置Cursor IDE:Cursor通过
cursor.json文件(通常位于用户配置目录)来管理MCP服务器。我们需要编辑这个文件。{ "mcpServers": { "sqlite-assistant": { "command": "python", "args": [ "-m", "sqlite_mcp_server", "--db-path", "/path/to/your/project/data.db" ] }, "tavily-search": { "command": "npx", "args": [ "-y", "@modelcontextprotocol/server-tavily-search", "--api-key", "your_tavily_api_key_here" ] } } }这个配置定义了两个MCP服务器:一个连接本地SQLite数据库,一个连接Tavily网络搜索。
command和args指定了如何启动这个服务器进程。在Cursor中使用:配置完成后,重启Cursor。当你在AI聊天框中输入“帮我查看一下用户表里最近注册的10个人”,Cursor背后的AI模型(作为MCP客户端)会自动发现可用的工具。它可能会生成一个内部请求,调用
sqlite-assistant服务器提供的“执行SQL查询”工具,执行类似SELECT * FROM users ORDER BY created_at DESC LIMIT 10的语句,然后将结果返回并组织成自然语言回答给你。
关于RAG的实战细节:在构建知识库MCP服务器时,RAG部分的设计至关重要。除了之前提到的分块和检索,对于技术文档,我强烈建议采用分层索引策略。即对文档同时建立两种索引:一个基于小块的“详细内容索引”(用于精准回答具体问题),一个基于大块或整篇文档的“摘要索引”(用于理解文档整体结构和主题)。在检索时,可以先利用摘要索引快速定位相关文档,再在这些文档内部利用详细内容索引进行精查。这比单一的全局检索效率更高、效果更好。
4. 常见陷阱、排查指南与进阶思考
在实际开发和面试中,你会遇到各种各样的问题。下面是一些典型的“坑”和解决思路。
4.1 RAG效果不佳的排查清单
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 答案与上下文无关,胡编乱造 | 1. 检索到的文档完全不相关。 2. Prompt指令不强制模型使用上下文。 3. 上下文过长,模型忽略了。 | 1.检查检索结果:单独测试检索接口,看返回的文档片段是否相关。优化嵌入模型或尝试重排序。 2.强化Prompt:在系统指令中明确强调“必须且仅能使用提供的上下文”,并设置“无法回答”的兜底逻辑。 3.压缩上下文:对检索到的多个文档进行摘要或提取关键信息,再喂给模型。 |
| 答案包含正确信息但冗余、混乱 | 检索返回了多篇相关但重复或冲突的文档,模型无法很好整合。 | 1.去重与过滤:在检索后增加一步,基于内容相似度对结果去重。 2.摘要融合:尝试让模型先对每篇检索结果写一句话摘要,再基于摘要生成最终答案。 3.迭代检索:采用“检索-阅读-生成新问题-再检索”的多轮方式,逐步聚焦。 |
| 对于简单、明确的问题也检索失败 | 1. 向量数据库索引没建好。 2. 查询词与文档措辞差异大。 3. 分块不合理,割裂了关键信息。 | 1.检查索引:确认文档已成功嵌入并存入。 2.查询扩展:使用同义词或让LLM生成几个查询变体,并行检索后合并结果。 3.调整分块:尝试不同的分块大小和策略,对于表格、代码块等特殊内容采用特殊分块规则。 |
4.2 Agent与MCP的调试心得
- Agent陷入循环或调用错误工具:这通常是工具描述不清或LLM规划能力不足导致的。解决方案:首先,精细化每个工具的描述,明确输入输出的格式和语义。其次,可以在Agent的推理步骤中加入“反思”环节,让它在每次行动后评估结果是否朝着目标前进,如果连续几次无效,则调整计划或向用户求助。
- MCP服务器连接失败:这是最常见的问题。排查步骤:
- 检查客户端配置文件的JSON格式是否正确。
- 在终端手动运行配置中的
command和args,看服务器能否独立启动并运行。 - 查看客户端的日志输出,通常会有详细的连接错误信息。
- 确保服务器和客户端使用的MCP协议版本兼容。
- Skill设计过于僵化:把Skill设计成死板的流程,限制了主Agent的灵活性。好的实践:Skill应该提供的是“指导”和“预设工具集”,而不是不可更改的脚本。主Agent在执行Skill时,应能根据实际情况跳过某些步骤,或动态调整参数。Skill更像是一个“任务规划模板”。
4.3 对“高强度”面试要求的再思考
回到最初的面试场景。面试官之所以问这些,是因为现在的AI应用开发,正在从“玩具演示”走向“生产级系统”。一个能上线的AI功能,必须考虑:
- 可靠性:RAG确保答案有据可依,减少幻觉。
- 自主性:Agent能处理复杂、多步骤的任务。
- 可扩展性:MCP让工具生态可以像搭积木一样增长,而不是每加一个功能就重写一遍代码。
- 可复用性:Skill将领域最佳实践产品化,提升开发效率。
要求实习生理解这些,是因为他们希望找到的不仅仅是一个API调用员,而是一个能参与设计和构建下一代软件交互界面的伙伴。这些技术栈的学习曲线确实不低,但它们是通往AI Native应用开发的必经之路。从理解RAG开始,到动手搭建一个能调用真实工具的简单Agent,再到尝试配置一个MCP服务器,每一步实践都会让你对这场正在发生的范式转移有更深的体会。这不仅仅是技术,更是关于如何重新思考人机协作方式的哲学。