ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

AI Agent实战:Harness、RAG、MCP与Skills四组件落地指南

AI Agent实战:Harness、RAG、MCP与Skills四组件落地指南 1. 全链路设计与技术选型从需求到落地的第一张地图做AI Agent项目最怕的不是代码写不出来而是从一开始就搞不清楚东西南北。FDEForward Deployed Engineer前向部署工程师这个角色平时干的事就是冲到业务一线把客户或产品团队的模糊想法翻译成一套可运行的技术方案。这次我们聊的实战训练营主题就是围绕Agent Harness、Skills、RAG、MCP这四大件从零开始搭一个能跑完整业务闭环的Agent系统。这篇文章不是复述训练营讲义而是把我自己实操过程中踩过的坑、摸索出来的套路认认真真拆给你看。先说结论这套组合的本质是解决“Agent太聪明但手脚不够用”的问题。模型负责思考Harness负责让思考有纪律、有状态、可回退Skills负责把重复动作打包成乐高积木RAG负责让模型知道它没学过但业务必需的知识MCP则把所有外部工具统一成一套接口。四个东西各有各的职责但组合起来才是一个能上生产的Agent。训练营里那种“跑通demo”的效果和真正落地之间差的就是对这四个组件的深度理解。适合看这篇文章的人我猜大概是三类一是刚准备做Agent应用但被概念绕晕的后端或前端工程师二是已经在用LangChain之类框架但觉得总被框架牵着走的开发者三是想在企业里推AI落地的技术负责人。下面我会按实际操作顺序讲尽量做到每一步都有依据每个选择都说清楚为什么。1.1 FDE视角下的Agent项目到底在做什么FDE这个词在AI应用落地场景里其实很贴切。它不像传统研发那样只负责一个模块而是要从项目设计、技术选型、代码实现、部署监控一直跟到业务效果。Agent项目尤其需要这种全局视角因为Agent系统本质上是一个复杂的运行时系统模型输出不稳定、工具调用时机不可控、知识库内容会过期、权限边界需要频繁调整。我见过很多失败的Agent项目失败原因不是模型不够强而是整个链条有一环断了。比如有的团队花大力气做了RAG知识库但Agent根本没有管理上下文的能力回答问题时东一句西一句有的团队写了十几个Skills函数但没人维护工具清单模型胡调用更多的团队把MCP服务全堆在一起接口权限混乱得不行。所以FDE的活首先不是写代码而是画架构图搞清楚Agent的输入输出在哪里状态存哪里工具从哪里来知识从哪里查失败以后怎么恢复。在我自己的项目里第一步永远是画一张运行时数据流图。从用户提问开始经过Harness的调度模型决定调用哪些Skills需要查资料时走RAG需要外部系统数据时走MCP最后的答案再传回用户。同时还要画出每个环节的日志和监控点。这张图就是整个项目的总纲后面所有代码都围绕它展开。1.2 四个核心组件的定位Harness、Skills、RAG、MCP这四个词经常被放在一起提但很多人分不清边界。我习惯用一个厨房的比喻来解释Harness是厨房的管理制度决定什么菜什么时候做、哪个厨师负责哪道工序、菜做砸了怎么重做Skills是菜谱每个菜谱封装好了食材和步骤厨师照着做就行RAG是冰箱旁边的食材柜做菜之前先看看里面有什么能用的MCP是连接外部供应商的标准化通道比如需要特殊调料时通过统一渠道从外面订货。Harness这个英文词本意是“挽具、马具”在Agent语境里指的是一个控制框架负责Agent的主循环、状态管理、工具调用编排、错误恢复和流程终止。等于给Agent装上了一套规章制度。没有Harness的Agent就像没有流程管理的厨房一片混乱。常见Harness方案有LangGraph、AutoGen、CrewAI甚至自己写一个轻量级的循环。我自己就写过一个几十行的Harness用起来反而比大框架更顺手后面会讲到。Skills指的是可复用的技能封装。一个Skill通常是一个函数或一个脚本带清晰的输入输出说明和调用约定。Skills要能被模型理解通过描述和参数Schema也要能被Harness发现和调度。设计Skills的重点是“粒度”太粗了模型很难精准调用太细了模型容易调错。比如“获取天气”这个Skill可以分成“获取当前城市天气”和“获取历史天气”两个子Skills比一个万能函数更可控。RAGRetrieval-Augmented Generation是检索增强生成。简单说就是模型回答问题前先从知识库里把相关内容捞出来再结合上下文生成答案。它的本质是为模型补充没有训练过的知识比如企业内部文档、产品说明、最新政策等。RAG不是万能的它有明显的瓶颈比如检索结果不相关、文档切分不合理、知识冲突等。这些后面我会展开讲。现在很多团队在尝试用知识图谱KG补足纯向量检索的不足这也是一种思路。MCPModel Context Protocol是模型上下文协议官方解释是让AI模型与外部工具之间有一个标准通信方式。你可以理解为AI界的USB-C接口无论什么工具只要实现了MCP协议就能被兼容MCP的Agent直接调用。MCP的价值是减少了工具接入的重复劳动一个工具写一次MCP服务多个Agent都能用。1.3 设计原则与选型思路先选Harness再选模型再决定RAG和MCP的形态。这是我固定的顺序。Harness决定了项目的架构风格后面一切都是围绕它的。选Harness时我会看三点一是状态管理能力Agent多轮对话中的流程状态能不能保存、恢复、回退二是工具调用的容错性工具出错时Harness能不能降级处理三是可观测性日志和追踪是不是够清晰。LangGraph在状态管理上很强用图的方式定义流程可回退和重放适合复杂业务CrewAI适合多角色协作比如一个写文章一个审稿自研Harness最适合简单场景逻辑直白可控性最高。模型选型上我自己常用DeepSeek系列因为它在中文场景表现很稳成本也划算。不过无论选什么模型都要注意一个点Agent项目对模型的“工具调用能力”要求很高模型必须能理解工具描述、按Schema输出参数。这个能力有时比模型本身的通用知识更重要。所以选型时一定要用真实的Agent任务测试比如让模型从一段文本里提取信息再去调用工具而不是直接用聊天分数来判断。RAG选型集中在向量库上。我个人用过ChromaDB、Milvus、Qdrant。如果是本地轻量级ChromaDB最简单如果数据量大、需要高性能Milvus更合适。知识来源方面如果需要保留实体关系可以考虑用知识图谱比如Neo4j但成本高了不少。MCP选型主要看现有的工具生态是否丰富以及框架的成熟度。目前官方SDK支持Python和TypeScript。如果团队里Python经验多就选Python SDK如果是前端为主的团队TypeScript也不错。MCP不是所有工具都需要已经有API接口的工具可以先直接走HTTP调用只有当工具数量多、需要统一管理时才上MCP。2. 核心组件原理与实操细节知其然更要知其所以然2.1 Agent Harness运行骨架与状态管理Harness的核心是一个循环。这个循环大概是接收用户输入 - 构造上下文 - 让模型决策下一步 - 执行工具调用或生成回答 - 更新上下文 - 继续循环直到终止。听起来简单但真正落地时最棘手的是状态管理。我写过最简单的一个Harness核心就是一个while循环加一个消息列表class SimpleHarness: def __init__(self, agent_llm, skills_registry): self.agent_llm agent_llm self.skills_registry skills_registry self.messages [] def run(self, user_input, max_steps10): self.messages.append({role: user, content: user_input}) for _ in range(max_steps): response self.agent_llm.decide(self.messages) if response.type tool_call: result self.skills_registry.execute(response.tool_name, response.args) self.messages.append({role: tool, name: response.tool_name, content: result}) else: return response.content return 达到最大步数已终止注意这个循环必须设置最大步数否则遇到模型一直要调工具时可能无限循环。还要注意消息列表的长度模型上下文窗口是有限的工具调用结果太长时要做截断或摘要。Harness的另一个关键点是错误恢复。比如工具调用失败后是让模型换一个工具还是直接告诉用户失败我一般会让Harness先捕获异常把错误信息作为工具结果传回给模型让模型自己决定下一步。这样看起来很智能但要小心模型会反复调用同一个失败的工具所以还要加一个重试计数同一个工具连续失败超过3次就强制终止并给用户一个友好提示。更复杂一点的Harness会支持流程编排比如写入数据库之前必须先查询权限或者生成文章前必须检索素材。这时候可以用状态机或者工作流引擎。LangGraph的图模型很适合做这件事每个节点是一个处理步骤边连接节点。这个图是静态定义好的但运行时的每个节点都是独立的Agent调用或工具调用。好处是流程清晰、可恢复坏处是灵活性下降模型不能随意跳转。实际项目里我倾向于混合核心流程走图边缘分支让模型自由发挥。2.2 Skills技能封装与复用Skills是整个Agent系统的“动手能力”。设计Skills时我发现最大的问题是工程师容易把Skills写得像函数而不是像“服务”。函数只关心输入输出但Skills还要关心描述、参数Schema、返回结果格式、错误处理以及最重要的——如何被模型正确理解。一个标准的Skill应该包含四个部分名称、描述、参数定义、执行逻辑。名称要短描述要精确到“什么情况下用这个功能、参数怎么填、返回值是什么”。参数定义我一般用JSON Schema这样模型能自动生成符合结构的参数。举个例子一个查询股票价格的Skillskill( namequery_stock_price, description查询指定股票的当前价格和涨跌幅。适用于用户询问股价、K线走势等场景。, params_schema{ type: object, properties: { stock_code: {type: string, description: 股票代码如 600519}, market: {type: string, enum: [A股, 港股, 美股], description: 市场类型} }, required: [stock_code, market] } ) def query_stock_price(stock_code, market): # 调用行情API return get_price(stock_code, market)这里有个小技巧描述里不仅要有“是什么”还要有“什么时候用”。因为模型是根据描述来决策的如果两个Skills的描述有重叠模型会不知所措。我会再写一个“Skills索引”文档把所有可用的Skills列出来让Harness在构造上下文时注入给模型。这样模型一眼扫过去就知道有哪些工具可用而不必记忆全部细节。Skills开发还需要考虑版本管理。Agent项目迭代快今天加一个Skill明天改一个参数很容易出现模型还在调用旧版本的尴尬情况。我建议给每个Skill加版本号在注册表里记录启用状态。线上运行的老Agent可以锁定版本新Agent用新版本排查问题时也能快速定位。2.3 RAG知识库检索增强与瓶颈化解RAG的原理简单说就是三段切分文档、向量化、检索。但实际操作中每一步都有坑。文档切分是第一步也是最容易出错的一步。切太碎语义不完整检索时会把一句话拆成好几截切太大包含太多噪声向量化后和用户问题的相似度反而低。我试过几种切分策略目前比较好用的是按Markdown标题结构切分兼顾段落语义再根据上下文窗口大小调整切分长度。比如把一篇长文按一级标题切成多个章节章节太长就继续按二级标题和段落切。这样切出来的块语义相对完整。向量化一般用Embedding模型比如OpenAI的text-embedding-3-small或者BGE中文系列。选Embedding时要注意它是一个独立于对话模型的组件更新时不会影响Agent的生成能力但选择和业务数据语言匹配的模型非常重要。中文场景用开源的中文Embedding比用通用英文模型效果好很多。检索阶段除了基础的向量相似度搜索我还会做“混合检索”先通过关键词或BM25算法找出候选再做向量重排最后按分数融合。这个组合能解决向量检索对专有名词不敏感的问题。比如用户问“你们公司那个新出的降噪耳机”纯向量可能检索不到品牌名“QX-50”但关键词检索就能精准命中。真正的瓶颈往往不在检索本身而在“知识冲突”。知识库里有今年和去年的两版政策模型把旧的也拿出来了回答就自相矛盾。我的解法是给知识块加“时间戳”和“来源等级”字段检索时在过滤条件里加时间范围或者把来源等级作为排序权重。如果仍解决不了就会考虑引入知识图谱KG用实体关系链来消除歧义。比如“小米”是公司还是粮食在KG里能根据上下文消歧而纯向量检索做不到。RAG的另一个痛点是召回率足够但准确率不高。用户问的问题和检索出来的文档表面相似但实际不相关。我的实践经验是一定要把“检索到的原文”作为上下文完整地交给模型同时标注好引用来源别让模型自己凭记忆发挥。如果模型因为上下文塞太多而遗漏信息可以尝试把搜索结果分页让小模型先做相关性过滤再拼接大模型上下文。2.4 MCP工具接入的标准化通道MCP最大的价值是“一次接入到处复用”。在我看来它和传统API网关很像但是为AI场景做了优化有一个标准JSON-RPC协议、有工具描述清单、有实时调用上下文。MCP的实体包括MCP Server提供工具的一方和MCP ClientAgent一方它们在一起通过“工具列表调用策略”通信。我自己用一个简单的Python MCP Server来做本地工具中转。比如要接一个给前端自动化测试的Playwright先写一个MCP服务端把浏览器操作封装成工具from mcp.server.fastmcp import FastMCP mcp FastMCP(browser-tools) mcp.tool() def open_url(url: str): 打开指定网页 return browser.open(url) mcp.tool() def click_element(selector: str): 点击页面上匹配CSS选择器的元素 return browser.click(selector) mcp.tool() def extract_text(selector: str): 提取页面上匹配CSS选择器的文本内容 return browser.extract_text(selector) if __name__ __main__: mcp.run(transportstdio)然后用FastMCP库启动服务在Agent侧配置MCP客户端就能把浏览器控制能力注入到Harness里。这里要注意的是MCP的传输方式stdio适合本地子进程SSE适合远程服务。本地开发用stdio最省事生产环境如果要把MCP独立部署就要用SSE或streamable HTTP。MCP生态已经非常丰富除了Playwright还有用于EDA设计的Altium Designer AI接口、用于逆向分析的IDA MCP、用于游戏引擎的Unreal 5.8 MCP等等。这意味着你可以在Agent里直接操作这些专业软件。我个人的建议是优先使用成熟的官方MCP实现别重复造轮子。如果工具本身有REST API但还没有MCP版本可以用MCP“桥接器”封装一层让API调用变MCP工具。3. 从设计到实现一条完整的实操路径3.1 需求拆解与场景定义拿一个实际案例来说假设我们要做一个“播客节目策划助手”。它需要根据用户的主题想法自动检索行业资讯和经典案例然后策划出节目大纲、推荐嘉宾名单甚至自动生成宣传文案。这个需求可以拆成几个子任务资讯检索、案例库查找、大纲生成、嘉宾信息整理、文案生成。其中资讯检索和案例查找需要外部知识对应RAG嘉宾信息整理需要查企业库或社交平台对应MCP工具大纲生成和文案生成是模型本身的能力整体流程控制则需要Harness来编排。在开始写代码前我会先定义好“功能边界”哪些步骤是模型自动做的哪些需要用户确认哪些要用工具保障准确性。比如大纲生成后必须让用户确认再进入下一步避免模型自主发挥过头。这一步的产出物是一张流程清单有明确的状态转换关系。3.2 搭建Harness骨架让Agent有规矩地跑起来我选择用LangGraph来搭建这个Agent的骨架因为流程中有明确的分支和需要人工确认的步骤。LangGraph用节点和边来定义状态机节点是Python函数边是条件判断。基础骨架如下from langgraph.graph import StateGraph, END class AgentState(TypedDict): user_input: str retrieved_docs: list outline: str approved: bool graph StateGraph(AgentState) graph.add_node(retrieve, retrieve_knowledge) graph.add_node(generate_outline, generate_outline) graph.add_node(confirm, ask_user) graph.add_node(finalize, generate_final_copy) graph.add_edge(retrieve, generate_outline) graph.add_edge(generate_outline, confirm) graph.add_conditional_edges(confirm, confirm_router, {approved: finalize, rejected: generate_outline}) graph.add_edge(finalize, END)这段代码里“confirm”节点会暂停流程等用户输入。这是Harness一个很有用的特性人机协作。Agent先跑几步到需要确认的地方停下来等用户反馈后继续。我在好几个项目里都用这种模式比“人点一个按钮跑完所有”要可靠得多毕竟用户才是最终决策者。注意LangGraph不是唯一选择如果你只想做单轮工具调用自研Harness更轻量。但如果你需要复杂的流程编排、分支跳转、人工介入直接用图框架能节省大量时间。3.3 编写和注册Skills把业务能力做成可复用积木回到播客策划助手的场景我们需要这几个Skills搜索资讯、查询行业案例、查嘉宾联系方式、生成文案框架。以搜索资讯为例skill( namesearch_news, description检索指定主题的最新行业资讯。适用于需要获取行业动态、专家观点、热点话题的场景。, params_schema{ type: object, properties: { query: {type: string, description: 检索关键词或短语}, start_date: {type: string, format: date, description: 开始日期留空则不限}, limit: {type: integer, default: 5, description: 返回结果条数} }, required: [query] } ) def search_news(query, start_dateNone, limit5): # 调用新闻API或爬虫 return news_api.search(query, start_datestart_date, limitlimit)Skills注册中心我用一个简单的字典实现把装饰器扫描到的函数统一注册进去。每个Skill还关联一个“权限级别”比如“公开可使用”和“仅管理员可调用”。这样能防止模型在无授权情况下调用敏感操作比如删除数据或发送邮件。实际经验告诉我Skills的调试重点不是函数本身而是参数Schema。模型调不出正确参数或者调错了参数90%是描述写得不够清楚。比如我写“query”参数时如果只写“查询关键词”模型可能会把整个用户提问都塞进去导致检索效果很差。要写“一句话的核心主题不超过10个词例如人工智能最新发展”模型才会正确提取关键实体。3.4 接入RAG让Agent在知识库里“捞”答案播客策划助手需要一个知识库里面存放历史播客节目文案、用户群体画像、往期案例分析。我用ChromaDB做一个轻量级结构知识库流程如下第一步把历史文案按Markdown标题切块用中文Embedding模型向量化存入ChromaDB。这里推荐使用BGE-M3或者类似的中文Embedding模型。from langchain_community.embeddings import HuggingFaceEmbeddings import chromadb client chromadb.Client() collection client.create_collection(podcast_kb, metadata{hnsw:space: cosine}) embeddings HuggingFaceEmbeddings(model_nameBAAI/bge-m3)第二步构建检索函数。我用一个“检索后过滤”的思路先根据用户主题向量查Top 10再在结果中过滤掉过期内容和低权威来源。def retrieve_knowledge(query, top_k5): r collection.query(query_texts[query], n_resultstop_k, where{source_level: {$gte: 1}}) return r[documents][0]第三步在Harness节点中把检索结果拼接到模型上下文里。这里有个关键细节检索到的文档一定不要全部塞进去只选最相关的Top 3-5并给模型明确指令只基于检索内容回答如果检索内容不足就明确说“知识库未覆盖”。这是防止模型编造知识的第一道防线。RAG的效果评估是我花了很多时间的部分。我常用“命中率”检索结果是否包含正确答案和“忠实度”生成答案是否严格基于检索文本这两个指标。线上发现问题时我会先排查知识块切分的粒度再排查排序权重。有一个很反直觉的发现知识库内容越“宽”效果往往越差。因为冗余内容干扰了向量排序。所以RAG知识库不是什么都往里塞而是要有“取舍”。3.5 通过MCP连接外部工具把Agent的手伸向真实世界播客策划需要查嘉宾联系方式这个信息通常存在CRM里。我写了一个MCP Server把CRM的API封装成MCP工具from mcp.server.fastmcp import FastMCP import requests mcp FastMCP(crm-tools) mcp.tool() def search_contact(guest_name: str, source: str linkedin): 根据姓名从指定平台搜索联系方式与资料。 resp requests.post(https://crm.example.com/search, json{name: guest_name, source: source}) if not resp.ok: return {error: resp.status_code} data resp.json() return {name: data[name], email: data[email], bio: data.get(bio, )} if __name__ __main__: mcp.run(transportstdio)在Agent侧我用MCP客户端连接这个serverfrom mcp.client import ClientSession from mcp.client.stdio import stdio_client async def load_tools(): streams await stdio_client(command[python, crm_mcp.py]) session await ClientSession(streams[0], streams[1]) await session.initialize() tools await session.list_tools() return tools然后把MCP工具列表注入到Harness的Skills注册中心。这里要注意的是MCP工具和本地Skills在Agent眼里是一样的都是“可调用函数”。但MCP调用走的是进程间通信延迟会高一些所以如果这个工具被频繁调用考虑把MCP Server作为常驻服务而不是每次启动子进程。我用stdio方式时踩过坑每次初始化会话都很慢让Agent卡了好几秒。后来改成一个常驻的MCP Server通过Unix socket通信速度快了很多。MCP还有一个很实用的玩法通过MCP接入Playwright做浏览器自动化。比如给播客助手加一个“自动打开嘉宾主页抓取简介”的能力。这个可以用现成的Playwright MCP服务自己不用写任何代码只需要配置一下。这就是标准协议的好处生态共享。4. 常见问题与排查实录把踩过的坑都摊开给你看4.1 Agent调用异常与Token消耗问题Agent项目跑多了最常遇到的报错就是“rpc error (-1): empty sid and service name”。这个错误我排查了很久最后发现是MCP客户端初始化时子进程启动失败或连接建立不完整导致。解决方法是确保MCP Server可执行文件有正确权限启动命令路径写绝对路径并且在初始化前检查子进程是否就绪。另外一类高频问题是Token消耗过大。Agent每一次工具调用结果都会追加到上下文里几轮下来上下文可能被占满。我遇到过最夸张的一次一个10步任务消耗了30万Token大部分都是工具返回的冗长网页内容。解法有两个第一给工具返回做“摘要”比如搜索新闻时只返回标题摘要不返回正文第二Harness定期清理或压缩历史消息一般只保留用户原始意图和最近两轮工具调用结果。Token消耗还和模型决策有关。如果模型频繁调用工具但不推进任务可能是Skills描述太模糊让它分不清应该用哪个。这时候我会在Harness里加一个“进度检查”节点如果连续3步没有状态变化就强制转换到“询问用户”节点。这样既能减少无谓调用也能保证用户体验。4.2 RAG检索质量瓶颈与KG知识库的选择RAG最典型的症状是“看起来检索到了但答案依然不如预期”。我会分三步排查先看检索结果是否相关如果相关说明是模型生成阶段的指令或上下文出了问题如果不相关说明向量化或切分有问题。我常用的调试方法是把检索到的文档直接阅读一遍看这个文档本身是否能支撑正确答案。如果文档内容没问题但生成答案不对那就是模型没用好文档需要优化提示词的引导方式如果文档本身内容残缺或错误那就是知识库建设的问题。当纯向量RAG一直达不到效果时我会考虑引入知识图谱。比如在一个企业规章制度问答系统里问题是“报销和差旅的流程有什么区别”纯向量检索可能分别找到“报销流程”和“差旅制度”两篇文章但回答两篇文章关联不清楚。而知识图谱能存储“报销包含差旅”这种关系能直接给出流程链条。不过KG的构建成本很高需要人工整理实体关系。我的经验是只有当文档结构非常复杂、关系密集时才值得引入KG简单知识库不要盲目上图谱。4.3 MCP连接与权限问题排查MCP连接问题一般表现为Agent调用工具时一直超时或者返回Auth失败。先说超时我从经验上列几个可能原因MCP Server启动慢、服务端和客户端版本不匹配、传输模式配置错误。如果是stdio模式注意父进程不能关闭stdin管道如果是SSE模式注意服务端地址要能被Agent访问到。权限问题更隐蔽。比如MCP工具可以读取内部CRM数据但Agent在生产环境被授权了模型还是会调用失败。这种事我会检查两个层面MCP Server本身有没有设置访问控制比如只允许白名单IP或Token另一个是Harness有没有给这个Skill设置可用条件。我习惯在MCP Server加一个简单的token校验mcp.tool() def search_contact(guest_name: str): if not current_user_has_access(): raise PermissionError(当前账号无CRM查询权限) # ...这样至少能保证上到Harness的错误信息是有意义的而不是一个含糊的“服务器错误”。4.4 Agent安全与稳定性笔记Agent安全这个话题训练营里总是讲得最浅但实操中最头疼。模型是概率系统你不可能100%保证它在任何输入下都按规矩办事。我的安全策略分三层。第一层是输入过滤。用户输入进来之前先做一个关键词和模式匹配拦截明显恶意指令比如让Agent私密信息。第二层是工具调用权限控制。每个Skill设置权限级别敏感操作加入人工审批环节比如“发送邮件”这个Skill必须先在Harness里创建审批待办经人确认后才执行。第三层是输出风控。Agent生成的对外文案会经过一个检测模型或规则引擎防止生成不当内容。稳定性方面有一个很重要的习惯所有外部资源调用必须有超时和重试。MCP调用、RAG检索、模型API都有可能慢或失败。我会给每个调用设置超时时间比如RAG检索不能超过2秒MCP工具不能超过5秒。超时后Harness捕获异常并把“调用失败”作为上下文反馈给模型让模型决定是重试还是改走别的路径。同时给每个Session一个全局coroutine如果长时间没有产出就自动终止并通知用户。最后分享一个实操小技巧文章写到这里核心内容基本讲完了。最后再分享一个我平时最常用的小技巧在开发阶段永远不要一次性把四个组件全部集成完。先写一个最简单的Harness只接一个Skills跑通“模型 - 工具调用 - 结果返回”这一条链路确认没问题后再逐个加入RAG和MCP。每加一个组件都留出半天时间专门观察日志记录模型在这种组合下的行为变化。我试过很多次一旦一次性集成全部组件出了问题根本不知道是哪一环。反而是这种“最小闭环 增量扩展”的开发方式让我能在每个阶段都稳得住。而且这种习惯还能帮你随时回退今天加MCP出了故障直接把MCP开关关掉系统立刻回到能用的状态不用从头排查。训练营里讲的是“从设计到实现”但真正有价值的不是那几个步骤而是你在每一步之间积累的那份“哪里会出事”的直觉。希望这篇文章能帮你少踩几个坑早日做出自己能放心落地的Agent项目。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进