学习笔记-Agent开发2:Agent设计范式、workflow区别、推理模式与skills/MCP协作,用TaoToken统一Key跑通
发布时间:2026/10/10 6:13:26 锦皓数字建站

1. 从一次“跑不通”的 Agent Demo 说起很多人第一次写 Agent代码逻辑看着没问题一跑就卡在模型调用上要么是 Key 额度不够要么是不同模型要换不同 SDK要么是本地环境里塞了四五个平台的 Key自己都记不清哪个对应哪个。我试过在一个小项目里同时接三家模型光是环境变量就写了六行换台机器就得重新配一遍调试成本比写业务逻辑还高。这篇笔记面向的是刚接触 Agent 开发、想把概念落到可运行代码上的同学。核心检索词就是Agent 设计范式、Agent 与 workflow 的区别、推理模式、skills 与 MCP 协作而贯穿全文的一条实操线索是用TaoToken 统一 Key把模型调用这一层收敛掉——一个 Base URL、一个 Key、一个 Model ID就能跑通 ReAct、Plan-and-Execute 这些范式的验证请求。TaoToken 在这里扮演的是“统一模型接入层”的角色它把不同模型的调用协议统一成 OpenAI 兼容格式你不需要为每个模型单独装 SDK也不用在代码里写一堆 if-else 判断走哪家。为什么要把“统一 Key”和“Agent 范式”放在一起讲因为 Agent 的调试本质上是高频、多轮、反复试错的过程。ReAct 一轮循环至少两次模型调用Plan-and-Execute 一次任务可能十几次调用如果你每换一个模型就要改代码、换 Key、重配环境那验证一个推理模式的时间成本会翻好几倍。把接入层统一之后你才能把精力放在“范式本身对不对”上而不是“为什么这次又 401 了”。接下来的结构是这样先讲清楚 Agent 的三种设计范式和它们各自的适用边界再对比 Agent 与 workflow 的本质区别然后拆解推理模式CoT、ReAct、Plan-and-Execute的实现原理最后说明 skills 和 MCP 各自负责什么、怎么协作。中间会插入可复制的 TaoToken 配置片段和一次端到端调用验证让你能把概念直接跑起来。2. Agent 设计范式与 workflow 边界ReAct、Plan-and-Execute、Reflection 怎么选2.1 三种设计范式的核心机制Agent 的设计范式说白了就是“模型怎么决定下一步做什么”的几种套路。目前工程上最常用的三种是 ReAct、Plan-and-Execute、Reflection。ReAct的核心是推理Reasoning和行动Acting交替进行。每一轮循环走 Thought → Action → Observation 三步Thought 阶段模型把当前局面分析一遍Action 阶段决定调用哪个工具、传什么参数Observation 阶段把工具返回结果喂回模型进入下一轮 Thought。它的优点是实现简单、对开放式任务适应性强缺点是不适合复杂任务因为每一步都是局部最优容易忘记最初的目标。Plan-and-Execute把规划和执行拆开。先让一个模型做全局规划输出完整的步骤列表然后由执行器逐步执行。每执行完一步结果反馈给规划器规划器判断“当前结果和预期一致吗、后续计划要不要调整”。如果某一步偏离严重规划器会修改剩余步骤这就是动态重规划机制。它适合目标明确、多步骤协作的复杂任务比如深度研究、多工具协同的数据分析。Reflection是在 Agent 完成一步或整个任务后再让一个模型可以是同一个也可以是专门的评估模型来判断做得好不好。关键点在于它不是简单地说“结果不好重做一遍”而是先分析错在哪里、下一步应该注意什么生成具体的反思总结并把总结带到下一次尝试的上下文中。这个机制在代码生成、文本写作这类需要迭代打磨的场景里特别有用。2.2 Agent 和 workflow 的边界在哪Workflow 是确定性的流程图第一步执行 AA 完成做 BB 失败走分支 C。每一步逻辑靠硬编码LLM 只是某个节点的执行工具不负责决策流程本身。它的优点是行为可测、容易测试、出问题好排查缺点是灵活性低遇到没预设的情况就卡住。Agent 则把“下一步做什么”的决策权交给了 LLM。好处是能处理事先没设计的情况缺点是行为不确定同样的输入可能走不同路径。用代码对比最直观。Workflow 风格是这样的def workflow_answer_question(user_query: str): docs vector_db.search(user_query, top_k5) reranked reranker.rank(user_query, docs) answer llm.generate(user_query, contextreranked) return answer每一行都是明确指令控制流完全由代码决定。而 Agent 风格def agent_answer_question(user_query: str): while True: action llm.decide(user_query, historymemory) if action.type search: result vector_db.search(action.query) memory.append(result) elif action.type calculate: result calculator.run(action.expr) memory.append(result) elif action.type final_answer: return action.contentloop 里只有llm.decide()所有路径都是 LLM 在运行时动态选的。实际工程中两者经常混用固定流程部分用 workflow灵活决策节点用 Agent。比如一个客服系统意图识别和路由用 workflow 保证稳定具体问题解决用 Agent 处理长尾情况。这个边界判断的标准很简单——如果这个节点的分支你能穷举就用 workflow如果分支取决于运行时信息、你没法提前写死就用 Agent。2.3 用 TaoToken 统一 Key 跑通范式验证要验证上面这些范式你需要一个能稳定调用的模型接口。TaoToken 的接入方式很直接Base URL 用https://taotoken.net/apiKey 在控制台生成Model ID 按你选的模型填。配置片段如下{ base_url: https://taotoken.net/api, api_key: sk-你的TaoToken密钥, model: claude-sonnet-4-20250514, timeout: 60 }如果你用的是 OpenAI 兼容的 SDK直接这样初始化from openai import OpenAI client OpenAI( base_urlhttps://taotoken.net/api, api_keysk-你的TaoToken密钥 ) response client.chat.completions.create( modelclaude-sonnet-4-20250514, messages[{role: user, content: 用一句话解释 ReAct 范式}] ) print(response.choices[0].message.content)这里三件套要记全Base URL Key Model ID。Base URL 固定是https://taotoken.net/apiKey 去控制台生成Model ID 按你实际要用的模型填。换模型时只改 Model ID代码和 Key 都不用动这就是统一接入层的价值。3. 推理模式拆解CoT、ReAct、Plan-and-Execute 的实现与配置3.1 CoT 的两种形态LLM 的工作原理是根据输入一个 token 一个 token 往后预测。CoTChain of Thought就是在 prompt 里加一句“让我们一步步思考”让模型把推理步骤写出来再给答案。Zero-shot CoT是在 prompt 末尾加“让我们一步步思考”模型自己展开推理不需要示例。优点是零成本、即插即用缺点是推理格式和深度全靠模型发挥有时详细有时跳步。Few-shot CoT是在 prompt 模板里放几个带完整推理过程的示例让模型模仿格式。优点是效果稳定适合输出格式固定的场景缺点是需要高质量示例示例本身占 token。CoT 的局限在于纯文字推理没法与外部世界交互只能根据训练数据推理内容可能过时。这就引出了 ReAct。3.2 ReAct 的代码驱动原理ReAct 是在 CoT 的推理链里加入真实行动。实现原理是通过 prompt 格式约束模型输出结构由代码驱动循环。模型根据当前历史输出下一步的 Thought 加 Action你的代码监测输出判断是否 final answer如果没有解析出 Action、执行对应工具把工具结果作为 Observation 填回历史再次调用模型继续循环。def react_loop(question, tools, max_steps10): history [{role: user, content: question}] for _ in range(max_steps): response client.chat.completions.create( modelclaude-sonnet-4-20250514, messageshistory ) output response.choices[0].message.content if Final Answer: in output: return output.split(Final Answer:)[-1].strip() action parse_action(output) observation tools[action[name]](**action[args]) history.append({role: assistant, content: output}) history.append({role: user, content: fObservation: {observation}}) return 达到最大步数限制ReAct 适合任务边界不明确、每步需要根据最新情况决策的场景比如开放式问答、信息搜索。但每一步都把历史带上调模型token 消费增长很快。3.3 Plan-and-Execute 的规划与执行分离Plan-and-Execute 分两阶段。规划阶段把用户目标交给模型站在全局角度拆解任务执行阶段拿着计划按序执行每一步用 ReAct 模式跑但执行器始终知道自己在整体计划中的位置。def plan_and_execute(question, tools): plan client.chat.completions.create( modelclaude-sonnet-4-20250514, messages[{role: user, content: f请为以下任务制定分步执行计划{question}}] ).choices[0].message.content steps parse_plan(plan) results [] for i, step in enumerate(steps): step_result react_executor( taskstep, toolstools, contextf整体计划共{len(steps)}步当前是第{i1}步, previous_resultsresults ) results.append(step_result) if need_replan(step, step_result, steps[i1:]): remaining client.chat.completions.create( modelclaude-sonnet-4-20250514, messages[{role: user, content: f原计划{steps}已完成到第{i1}步结果{results}剩余步骤是否需要调整}] ).choices[0].message.content steps steps[:i1] parse_plan(remaining) return client.chat.completions.create( modelclaude-sonnet-4-20250514, messages[{role: user, content: f根据以下执行结果回答问题{results}}] ).choices[0].message.contentPlan-and-Execute 适合目标明确、多步骤协作的复杂任务比如深度研究、长文协作、多工具协同的数据分析。初始规划需要一次模型调用但后续执行可以用便宜的小模型跑具体工具调用规划阶段用能力更强的模型保证计划质量。这种大小模型搭配的架构在实际项目中能显著降低调用成本。3.4 推理模式的配置对照推理模式适用场景模型调用次数主要缺点Zero-shot CoT简单推理、快速验证1 次格式不稳定Few-shot CoT格式固定的输出1 次示例占 tokenReAct开放式任务、信息搜索每步 2 次token 增长快Plan-and-Execute复杂多步任务规划 1 次 每步执行初始规划成本Reflection代码生成、文本打磨执行 评估迭代次数不确定实际工程中常见做法是用 Plan-and-Execute 做全局规划用 ReAct 做每步执行。规划阶段用强模型执行阶段用便宜模型既保证方向不跑偏又控制成本。4. skills 与 MCP 协作职责分离与端到端验证4.1 MCP 和 skills 各自负责什么MCP 让 AI 连接外部工具相当于给 AI 一个 USB-C 接口skills 给 AI 注入领域知识相当于给 AI 一本专业手册。用一句话概括MCP 提供“手”来操作工具skills 提供“操作手册”告诉智能体怎么正确使用这些工具。MCP 的职责是提供标准化访问接口让智能体能够“够得着”外部世界的数据和工具。skills 的职责是提供领域专业知识告诉智能体在特定场景下“如何组合使用这些工具”。这种连接性与能力分离的设计带来了清晰的架构优势关注点分离、成本优化、可维护性、复用性。举个例子处理发票信息时skill 告诉 AI 提取哪些字段、格式要求是什么MCP 连接数据库存储、调用 OCR 服务。具体流程是——skill 告诉 AI 从发票提取“发票号、日期、金额”三个字段AI 理解指令后知道需要外部工具MCP 被调用连接 OCR 服务识别图片文字再连接数据库存储符合格式要求的数据。4.2 skills 的三层加载机制Agent Skills 是一种标准化的程序性知识封装格式。每个技能存放在独立文件夹中核心是SKILL.md文件必须以 YAML 格式的 Frontmatter 开头。第一层元数据。智能体启动时扫描所有技能文件夹仅读取每个SKILL.md的 Frontmatter加载到系统提示词中。每个技能的元数据仅消耗约 100 个 token装 50 个技能初始消耗也只有约 5000 token。对比 MCP 的tools/list请求可能立即消耗数万 token这个渐进式加载优势明显。第二层技能主体。当智能体判断某个技能与当前任务高度相关时读取完整SKILL.md内容加载详细指令、注意事项、示例。这部分 token 消耗通常在 1000 到 5000 之间。第三层附加资源。对于更复杂的技能SKILL.md可以引用同文件夹下的脚本、配置文件、参考文档智能体仅在需要时加载。一个 PDF 处理技能的文件结构可能是skills/pdf-processing/ ├── SKILL.md ├── parse_pdf.py ├── forms.md └── templates/ ├── invoice.pdf └── report.pdf4.3 MCP 与 skills 的协作示例MCP 提供对 GitHub 的标准化访问github_mcp MCPTool(server_command[npx, -y, modelcontextprotocol/server-github]) # 暴露的工具 # - list_pull_requests(repo, state) # - get_pull_request_details(pr_number) # - list_pr_comments(pr_number) # - create_pr_comment(pr_number, body) # - get_file_content(repo, path, ref) # - list_pr_files(pr_number)MCP 让智能体“能够”访问 GitHub但它不知道“应该”做什么。skills 来补这一层--- name: code-review-workflow description: 执行标准的代码审查流程包括检查代码风格、安全问题、测试覆盖率等 --- # 代码审查工作流 ## 审查清单 1. 获取 PR 信息调用 get_pull_request_details 2. 分析变更文件调用 list_pr_files 3. 逐文件审查.py 检查 PEP 8.js/.ts 检查未处理 Promise 4. 安全检查是否硬编码敏感信息、是否有注入风险 5. 提供反馈严重问题用 create_pr_comment建议改进在总结中提出 ## 公司特定规范 - 所有数据库查询必须使用参数化查询 - API 端点必须有权限验证装饰器 - 新功能必须附带单元测试覆盖率 80%skills 告诉智能体“应该”做什么、如何组织审查流程、关注哪些公司特定规范。典型工作流是用户提问 → skills 层识别任务类型并加载对应技能 → skills 层分解子步骤 → MCP 层执行具体查询 → skills 层解读数据生成分析 → 返回结构化答案。4.4 端到端验证用统一 Key 跑一次完整调用把上面的概念落到可运行的最小示例上。假设你要验证一个带 MCP 工具调用的 Agent 请求用 TaoToken 统一 Key 配置如下from openai import OpenAI client OpenAI( base_urlhttps://taotoken.net/api, api_keysk-你的TaoToken密钥 ) tools [ { type: function, function: { name: get_pr_details, description: 获取 PR 的详细信息, parameters: { type: object, properties: { pr_number: {type: integer, description: PR 编号} }, required: [pr_number] } } } ] response client.chat.completions.create( modelclaude-sonnet-4-20250514, messages[{role: user, content: 帮我审查 PR #42}], toolstools, tool_choiceauto ) print(response.choices[0].message)如果返回的 message 里包含tool_calls说明模型正确识别了需要调用工具你的代码接下来执行对应函数、把结果填回对话即可。这一步验证通过说明 Base URL、Key、Model ID 三件套配置正确工具调用链路通畅。5. 常见报错排查401、local proxy failed、reading choices、OAuth5.1 401 认证失败最常见的报错是 401通常有两种原因Key 没填对或者 Base URL 写错了。检查顺序是——先确认api_key字段是完整的sk-开头字符串没有多余空格再确认base_url是https://taotoken.net/api注意结尾不要多加/v1或斜杠。如果你用的是环境变量确认变量名和代码里读的一致。# 错误写法 base_url https://taotoken.net/api/v1 # 多了 /v1 # 正确写法 base_url https://taotoken.net/api5.2 local proxy failed这个报错通常出现在本地网络环境有额外代理配置时。检查你的终端或 IDE 是否设置了HTTP_PROXY、HTTPS_PROXY环境变量如果有先清掉再试unset HTTP_PROXY unset HTTPS_PROXY另外确认你的请求是直接发往https://taotoken.net/api没有经过本地中间层转发。5.3 reading choices 报错reading choices这类报错一般是响应结构不符合预期常见原因是模型返回了错误信息而不是正常 completion。排查方法是先把原始响应打出来response client.chat.completions.create(...) print(response.model_dump_json(indent2))如果看到error字段按里面的 message 定位。常见的是 Model ID 写错比如把claude-sonnet-4-20250514写成了不存在的版本号。确认 Model ID 和你在控制台看到的一致。5.4 OAuth 相关报错如果你在 Claude Code 或类似工具里配置遇到 OAuth 报错通常是因为工具默认走了 OAuth 流程而不是 API Key 流程。这时候需要在配置里显式指定用 API Key 认证Base URL 填https://taotoken.net/apiKey 填你的 TaoToken 密钥。Claude Code 的配置三件套是{ base_url: https://taotoken.net/api, api_key: sk-你的TaoToken密钥, model: claude-sonnet-4-20250514 }如果你用的是 Cline 或 CC Switch 这类工具配置项名称可能不同但核心三件套不变Base URL、Key、Model ID。MCP 配置里如果出现连接失败先确认 MCP server 命令能独立跑通再检查 Agent 侧的 MCP 配置路径是否正确。5.5 排查对照表报错关键词可能原因处理方式401Key 错误或 Base URL 错误检查 Key 完整性和 Base URL 结尾local proxy failed本地代理环境变量干扰清除 HTTP_PROXY/HTTPS_PROXYreading choices响应结构异常或 Model ID 错误打印原始响应核对 Model IDOAuth工具走了 OAuth 而非 API Key显式配置 API Key 认证MCP 连接失败MCP server 命令或路径错误先独立验证 server 命令6. 把概念跑起来从统一 Key 到可复用的 Agent 骨架概念梳理完之后真正有价值的是能跑起来的最小骨架。你可以按这个顺序推进先用 TaoToken 统一 Key 跑通一次普通对话确认 Base URL、Key、Model ID 三件套没问题然后把对话换成带 tools 参数的请求验证工具调用链路接着把 ReAct 循环套上去观察 Thought → Action → Observation 的完整过程最后把 skills 的SKILL.md结构引入让 Agent 在调用工具前先加载领域知识。这个过程中统一 Key 的价值会越来越明显——你不需要在 ReAct 循环里为每次模型调用切换配置也不需要因为换了模型就重写工具调用代码。Base URL 固定、Key 固定、只改 Model ID就能在规划阶段用强模型、执行阶段用便宜模型把成本控制住。如果你要长期做 Agent 开发建议把 Coding Plan 用起来它适合需要持续调用模型、反复调试 Agent 逻辑的场景。模型对话入口可以用来快速验证单个推理模式的效果接入文档里有完整的参数说明和示例代码。把这几个入口配合使用概念验证和工程落地之间的路径会短很多。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。