news 2026/7/7 22:41:29

Agent 入门实战(下篇):微观篇——动手构建你的第一个 Agent

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Agent 入门实战(下篇):微观篇——动手构建你的第一个 Agent

宏观的“地图”看完了,现在该自己变成司机,上路跑一跑。下篇我们就用OpenAI Agents SDK来动手构建一个 Agent,同时穿插对比其他框架的习惯,帮你建立“手感”。看完这篇,你就能写出一个可运行的 Agent,并对它的核心机制了然于胸。

一、环境准备与核心概念

1.1 选型:为什么先用 OpenAI Agents SDK?

  • 极其轻量:核心概念极少,学习曲线平缓。

  • Python 原生:装饰器风格定义工具,易于测试和部署。

  • 开源且与模型解耦:虽然名叫 OpenAI,但通过 SDK 的 Runner 你可以在底层接入任何兼容 OpenAI API 的模型(包括 DeepSeek、Qwen 等,只需提供base_url)。

  • 非常适合入门理解 Agent 的工具调用(Tool)、交接(Handoff)、护栏(Guardrails)三大件。

当然,如果你想在企业场景设计更复杂的状态图,LangGraph 是更好的选择;如果团队无代码诉求强,可以直接用 Coze 或 Dify。但原理是相通的。

1.2 安装与环境

确保 Python >= 3.10,安装依赖:

pip install openai-agents # OpenAI Agents SDK pip install python-dotenv

设置 API Key(可以直接用 OpenAI 的 Key,也可以用兼容服务):

export OPENAI_API_KEY="your-api-key" # 如果使用中转或国产模型,设置 base_url # export OPENAI_BASE_URL="https://your-endpoint/v1"

1.3 三大核心概念速览

  1. Agent:具有名称、指令(instructions)和一组工具(tools)的智能体。指令告诉它角色和任务,工具赋予它行动能力。

  2. Tool:一个被@function_tool装饰的 Python 函数,Agent 会自主决定何时调用。你只需把函数写好、文档字符串(docstring)写清楚,模型就会自动生成正确的调用参数。

  3. Handoff:把一个 Agent 的对话控制权移交给另一个 Agent,用于多 Agent 协作,例如前台接待 Agent 把用户转接给技术支持 Agent。

此外还有Guardrails(对输入/输出进行校验和过滤)和Tracing(调试追踪)。

二、从零构建:一个带工具的“生活助手”Agent

我们将做一个能查天气算数学题的简单 Agent。任务:

  • 用户问“北京今天天气怎么样?” → Agent 调用天气工具(模拟)返回信息。

  • 用户问“123 * 456 等于多少?” → Agent 调用计算器工具。

  • 用户闲聊 → Agent 正常回复。

2.1 定义工具

import asyncio from agents import Agent, Runner, function_tool @function_tool def get_weather(city: str) -> str: """获取指定城市的实时天气情况。 Args: city: 城市名称,如 'Beijing' 或 'Shanghai' """ # 模拟天气数据,实际项目中可调用天气 API mock_weather_db = { "beijing": "北京:晴,25°C,微风", "shanghai": "上海:小雨,22°C,东南风3级", } return mock_weather_db.get(city.lower(), f"抱歉,暂无{city}的天气数据。") @function_tool def calculator(expression: str) -> str: """执行数学运算,支持加减乘除和括号。 Args: expression: 数学表达式字符串,如 '3+5*2' """ try: # 安全计算:仅允许数字和基本运算符 allowed_chars = set("0123456789+-*/(). ") if not set(expression).issubset(allowed_chars): return "错误:表达式包含不允许的字符" result = eval(expression) return f"计算结果:{result}" except Exception as e: return f"计算出错:{str(e)}"

关键在于docstring 写清楚功能、参数和返回值——模型就是通过读取这些描述来决定何时调用、传什么参数。

2.2 创建 Agent 并运行

# 创建 Agent life_assistant = Agent( name="生活助手", instructions="你是一个友好的生活助手。你可以帮用户查询天气和执行数学计算。" "如果用户的问题超出你的能力范围,请礼貌地告诉他们。", tools=[get_weather, calculator], ) async def main(): # 运行对话 result = await Runner.run( life_assistant, input="北京今天天气如何?另外帮我算一下 456 * 789" ) print(result.final_output) asyncio.run(main())

输出会类似:

北京今天天气晴朗,25°C,微风。456 * 789 的计算结果是 359784。有其它需要帮你的吗?

你不需要写任何 if-else 判断意图,Agent 自己规划了步骤:先调用get_weather("Beijing"),再调用calculator("456*789"),最后汇总生成回复。这就是ReAct 循环的实际体现。

2.3 查看 Agent 思考过程(调试利器)

在实际开发中,我们经常需要知道 Agent “脑子里”发生了什么。Runner 支持流式输出和追踪:

result = await Runner.run( life_assistant, input="上海天气怎么样?", ) # 打印出每一步的工具调用和推理 for step in result.to_input_list(): print(step)

你会看到类似tool_call事件的字典,包含调用的工具名和参数。这能快速定位“为什么 Agent 没按预期调用工具”等问题。

三、升级:引入第二个 Agent 和 Handoff(多 Agent 交接)

真实场景中,单个 Agent 难以应对所有问题。我们再加一个“技术支持”Agent,当用户遇到报错、代码问题时,生活助手可以把对话转交给它。

tech_agent = Agent( name="技术支持", instructions="你是技术专家,解决编程、服务器、软件相关问题。请用专业但易懂的语言回答。", tools=[], # 也可以加入代码执行等工具 ) # 修改生活助手的指令,告知它可以转接 life_assistant_v2 = Agent( name="生活助手Pro", instructions="你是生活助手,可以查天气、计算数学。" "当用户提问涉及编程、技术故障、报错代码等问题时," "立即使用 transfer_to_tech 将对话交给技术支持专家。", tools=[get_weather, calculator], handoffs=[tech_agent], # 注册可交接的 Agent )

这里的handoffs是传递给Agent构造函数的参数,SDK 会自动生成一个名为transfer_to_tech的工具。当大模型判断用户问题属于技术支持范畴时,它会调用这个工具,Runner 就会无缝地把当前对话上下文移交给tech_agent,由它继续回复。

测试一下:

async def test_handoff(): result = await Runner.run( life_assistant_v2, input="我部署服务时遇到 502 Bad Gateway 错误怎么办?" ) print(result.final_output)

你会看到最终回复是技术 Agent 给出的详细排查步骤,而不是生活助手强答。无需额外编写路由逻辑,整个交接由模型驱动——这就是 Handoff 的优雅。

四、从玩具到生产:必须考虑的四个维度

上面的 Demo 可爱但在真实环境远远不够。要让 Agent 稳定落地,需要升级以下四个维度:

4.1 工具安全与鲁棒性

真实工具会操作数据库、发送邮件、修改文件。你必须:

  • 校验输入参数(不仅是类型,还有取值范围)

  • 加入 Human-in-the-loop(敏感操作需人工确认)

  • 设置超时和重试机制

  • 错误标准化(抛出带有可读信息的异常,而非让 Agent 去猜)

在 OpenAI Agents SDK 中可以给 Agent 设置guardrails,比如input_guardrails检查用户输入是否包含注入攻击,output_guardrails校验输出是否符合预设格式。

4.2 记忆与上下文管理

Demo 中每次Runner.run都是无状态的。生产系统需要:

  • 会话管理:维护session_id,把历史对话存储在 Redis/数据库中。

  • 长记忆:超出上下文窗口时,自动做摘要或滑动窗口截断。

  • 用户画像:从对话中抽取偏好存入长期记忆,下次对话加载。

你可以在 Agent 的instructions中注入“你正在和用户小明对话,他偏好简洁回答”,实现轻量个性化。

4.3 评估与可观测性

不能靠“感觉”来判断 Agent 好不好。建立评估体系:

  • 合成评估集:根据真实业务场景,人工编写 100 条指令和预期结果,每次修改后自动回归。

  • LLM 裁判:用更强模型(如 GPT-4o)对 Agent 输出的准确性、完整性、安全性打分。

  • 轨迹分析:接入 Langfuse 或 Braintrust 等平台,查看每一步的延迟、token 消耗、工具调用成功率。

OpenAI Agents SDK 自带Tracing功能,能导出至 OpenAI Dashboard 或自定义 Collector,看每一轮的工具调用、耗时。

4.4 部署架构

简单的 Agent 可以封装成 FastAPI 服务,放入 Docker,再用 Kubernetes 编排。对于需要长时间运行、多步骤的 Agent,要考虑异步任务队列(如 Celery),避免 HTTP 超时。流式输出使用 SSE(Server-Sent Events)或 WebSocket 提升体验。

五、Agent 工程师的进阶学习路线图

完成以上实战,你已是一名“入门级 Agent 工程师”。如果想在这个领域持续精进,推荐按以下路径爬升:

  1. 深入框架源码:阅读 LangGraph 或 AutoGen 的源码,理解图状态管理、检查点、人机回环的真正实现。

  2. 规划与推理优化:研究 Tree-of-Thoughts、Reflexion(自我反思)、LLM Compiler 等论文,并在框架中复现。

  3. Agentic RAG:让 Agent 决定检索什么、何时检索、怎么切分,构建主动型知识助手。

  4. 多 Agent 系统设计:设计合理的分工拓扑,处理 Agent 间的共识、冲突和资源竞争。参考 CAMEL、ChatDev 等研究。

  5. 安全与对齐:提示注入防御、内容安全、基于 RLHF 的行为对齐,都是企业级 Agent 的必修课。

  6. 紧跟协议演进:MCP 和 A2A 协议正在成为行业标准,熟悉它们能让你构建的 Agent 融入更大的生态。

六、写在最后

Agent 不是一个魔法盒子,它的本质是“大模型作为推理引擎 + 工程化的控制逻辑 + 确定性的工具衔接”。入门 Agent 开发,关键不在于跑通某个 Demo,而在于建立起“AI 的思维方式”:你需要预判模型会做什么、何时会犯错、如何为它编织一张安全的网。

从今天起,把你平时在命令行敲的脚本、在网页上手动查询的操作,试着抽象成一个个 Tool,然后交给 Agent 去调度。你会慢慢发现,自己正在从一个“代码的搬运工”,转变成“智能系统的导演”。

当某一天,你构建的 Agent 独立完成了一项原本需要团队半天才能搞定的复杂任务时,你可能会心一笑——这个世界,真的开始变了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/3 4:24:46

Sunshine游戏串流服务器:如何用开源技术打造你的个人游戏云

Sunshine游戏串流服务器:如何用开源技术打造你的个人游戏云 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 想象一下这样的场景:你正躺在客厅的沙发上&…

作者头像 李华
网站建设 2026/7/3 5:29:11

终极指南:3分钟解决Windows与iPhone USB网络共享驱动问题

终极指南:3分钟解决Windows与iPhone USB网络共享驱动问题 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitcode.com/gh_…

作者头像 李华
网站建设 2026/7/2 16:54:19

从内核到用户态:Rust 系统编程的安全边界与最佳实践

从内核到用户态:Rust 系统编程的安全边界与最佳实践一、系统编程的信任链:内核接口与安全抽象 系统编程的核心是与操作系统内核交互:文件 IO、网络通信、进程管理、内存映射。这些操作通过系统调用(syscall)完成&#…

作者头像 李华
网站建设 2026/7/3 5:33:30

A股代码与公司名称映射全解析:从000001到900957

1. A股代码编排规则解析 A股市场的股票代码看似随机排列,实则暗藏玄机。这套数字编码系统从上世纪90年代沿用至今,已经成为中国资本市场的独特标识。理解代码编排规律,就像掌握了一把打开A股大门的钥匙。 目前A股代码采用6位数字编码&#xf…

作者头像 李华
网站建设 2026/7/3 10:59:39

从TVOC到CO2:模拟监测模块的规格解析与应用指南

1. 从TVOC到CO2的转换原理揭秘 第一次接触这种用TVOC传感器模拟CO2数值的方案时,我和很多工程师一样充满疑问:这玩意儿靠谱吗?实测下来发现,这种方案在智能家居领域确实是个性价比极高的选择。它的核心原理是通过检测空气中总挥发…

作者头像 李华
网站建设 2026/7/3 20:53:09

KEIL编译实战:从恼人警告到高效调试的避坑指南

1. 为什么KEIL警告值得你认真对待? 第一次用KEIL编译工程时,看到满屏的黄色警告,我天真地以为"能跑就行"。直到某次产品量产前,一个被忽略的"#188-D枚举类型混合警告"导致设备在极端温度下死机,我…

作者头像 李华