
过去很长一段时间里我们聊 AI Agent大多说的是“单个智能体 工具调用”。可一旦业务场景复杂起来比如既要抓行业数据又要做技能评估还要生成职业规划方案单个 Agent 很快就会力不从心上下文太长、职责混乱、工具满天飞、排错全靠猜。本文围绕一个多智能体协作实战项目完整拆解 Multi Agent、Harness、Tools、MCP、Skills 这几个核心概念并给出可运行的示例代码帮你从“会调 API”走向“会搭 Agent 工程”。很多开发者现在看 Agent 项目会遇到一个困惑为什么同一个词在 DeepSeek Harness、Codex Harness、Claude Code Skills 这些工具里好像都有但用法各不相同看完这篇文章你会明白它们背后都是在解决同一个问题如何让模型安全、稳定、可控地调用外部能力并把多个模型角色编排成一条完整的工作流。文中代码基于 Python 实现适合有一定开发基础、想系统理解 AI Agent 工程化的读者。1. 背景与核心概念1.1 从单 Agent 到多 Agent 协作先看一个贴近业务的例子。假设我们要做一个“AI 职业规划助手”用户只输入一句话我想转行做 AI 产品经理应该怎么准备如果只用单个 Agent通常的做法是把用户问题一次性丢给大模型然后希望模型自己完成信息搜集、能力匹配、路径规划。这个方案在小需求下没问题但一旦涉及多个环节问题就来了模型难以同时兼顾“搜集岗位行情”“评估用户技能”“制定学习计划”三类任务。所有输出集中在一个 Prompt 里上下文一长模型容易丢失关键信息。如果某个环节调用外部工具失败整个任务只能从头开始。无法对每个步骤单独调试、单独加缓存、单独做权限控制。多智能体协作的意义在于把一个大任务拆成多个子任务每个子任务由一个专用 Agent 负责再由一个调度层统一编排。这个调度层就是我们后面要讲的 Harness。Agent 之间可以顺序执行也可以并行执行甚至可以根据前一步的结果动态决定下一步调用哪个 Agent。从架构上看多 Agent 项目的核心组成通常有四层层次作用对应概念能力层提供可复用的知识和操作步骤Skills工具层提供可执行的原子能力Tools接入层标准化工具调用的协议与格式MCP编排层调度多个 Agent控制任务流转Harness1.2 HarnessAgent 的“运行底座”很多刚接触 Agent 开发的同学对 Harness 这个概念最陌生。直白地说Harness 就是 Agent 的“运行底座”或“调度骨架”。在多智能体系统中Harness 负责的事情包括启动并维护多个 Agent 的生命周期。管理任务队列决定当前应该执行哪个 Agent。把上一步 Agent 的输出整理成下一步 Agent 的输入。处理 Agent 运行过程中的异常、超时、重试。记录链路日志方便开发和排查问题。早期的 Agent 开发大家喜欢在代码里硬编码调用顺序比如先调用 AgentA再调用 AgentB。这种方式在小项目里还行一旦流程变化代码就要跟着大改。Harness 则是把调度逻辑抽象出来用配置或规则驱动整个流程让 Agent 之间尽量解耦。1.3 Tools 与 MCP模型如何“动手干活”大模型本身不具备执行操作的能力。它只能做两件事理解文本和生成文本。Agent 要真正完成一个任务比如查数据库、调接口、读文件就必须借助 Tools。Tools 是一个相对宽泛的概念指的是 Agent 可以调用的一切外部能力。比如查询职位信息的函数。读取用户简历文件的工具。调用第三方评分 API 的服务。Tools 本身并不复杂难点在于如何让模型知道有哪些工具可用、每个工具需要什么参数、工具返回结果如何解析。MCPModel Context Protocol模型上下文协议正是在这个背景下出现的一套标准化协议。它定义了模型与外部工具之间发现、协商、调用的标准流程。简单理解MCP 是“工具调用的普通话”解决了不同框架之间工具格式不一致的问题。MCP 的核心角色有两个角色说明MCP Server提供工具的一方负责注册工具、处理调用请求MCP Client请求工具的一方通常是 Agent 或 Harness协议流程大致是Client 向 Server 发送初始化请求。Server 返回支持的协议版本和能力信息。Client 请求获取工具列表。Server 返回工具名称、描述、参数格式。Client 根据模型输出决定调用哪个工具并传入参数。Server 执行工具逻辑并返回结果。1.4 Skills把经验沉淀成可复用技能Skills 是最近很火的一个概念。你可以把 Skills 理解为“带上下文和步骤提示的工具包”。工具关注的是“能做什么”Skills 关注的是“怎么做更好”。举个例子Tools 层提供query_job_market()函数负责返回岗位数据。Skills 层定义一个“职业行情分析技能”它包含分析框架、提示词、可能需要调用的多个工具以及结果输出模板。Skills 的优势在于可复用性和组合性。一个团队可以把多年沉淀的业务方法论写成 Skills当 Agent 遇到相关任务时Harness 会自动匹配最合适的 Skill 套件。如果要做一个直观对比概念粒度侧重点典型问题Harness系统级流程编排与运行控制多个 Agent 如何协作Agent任务级特定角色的任务执行每个子任务由谁完成Tools原子级外部能力接入模型如何调用外部接口MCP协议级工具调用的标准化不同框架如何互相通信Skills知识级经验与方法论沉淀如何让 Agent 输出更专业2. 项目设计与环境准备2.1 项目需求AI 职业规划助手本文的实战项目围绕“AI 职业规划助手”展开项目代号暂定“码士集团 Agent 中台”。项目要解决的问题是用户输入求职目标后系统能自动完成职业行情分析、个人能力评估、学习路径规划、求职建议输出。为了演示方便我们把完整流程拆成 4 个子任务行业岗位情报采集查询目标岗位的平均薪资、热门技能、招聘趋势。个人能力评估结合用户输入分析当前能力与岗位需求的差距。学习路径规划根据能力差距生成阶段性的学习计划。求职行动建议输出简历优化、面试准备、渠道推荐等行动项。每个子任务由一个独立 Agent 承担Agent 之间通过 Harness 编排协作。Tools 层提供岗位查询等原子能力Skills 层定义行业分析框架和评估模板MCP 负责统一工具接入格式。2.2 运行环境与项目结构本文示例以 Python 为例建议使用 Python 3.10 及以上版本。项目不依赖重型框架我们用最小实现来演示 Multi Agent、Harness、Tools、MCP、Skills 的工作原理。如果你的实际项目使用 LangChain、LlamaIndex 或其他 Agent 框架也可以参考本文的抽象思路进行映射。建议先创建虚拟环境python -m venv venv source venv/bin/activate # Windows 下使用 venv\Scripts\activate为了演示数据结构校验我们安装一个轻量依赖pip install pydantic项目结构规划如下agent_project/ ├── main.py # 入口组装 Skills、Tools、Agent、Harness ├── mcp_adapter.py # MCP 协议适配层 ├── tools.py # Tools 原子能力定义 ├── skills.py # Skills 技能包定义 ├── agents.py # Multi Agent 角色定义 └── harness.py # Harness 调度编排每个文件职责单一方便后续扩展。3. 核心代码拆解Tools、Skills、MCP 落地这一节我们先解决“Agent 能调用什么、按什么规则调用”的问题动手实现项目的能力层与接入层。3.1 实现 Tools 原子能力Tools 是一组可被调用的函数或服务。在设计 Tools 时我们要保证每个工具职责单一、便于复用。本项目中我们设计两个工具query_job_trend查询目标岗位的招聘趋势数据包括平均薪资、热门技能、需求指数。query_user_skill_gap模拟分析用户技能与目标岗位要求的差距。为了避免把代码写得太依赖真实 API我们用 Mock 数据模拟返回结果重点演示工具定义与调用机制。文件路径tools.py 文件路径tools.py 说明定义 Agent 可调用的原子能力 Tools from dataclasses import dataclass, field from typing import Any, Callable, Optional dataclass class Tool: 工具元数据结构 name: str description: str parameters: dict handler: Callable[..., str] field(reprFalse) def _query_job_trend(job_title: str) - str: 模拟查询岗位招聘趋势 真实项目中可替换为招聘平台 API 或数据库查询 mock_data { AI产品经理: { avg_salary: 25K-40K, hot_skills: [大模型应用, Prompt Engineering, 数据分析, 用户调研], demand_index: 92 }, 后端工程师: { avg_salary: 20K-35K, hot_skills: [Java/Go, 分布式, Redis, Kafka], demand_index: 88 }, AI算法工程师: { avg_salary: 30K-50K, hot_skills: [深度学习, 大模型微调, PyTorch, MLOps], demand_index: 95 } } data mock_data.get(job_title) if not data: return f暂未收录岗位「{job_title}」的行情数据 return ( f岗位{job_title}\n f平均薪资{data[avg_salary]}\n f热门技能{, .join(data[hot_skills])}\n f需求指数{data[demand_index]} ) def _query_skill_gap(job_title: str, user_skills: str) - str: 模拟技能差距分析 真实项目中这里会调用更细粒度的技能匹配服务 # 简化的技能关键词匹配 required_skills { AI产品经理: [大模型应用, 数据分析, 用户调研, 项目管理], 后端工程师: [Java, Go, Redis, 分布式], AI算法工程师: [深度学习, PyTorch, 大模型微调] } target_skills required_skills.get(job_title, []) user_skill_list [s.strip() for s in user_skills.split(,) if s.strip()] missing [s for s in target_skills if s not in user_skill_list] matched [s for s in target_skills if s in user_skill_list] return ( f目标岗位{job_title}\n f已具备技能{, .join(matched) if matched else 暂未匹配}\n f待补充技能{, .join(missing) if missing else 暂无} ) # 工具注册表 TOOLS_REGISTRY [ Tool( namequery_job_trend, description查询指定岗位的招聘趋势、薪资范围和热门技能, parameters{ type: object, properties: { job_title: {type: string, description: 岗位名称例如 AI产品经理} }, required: [job_title] }, handler_query_job_trend ), Tool( namequery_skill_gap, description分析用户技能与目标岗位要求的差距, parameters{ type: object, properties: { job_title: {type: string, description: 目标岗位名称}, user_skills: {type: string, description: 用户掌握的技能用逗号分隔} }, required: [job_title, user_skills] }, handler_query_skill_gap ) ] def find_tool(name: str) - Optional[Tool]: 根据名称查找工具 for tool in TOOLS_REGISTRY: if tool.name name: return tool return None这里有几个设计细节值得注意每个 Tool 都带description和parameters这是 MCP 协议中工具发现机制的基础。handler 统一返回字符串格式方便 Agent 直接作为文本上下文使用。工具注册表是集中式的方便 Harness 启动时统一加载。3.2 实现 MCP 适配层MCP 协议的核心价值是让 Agent 不依赖具体工具实现只依赖统一协议。本节我们用代码模拟 MCP Server 的启动、工具列表发现、工具调用这三个关键过程。文件路径mcp_adapter.py 文件路径mcp_adapter.py 说明模拟 MCP Server 与 Client 的协议适配层 import json from typing import Any, Dict from tools import TOOLS_REGISTRY, find_tool class MCPServer: 一个精简的 MCP Server 实现。 真实项目中这里会基于 MCP SDK 提供 HTTP/SSE 等传输层能力。 def __init__(self, server_name: str career_planner_server): self.server_name server_name self.protocol_version 2024-11-05 def initialize(self) - Dict[str, Any]: MCP 协议的第一步客户端与服务端握手。 服务端返回协议版本和服务器信息。 return { jsonrpc: 2.0, id: 1, result: { protocolVersion: self.protocol_version, capabilities: { tools: { listChanged: True } }, serverInfo: { name: self.server_name, version: 0.1.0 } } } def list_tools(self) - Dict[str, Any]: MCP 协议中Agent 通过 tools/list 获取可用工具列表。 工具描述信息会作为模型决策的上下文。 return { jsonrpc: 2.0, id: 2, result: { tools: [ { name: tool.name, description: tool.description, inputSchema: tool.parameters } for tool in TOOLS_REGISTRY ] } } def call_tool(self, name: str, arguments: Dict[str, Any]) - Dict[str, Any]: MCP 协议中客户端通过 tools/call 调用具体工具。 这里执行真实的工具处理逻辑并统一返回结果格式。 tool find_tool(name) if not tool: return { jsonrpc: 2.0, id: 3, error: { code: -32601, message: fTool not found: {name} } } try: result tool.handler(**arguments) return { jsonrpc: 2.0, id: 3, result: { content: [ { type: text, text: result } ] } } except Exception as e: return { jsonrpc: 2.0, id: 3, error: { code: -32000, message: fTool execution failed: {str(e)} } } class MCPClient: 模拟 MCP Client。 在实际项目中Harness 或 Agent 会持有一个 MCPClient 实例。 def __init__(self, server: MCPServer): self.server server def initialize(self): return self.server.initialize() def discover_tools(self): return self.server.list_tools() def invoke(self, tool_name: str, tool_args: Dict[str, Any]): response self.server.call_tool(tool_name, tool_args) if error in response: raise RuntimeError(response[error][message]) content_list response[result][content] return .join(item[text] for item in content_list if item[type] text)从代码中可以看到MCP 的接入方式并不神秘。它把工具调用从“模型直接执行函数”变成“模型通过协议发现并调用函数”中间增加了一层标准化的信息结构。这对 Agent 工程的好处是工具提供方不需要关心使用者是谁Agent 框架也不需要为每个工具单独适配。3.3 实现 Skills 技能包Skills 可以理解为“工具调用 提示词模板 输出规范”的组合。我们设计两个 Skills行业分析技能负责生成目标岗位的行情分析结论。学习规划技能负责结合能力差距生成学习计划。文件路径skills.py 文件路径skills.py 说明定义 Skills 技能包组合工具调用与提示词模板 from typing import List, Optional from mcp_adapter import MCPClient class Skill: def __init__(self, name: str, description: str, tool_names: List[str], prompt_template: str): self.name name self.description description self.tool_names tool_names self.prompt_template prompt_template def can_handle(self, task: str) - bool: 根据任务描述判断是否适用该技能 keywords { 行业分析: [行情, 薪资, 趋势, 岗位分析], 学习规划: [学习, 计划, 补什么, 怎么准备], } matched_keywords keywords.get(self.name, []) return any(kw in task for kw in matched_keywords) class IndustryAnalysisSkill(Skill): 行业分析技能先调工具拿数据再套用分析模板 def __init__(self): super().__init__( name行业分析, description分析目标岗位的行业行情、薪资水平和技能要求, tool_names[query_job_trend], prompt_template( 你是一名资深行业分析师。请根据以下岗位行情数据 输出该岗位的核心机会分析和能力要求总结\n{data} ) ) def execute(self, mcp_client: MCPClient, job_title: str) - str: trend_data mcp_client.invoke(query_job_trend, {job_title: job_title}) return f{trend_data}\n\n分析结论该岗位整体需求旺盛建议优先补充热门技能项。 class LearningPlanSkill(Skill): 学习规划技能结合技能差距生成可执行计划 def __init__(self): super().__init__( name学习规划, description根据用户技能差距生成阶段性学习计划, tool_names[query_skill_gap], prompt_template( 你是一名职业规划导师。请根据技能差距分析结果 为用户生成一份分阶段学习计划\n{data} ) ) def execute(self, mcp_client: MCPClient, job_title: str, user_skills: str) - str: gap_data mcp_client.invoke( query_skill_gap, {job_title: job_title, user_skills: user_skills} ) # 这里可以接入大模型生成更详细的学习路径 return ( f{gap_data}\n\n f学习计划建议\n f第一阶段完成目标岗位核心基础理论学习。\n f第二阶段通过项目实操强化技能输出可展示的作品集。\n f第三阶段模拟面试复盘差距并针对性补强。 ) def build_skills() - List[Skill]: 构建可用技能列表 return [ IndustryAnalysisSkill(), LearningPlanSkill() ]Skills 与 Tools 的边界在这个代码里已经很清晰了Tools 只负责“获取数据”Skills 负责“决定怎么用这些数据输出专业内容”。在更复杂的工程中Skills 内部还可以继续拆成多个步骤甚至嵌套其他 Skills。4. 多 Agent 协作与 Harness 编排实践4.1 定义多 Agent 角色本项目中我们设计 4 个 Agent每个 Agent 职责单一行情分析师 Agent负责拉取岗位行情数据并做分析。技能评估 Agent负责分析用户能力差距。学习规划 Agent负责生成学习路径。求职行动 Agent负责输出求职建议。文件路径agents.py 文件路径agents.py 说明定义多智能体角色 from dataclasses import dataclass, field from typing import List from mcp_adapter import MCPClient from skills import Skill dataclass class Agent: name: str role: str skills: List[Skill] field(default_factorylist) def execute(self, mcp_client: MCPClient, task: str, **kwargs) - str: 执行当前 Agent 的任务。 优先匹配可用 Skill如果没有匹配 Skill则返回简单说明。 for skill in self.skills: if skill.can_handle(task): if user_skills in kwargs: return skill.execute(mcp_client, kwargs.get(job_title, ), kwargs.get(user_skills, )) return skill.execute(mcp_client, kwargs.get(job_title, )) return fAgent {self.name} 暂未匹配到可执行的技能。 def build_agents(skills) - List[Agent]: 构建多 Agent 列表 industry_skill next(s for s in skills if s.name 行业分析) plan_skill next(s for s in skills if s.name 学习规划) return [ Agent( nameMarketAnalyst, role行情分析师, skills[industry_skill] ), Agent( nameSkillEvaluator, role技能评估师, skills[plan_skill] ), Agent( nameLearningPlanner, role学习规划师, skills[plan_skill] ), Agent( nameJobActionAdvisor, role求职行动顾问, skills[plan_skill] ), ]这里需要说明一个问题为什么技能评估师和学习规划师都绑定同一个plan_skill在真实项目里两者应该拆成不同的 Skill。这里主要是为了保持示例代码精简让你看清 Agent 与 Skill 的匹配机制。实际开发时建议每个 Agent 绑定的技能尽量不交叉。4.2 实现 Harness 调度器Harness 是整个项目的核心。它的职责不是写业务逻辑而是决定“按什么顺序把任务交给哪个 Agent以及如何处理结果”。文件路径harness.py 文件路径harness.py 说明Harness 多智能体调度编排核心 from typing import List from agents import Agent from mcp_adapter import MCPClient class Harness: 一个极简的多 Agent 调度器。 真实场景中Harness 还需要支持并行调度、重试、超时、链路追踪等能力。 def __init__(self, agents: List[Agent], mcp_client: MCPClient): self.agents agents self.mcp_client mcp_client self.execution_log [] def run(self, task: str, job_title: str, user_skills: str) - str: 按固定流程执行多 Agent 协作任务。 这里为了演示清晰采用顺序执行真实场景中可按任务类型动态路由。 # 第 1 步行情分析师 analyst self._find_agent(MarketAnalyst) market_result analyst.execute( self.mcp_client, f分析一下{job_title}行业行情, job_titlejob_title ) self.execution_log.append({agent: analyst.name, result: market_result}) print(f\n Agent: {analyst.name} ) print(market_result) # 第 2 步技能评估师 evaluator self._find_agent(SkillEvaluator) skill_result evaluator.execute( self.mcp_client, 我的技能差距在哪里, job_titlejob_title, user_skillsuser_skills ) self.execution_log.append({agent: evaluator.name, result: skill_result}) print(f\n Agent: {evaluator.name} ) print(skill_result) # 第 3 步学习规划师 planner self._find_agent(LearningPlanner) plan_result planner.execute( self.mcp_client, 帮我制定学习计划, job_titlejob_title, user_skillsuser_skills ) self.execution_log.append({agent: planner.name, result: plan_result}) print(f\n Agent: {planner.name} ) print(plan_result) # 第 4 步求职行动顾问 advisor self._find_agent(JobActionAdvisor) advice ( f基于以下规划结果生成求职行动建议\n f市场行情{market_result}\n f技能差距{skill_result}\n f学习计划{plan_result}\n f请输出 3 条具体可执行的求职建议。 ) # 求职行动顾问这里直接用文本拼接模拟生成建议 action_advice ( f求职行动建议\n f1. 每周完成一次目标岗位模拟面试记录高频考点。\n f2. 抽出 2 周时间补齐「{job_title}」核心技能并输出实战项目到简历。\n f3. 关注招聘平台需求变化优先投递需求指数较高的行业方向。 ) self.execution_log.append({agent: advisor.name, result: action_advice}) print(f\n Agent: {advisor.name} ) print(action_advice) # 汇总最终报告 final_report self._build_report(market_result, skill_result, plan_result, action_advice) return final_report def _find_agent(self, name: str) - Agent: 根据名称查找 Agent for agent in self.agents: if agent.name name: return agent raise ValueError(fAgent not found: {name}) def _build_report(self, market: str, skill: str, plan: str, advice: str) - str: 生成最终职业规划报告 return ( \n 码士集团 AI 职业规划报告 \n f{market}\n\n f{skill}\n\n f{plan}\n\n f{advice}\n \n )这个 Harness 示例采用的是固定流程编排好处是结构清晰、方便演示。在真实项目中Harness 通常还需要支持动态路由和条件分支。比如用户技能差距较小可以跳过学习规划阶段直接进入求职建议阶段。4.3 项目入口 main.py文件路径main.py 文件路径main.py 说明项目入口串联 Skills、Tools、MCP、Agent、Harness from agents import build_agents from harness import Harness from mcp_adapter import MCPClient, MCPServer from skills import build_skills def main(): # 1. 初始化 MCP Server 和 Client server MCPServer(server_namecareer_planner_server) client MCPClient(server) # 2. MCP 握手获取工具列表 init_info client.initialize() print(MCP 初始化结果, init_info[result][serverInfo]) tool_list client.discover_tools() print(MCP 发现工具数量, len(tool_list[result][tools])) # 3. 构建 Skills skills build_skills() # 4. 构建 Multi Agent agents build_agents(skills) # 5. 构建 Harness 并执行任务 harness Harness(agentsagents, mcp_clientclient) user_input { job_title: AI产品经理, user_skills: 需求分析,原型设计,数据分析,大模型应用 } report harness.run( task帮我做一份 AI产品经理 的职业规划, job_titleuser_input[job_title], user_skillsuser_input[user_skills] ) print(report) if __name__ __main__: main()4.4 运行与验证在项目根目录执行python main.py预期输出大致如下MCP 初始化结果 {name: career_planner_server, version: 0.1.0} MCP 发现工具数量 2 Agent: MarketAnalyst 岗位AI产品经理 平均薪资25K-40K 热门技能大模型应用, Prompt Engineering, 数据分析, 用户调研 需求指数92 分析结论该岗位整体需求旺盛建议优先补充热门技能项。 Agent: SkillEvaluator 目标岗位AI产品经理 已具备技能数据分析,大模型应用 待补充技能用户调研,项目管理 学习计划建议 第一阶段完成目标岗位核心基础理论学习。 第二阶段通过项目实操强化技能输出可展示的作品集。 第三阶段模拟面试复盘差距并针对性补强。 ...整个项目虽然只用了不到 400 行代码但 Multi Agent、Harness、Tools、MCP、Skills 五大核心模块都落地了。下一步你可以尝试在这个骨架上接入真实的大模型接口替换掉模拟数据让 Agent 自动生成更自然的报告文案。5. 常见问题与排查思路多智能体项目开发中最容易踩坑的地方往往不是模型效果而是工程链路问题。下面整理几类高频问题。问题现象常见原因排查与解决思路Agent 之间数据传不过去输出结果格式不统一后续 Agent 无法解析定义统一的 Result 数据类每个 Agent 必须返回结构化对象或纯文本MCP 工具列表为空Server 端工具没有注册或注册逻辑未执行确认工具的 register 是否在启动时执行检查 tools/list 返回Agent 提示“我没有工具可用”Tools 的 description 不够明确模型不知道何时调用优化工具描述明确参数示例和调用前提同一个 Skill 被多个 Agent 重复加载Skill 注册中心维护混乱统一由 Harness 或 SkillRegistry 管理Agent 按需绑定任务调度顺序写死改动困难Harness 路由逻辑与业务逻辑耦合将流程抽成配置或 DSLHarness 只负责执行Agent 调用工具报错但主流程直接挂掉缺少异常恢复机制Harness 层增加 try-except 和重试策略失败任务进入降级流程项目开发中如何规范使用 DeepSeek Harness、Codex Harness 这类产品现在市面上已经有 DeepSeek Harness、Codex Harness、Claude Code Skills 等产品化的 Agent 开发工具。它们本质上都是对 Harness、Skills 思路的具体落地。使用这些产品时要注意三点第一先确认自己的业务是否需要引入完整的 Harness 框架。如果只是一个简单工具调用场景强行引入多 Agent 编排反而会增加维护成本。第二不同产品对 Harness、Tools、Skills 的定义和配置格式不一样。建议先阅读官方文档理解它是把 Skills 定义成 YAML 配置还是通过代码注册。不要盲目套用其他框架的经验。第三生产环境重视可观测性。选择 Harness 或 Agent 框架时优先看它的日志链路、Token 消耗统计、工具调用耗时是否容易获取这决定了后续排错效率。6. 最佳实践与工程建议6.1 Agent 规模控制多智能体不是越多越好。每增加一个 Agent都会增加一次上下文传递和调度开销。建议遵循最小可用原则能用 3 个 Agent 解决的问题不要设计成 5 个。职责边界要清晰避免两个 Agent 同时处理同一类任务导致结果冲突。6.2 工具调用的幂等与安全在生产环境中Tools 可能会被多个 Agent 并发调用。如果你的工具涉及写操作、支付、消息发送等敏感动作必须做好幂等控制。最简单的做法每个请求带request_id服务端做去重。同时遵循最小权限原则Agent 不应该持有超出任务范围的密钥和权限。6.3 MCP 协议接入要预留扩展位即使目前只用两个工具也建议在 MCP 适配层把初始化、工具发现、工具调用三个方法分开实现。后续如果有第三方工具要接入只需要在注册表里新增一条记录不需要改动 Agent 逻辑。6.4 Skills 要持续沉淀Skills 的优势在于沉淀团队经验。每次业务复盘后可以把成功案例中的分析框架、提示词模板沉淀成新的 Skill。要注意的是Skill 的命名要规范描述要准确否则 Agent 在匹配时容易出现误用。6.5 链路日志是必须项多 Agent 项目最头疼的问题就是任务跑到第三步出了问题但不知道第二步 Agent 输出的是什么。建议 Harness 层把每个 Agent 的输入摘要、输出摘要、耗时、Token 数全部记录下来。出问题的时候直接按任务 ID 查日志能在几分钟内定位问题。6.6 配置与密钥隔离Agent 项目经常会调用多个外部服务。不要把密钥写到代码里建议使用环境变量或配置中心管理。同时不同环境开发、测试、生产的 Agent 配置要完全隔离避免测试环境的工具调用影响到生产数据。7. 收尾下一步往哪走到这里一个完整的 Multi Agent Harness Tools MCP Skills 多智能体协作项目已经跑通了。你可以从中看到Agent 开发的核心不是“用哪个大模型”而是工程化地组织模型能力把大任务拆小把工具标准化把经验沉淀成技能再用一个可靠的主干把整个链路串起来。接下来建议你按三个方向继续深入第一把项目里的 Mock 数据替换成真实接口比如招聘平台开放 API 或内部技能库第二接入真实大模型用结构化输出解析 Agent 的返回内容第三尝试在 Harness 中增加并行调度和异常恢复逻辑让系统更贴近生产环境。如果后面有机会接触 DeepSeek Harness、Codex Harness 或 Claude Code Skills再回头看这套抽象模型会发现很多概念都是相通的。先从一个最小协作链路开始跑通再逐步增加复杂度是 Agent 工程最稳妥的路径。