如果你是一名开发者,最近可能被各种“AI Agent”和“超级智能体”的概念刷屏了。从OpenAI的o1到DeepSeek的DeepSeek-R1,再到各路创业公司,似乎不搞个“智能体”就落伍了。但热闹背后,一个核心问题却越来越模糊:我们到底在构建什么?是又一个聊天机器人,还是一个能真正理解意图、分解任务、调用工具并完成闭环的“智能体”?
英伟达创始人黄仁勋在最近的演讲中,将“构建超级智能体”视为AI发展的下一波浪潮。这并非空谈,而是基于一个清晰的判断:未来的AI不是单点工具,而是能够自主规划、执行复杂任务序列的“智能体”。对于开发者而言,这意味着我们的工作重心将从“调教大模型”转向“设计智能体系统”。
本文将深入拆解“超级智能体”背后的技术逻辑与工程实践。我们不会停留在概念讨论,而是聚焦于:一个具备规划、记忆、工具使用能力的智能体,其核心架构是什么?如何用代码实现一个最小可运行的智能体?以及,在构建过程中,开发者最容易踩哪些坑?无论你是想为自己的项目添加AI能力,还是希望深入理解Agent技术栈,这篇文章都将提供从原理到落地的完整路径。
1. 从“聊天”到“做事”:智能体的本质是什么?
在深入技术细节前,我们必须先厘清一个关键区别:聊天机器人 vs. 智能体。
- 聊天机器人 (Chatbot):本质是“对话模拟”。它根据你的上文,预测最可能的下文。它的目标是让对话流畅、合理,但并不保证“完成任务”。你问它“帮我订一张明天北京到上海的机票”,它可能会给你一个订票网站的链接,甚至编造一个不存在的航班号。它“知道”该说什么,但不知道“如何做”。
- 智能体 (Agent):本质是“任务执行器”。它的核心目标是在给定目标下,通过感知、规划、行动、反思的循环,最终达成目标。对于“订机票”这个任务,一个合格的智能体应该能:1)理解你的意图(时间、地点、偏好);2)规划步骤(查询航班、比价、选择、填写信息、支付);3)调用相应的工具(航班查询API、支付接口);4)处理执行中的异常(如航班售罄);5)最终将确认信息反馈给你。
黄仁勋所说的“超级智能体”,可以理解为能力边界极大扩展的智能体。它可能整合了视觉、听觉、文本等多模态感知,能调用成千上万个专业工具(从代码库到物理机器人),并具备长期记忆和复杂的战略规划能力。
对于开发者,构建智能体的核心挑战从“让模型说得对”变成了“让系统做得成”。这涉及到一整套新的技术栈和设计范式。
2. 智能体的核心架构:ReAct模式与工具使用
目前,最主流的智能体架构范式是ReAct (Reasoning + Acting)。它模拟了人类解决问题的方式:先思考(Reason),再行动(Act),并根据行动结果调整下一步思考。
一个典型的ReAct智能体工作流程如下:
- 观察 (Observe):接收用户指令和当前环境状态(包括记忆、工具执行结果等)。
- 思考 (Think):分析当前情况,决定下一步该做什么。是调用某个工具?还是直接给出最终答案?这一步通常由大语言模型驱动。
- 行动 (Act):执行决定。如果是调用工具,则格式化参数并调用;如果是给出答案,则生成回复。
- 循环:将行动的结果作为新的“观察”,进入下一轮循环,直到任务完成或达到终止条件。
这个循环的核心是“工具使用 (Tool Use)”。智能体本身不具备订票、写数据库、发邮件的能力,它必须通过调用外部工具来实现。因此,智能体框架的核心职责之一,就是让大模型学会在正确的时机,以正确的格式,调用正确的工具。
下面是一个高度简化的智能体系统组件图:
用户输入 │ ▼ [智能体核心引擎 (LLM + 规划器)] │ ├──► [记忆模块] (短期/长期记忆) ├──► [工具库] (搜索、计算、API等) └──► [执行器] (调用工具、处理结果) │ ▼ 最终输出/行动结果3. 环境准备:构建智能体的技术栈选择
在开始编码前,你需要选择合适的技术栈。目前主要有两类选择:
A. 使用高阶框架(快速入门)这类框架封装了智能体的核心循环、工具调用、记忆管理等复杂逻辑,你只需要定义工具和任务目标。适合快速验证想法和构建原型。
- LangChain / LangGraph:生态最丰富,社区活跃,提供了从简单链式调用到复杂状态机(LangGraph)的全套方案。缺点是抽象层次高,有时不够透明。
- LlamaIndex:最初专注于数据索引和检索,现在也提供了强大的智能体构建能力,尤其在与私有知识库结合的场景下表现出色。
- AutoGen (微软):支持多智能体协作,适合需要多个智能体对话、协商完成任务的场景。
B. 从零构建(深度控制)如果你想彻底理解智能体每一环的工作原理,或者有高度定制化的需求,可以从底层开始构建。核心依赖通常包括:
- 大语言模型API:OpenAI GPT-4/3.5、Anthropic Claude、国内大模型API等。这是智能体的“大脑”。
- 开发语言:Python是绝对主流,因其在AI和数据科学领域的丰富库支持。
- 工具调用基础库:如
requests调用外部API,sqlalchemy操作数据库等。
本文将以LangChain为例进行演示,因为它平衡了易用性和灵活性,且能清晰地展示智能体的核心概念。请确保你的环境已准备好:
# 创建并激活虚拟环境(推荐) python -m venv agent_env source agent_env/bin/activate # Linux/macOS # agent_env\Scripts\activate # Windows # 安装核心依赖 pip install langchain langchain-openai # 安装社区版工具包(包含一些常用工具,如搜索、数学计算) pip install langchain-community同时,你需要准备一个可用的大模型API密钥。本文示例使用OpenAI API,你可以在 OpenAI平台 获取。请将其设置为环境变量:
export OPENAI_API_KEY='你的-api-key' # Windows (PowerShell): $env:OPENAI_API_KEY='你的-api-key'4. 核心流程拆解:五步构建一个天气查询智能体
让我们通过一个具体的例子——构建一个能查询多城市天气并给出穿衣建议的智能体——来拆解整个构建流程。
4.1 第一步:定义工具(赋予智能体“手脚”)
智能体不会凭空知道天气,它需要调用天气API。我们首先定义一个工具函数,并将其“包装”成LangChain能识别的工具。
# weather_agent.py import requests from langchain.tools import tool from typing import Optional # 定义一个实际的天气查询函数(这里使用一个假想的免费API) def get_real_weather(city: str) -> Optional[dict]: """查询指定城市的真实天气信息。""" # 注意:此处为示例,实际需替换为真实的天气API,如OpenWeatherMap # 假设的API端点 url = f"https://api.weatherapi.com/v1/current.json?key=YOUR_KEY&q={city}" try: response = requests.get(url, timeout=10) response.raise_for_status() data = response.json() # 提取我们需要的信息 return { "city": data['location']['name'], "temp_c": data['current']['temp_c'], "condition": data['current']['condition']['text'], "humidity": data['current']['humidity'], "wind_kph": data['current']['wind_kph'] } except Exception as e: return {"error": f"查询{city}天气失败: {str(e)}"} # 使用LangChain的@tool装饰器将其声明为一个工具 @tool def get_weather(city: str) -> str: """ 获取指定城市的当前天气情况。 Args: city: 城市名称,例如“北京”、“Shanghai”。 Returns: 一个描述天气的字符串。 """ weather_info = get_real_weather(city) if "error" in weather_info: return weather_info["error"] return (f"{weather_info['city']}的天气:" f"温度{weather_info['temp_c']}°C," f"天气状况{weather_info['condition']}," f"湿度{weather_info['humidity']}%," f"风速{weather_info['wind_kph']}公里/小时。") # 再定义一个简单的穿衣建议工具(基于规则) @tool def get_clothing_advice(temp_c: float, condition: str) -> str: """ 根据温度和天气状况提供简单的穿衣建议。 Args: temp_c: 摄氏温度。 condition: 天气状况,如“晴”、“雨”、“雪”。 Returns: 穿衣建议字符串。 """ advice = [] if temp_c > 25: advice.append("天气炎热,建议穿短袖、短裤等轻薄衣物。") elif temp_c > 15: advice.append("天气温暖,建议穿长袖T恤、薄外套。") elif temp_c > 5: advice.append("天气较凉,建议穿毛衣、夹克。") else: advice.append("天气寒冷,建议穿羽绒服、厚毛衣,注意保暖。") if "雨" in condition: advice.append("今天有雨,请记得带伞。") if "雪" in condition: advice.append("今天下雪,请注意路滑,穿戴防滑鞋。") return " ".join(advice)关键点:
@tool装饰器是LangChain的标准做法,它会自动生成工具的描述,供大模型理解工具的功能。- 工具函数的文档字符串 (docstring)至关重要!大模型依靠它来决定是否以及如何调用该工具。描述必须清晰、准确,包含参数说明。
4.2 第二步:创建工具列表并初始化智能体
我们将定义好的工具放入一个列表,然后使用LangChain的create_react_agent来创建一个遵循ReAct模式的智能体。
# weather_agent.py (续) from langchain import hub from langchain.agents import create_react_agent, AgentExecutor from langchain_openai import ChatOpenAI # 1. 创建LLM(智能体的大脑) llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0) # temperature=0使输出更确定 # 2. 准备工具列表 tools = [get_weather, get_clothing_advice] # 3. 获取ReAct提示词模板(LangChain Hub上预定义的优秀模板) prompt = hub.pull("hwchase17/react") # 4. 创建ReAct智能体 agent = create_react_agent(llm, tools, prompt) # 5. 创建代理执行器(负责运行循环) agent_executor = AgentExecutor.from_agent_and_tools( agent=agent, tools=tools, verbose=True, # 设置为True可以看到智能体的思考过程,调试时非常有用 handle_parsing_errors=True # 处理解析错误,防止因格式问题崩溃 )关键点:
ChatOpenAI是LangChain对OpenAI聊天模型的封装。hub.pull(“hwchase17/react”)拉取了一个经过社区验证的、专门为ReAct智能体设计的提示词模板。这个模板会指导LLM按照“Thought: ... Action: ... Observation: ...”的格式进行推理。AgentExecutor是真正的“引擎”,它驱动着思考-行动的循环,直到智能体输出最终答案(Final Answer)。
4.3 第三步:运行智能体并观察其思考过程
现在,让我们用一个复杂任务来测试我们的智能体。
# weather_agent.py (续) if __name__ == "__main__": # 一个需要多步推理和工具调用的任务 task = "我想知道北京和上海现在的天气怎么样,然后根据天气给我一些出差穿衣的建议。" print(f"用户任务: {task}\n") print("="*50) try: result = agent_executor.invoke({"input": task}) print("\n" + "="*50) print(f"最终答案:\n{result['output']}") except Exception as e: print(f"执行出错: {e}")运行这个脚本 (python weather_agent.py),你将看到类似以下的输出(由于verbose=True):
用户任务: 我想知道北京和上海现在的天气怎么样,然后根据天气给我一些出差穿衣的建议。 ================================================== > Entering new AgentExecutor chain... Thought: 用户想知道北京和上海的天气,然后根据天气给出差穿衣建议。我需要先获取这两个城市的天气信息,然后根据天气信息提供穿衣建议。 Action: get_weather Action Input: {"city": "北京"} Observation: 北京的天气:温度18°C,天气状况晴,湿度45%,风速12公里/小时。 Thought: 现在我需要获取上海的天气信息。 Action: get_weather Action Input: {"city": "上海"} Observation: 上海的天气:温度22°C,天气状况多云,湿度60%,风速15公里/小时。 Thought: 现在我有了北京和上海的天气信息。北京18°C晴,上海22°C多云。接下来我需要根据这些温度和建议提供穿衣建议。我需要调用get_clothing_advice工具两次,分别针对两个城市。 Action: get_clothing_advice Action Input: {"temp_c": 18, "condition": "晴"} Observation: 天气较凉,建议穿毛衣、夹克。 Thought: 现在为上海提供穿衣建议。 Action: get_clothing_advice Action Input: {"temp_c": 22, "condition": "多云"} Observation: 天气温暖,建议穿长袖T恤、薄外套。 Thought: 现在我可以综合所有信息给出最终答案了。 Final Answer: 根据查询: - **北京**:当前温度18°C,晴天,湿度45%,风速12公里/小时。穿衣建议:天气较凉,建议穿毛衣、夹克。 - **上海**:当前温度22°C,多云,湿度60%,风速15公里/小时。穿衣建议:天气温暖,建议穿长袖T恤、薄外套。 祝您出差顺利! > Finished chain. ================================================== 最终答案: 根据查询: - **北京**:当前温度18°C,晴天,湿度45%,风速12公里/小时。穿衣建议:天气较凉,建议穿毛衣、夹克。 - **上海**:当前温度22°C,多云,湿度60%,风速15公里/小时。穿衣建议:天气温暖,建议穿长袖T恤、薄外套。 祝您出差顺利!4.4 第四步:解析智能体的“思维链”
从verbose日志中,你可以清晰地看到智能体遵循ReAct模式:
- Thought: “用户想知道北京和上海的天气...”
- Action: 决定调用
get_weather工具,输入{"city": "北京"}。 - Observation: 收到北京天气的观察结果。
- Thought: 基于观察,决定下一步获取上海天气。
- ... 如此循环,直到它认为已经收集到足够信息,可以合成最终答案。
这就是一个智能体工作的核心:将复杂任务分解为可执行的子步骤,并动态规划执行顺序。
4.5 第五步:扩展能力 - 添加记忆
上面的智能体是“无状态”的,每次对话都从头开始。为了让智能体能进行多轮对话,我们需要为其添加记忆。
# weather_agent_with_memory.py from langchain.agents import AgentExecutor, create_react_agent from langchain_openai import ChatOpenAI from langchain.memory import ConversationBufferMemory from langchain.tools import tool import requests # ... (get_weather, get_clothing_advice 工具定义同上) ... # 1. 创建带有记忆的LLM链 llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0) tools = [get_weather, get_clothing_advice] prompt = hub.pull("hwchase17/react") # 2. 创建对话记忆 memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True) # 3. 创建智能体(注意:create_react_agent本身不直接处理记忆,需要将其整合到提示词或通过其他方式) # 更简单的方式是使用LangChain的ConversationalAgent from langchain.agents import initialize_agent agent_executor = initialize_agent( tools, llm, agent="chat-conversational-react-description", # 专门用于对话的ReAct智能体 verbose=True, memory=memory, handle_parsing_errors=True ) # 测试多轮对话 print("第一轮:") result1 = agent_executor.invoke({"input": "北京天气怎么样?"}) print(f"回答: {result1['output']}\n") print("第二轮(依赖记忆):") result2 = agent_executor.invoke({"input": "那上海呢?"}) # 智能体应该知道“那”指的是天气 print(f"回答: {result2['output']}\n") print("第三轮(复杂查询):") result3 = agent_executor.invoke({"input": "对比一下这两个城市的温度,哪个更暖和?"}) # 需要回忆之前两个城市的温度 print(f"回答: {result3['output']}")在这个例子中,ConversationBufferMemory会保存整个对话历史,并在每次调用时将其作为上下文提供给LLM,从而使智能体具备了上下文理解能力。
5. 完整示例:一个具备搜索和计算能力的通用智能体
为了更全面地展示,我们构建一个功能更丰富的智能体,它结合了网络搜索和数学计算。
# general_agent.py import os from langchain.agents import initialize_agent, AgentType from langchain_openai import ChatOpenAI from langchain_community.tools import DuckDuckGoSearchRun from langchain_community.utilities import WikipediaAPIWrapper from langchain_community.tools import WikipediaQueryRun from langchain.tools import Tool # 设置API Key os.environ["OPENAI_API_KEY"] = "你的-api-key" # 1. 初始化LLM llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0) # 2. 定义工具 # 工具A:网络搜索 search = DuckDuckGoSearchRun() search_tool = Tool( name="Web Search", func=search.run, description="Useful for when you need to answer questions about current events or real-time information. Input should be a search query." ) # 工具B:维基百科查询(用于获取权威知识) api_wrapper = WikipediaAPIWrapper(top_k_results=2, doc_content_chars_max=500) wikipedia = WikipediaQueryRun(api_wrapper=api_wrapper) wiki_tool = Tool( name="Wikipedia", func=wikipedia.run, description="Useful for when you need to get factual information about historical events, scientific concepts, famous people, etc. Input should be a specific query." ) # 工具C:数学计算(我们可以用Python的eval,但生产环境应用更安全的计算库) from langchain.tools import tool @tool def calculator(expression: str) -> str: """Evaluates a mathematical expression. Use only for simple calculations. Example: '3 * (2 + 4)' returns '18'.""" try: # 警告:生产环境中直接使用eval有安全风险,此处仅作演示。 # 应考虑使用ast.literal_eval或专用数学库如numexpr。 result = eval(expression, {"__builtins__": {}}, {}) return str(result) except Exception as e: return f"计算错误: {e}" # 3. 工具列表 tools = [search_tool, wiki_tool, calculator] # 4. 初始化智能体(使用OPENAI_FUNCTIONS Agent类型,它擅长处理工具调用) agent = initialize_agent( tools, llm, agent=AgentType.OPENAI_FUNCTIONS, # 另一种强大的智能体类型,由OpenAI函数调用驱动 verbose=True, handle_parsing_errors=True ) # 5. 测试复杂任务 complex_task = """ 请帮我做以下事情: 1. 搜索一下英伟达(NVIDIA)最新的AI芯片是什么? 2. 然后,查一下晶体管数量的摩尔定律是什么? 3. 最后,如果一块芯片有500亿个晶体管,按照摩尔定律每两年翻一番,10年前大概有多少晶体管?请计算一下。 """ print("任务:", complex_task) print("="*60) result = agent.run(complex_task) print("="*60) print("智能体最终回答:\n", result)这个智能体会:
- 识别任务需要拆解为三个子任务。
- 使用
Web Search工具查询英伟达最新AI芯片。 - 使用
Wikipedia工具查询摩尔定律的定义。 - 使用
calculator工具计算50e9 / (2**(10/2))(这是一个近似计算)。 - 综合所有结果,生成最终答案。
6. 运行结果与效果验证
运行上述general_agent.py脚本,你会看到智能体一步步调用工具、获取信息、进行计算,并最终生成一个综合性的回答。通过verbose=True的输出,你可以验证:
- 工具选择是否正确?智能体是否在正确的步骤选择了最合适的工具(如用搜索查新闻,用维基百科查概念)。
- 参数传递是否准确?智能体生成的搜索关键词或计算表达式是否合理。
- 信息整合是否连贯?最终答案是否流畅地整合了来自不同工具的信息,而不是生硬拼接。
验证智能体是否工作的核心标志:它是否在没有明确指令每一步该怎么做的情况下,自动完成了任务分解、工具调用和结果合成。
7. 常见问题与排查思路
在构建和运行智能体时,你可能会遇到以下典型问题:
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 智能体陷入循环,不停调用同一个工具。 | 1. 工具返回的结果无法让LLM做出新决策。 2. ReAct提示词模板或LLM温度设置导致思维“卡住”。 | 查看verbose日志,观察Thought是否重复。检查工具返回内容是否明确、格式是否规范。 | 1. 优化工具返回信息,使其更具信息量和指导性。 2. 尝试调整 temperature(如设为0.1-0.3)增加随机性。3. 在提示词中明确限制最大循环次数。 |
| 智能体无法正确选择工具。 | 1. 工具描述 (description) 不清晰或与任务不匹配。2. LLM能力不足,无法理解任务与工具的关联。 | 检查每个工具的description是否用自然语言准确描述了功能、输入和适用场景。 | 1. 重写工具描述,使其更精确。参考格式:“Useful for when you need to [做什么]. Input should be [什么格式].” 2. 升级到更强大的LLM(如GPT-4)。 3. 在提示词中提供少量工具选择示例(Few-shot)。 |
| 工具调用参数格式错误。 | LLM生成的参数不符合工具函数定义的参数类型(如应为JSON字符串却生成了纯文本)。 | 查看Action Input部分,确认其是否为有效的JSON或预期格式。 | 1. 使用AgentType.OPENAI_FUNCTIONS或StructuredTool,它们能更好地处理参数结构化。2. 在工具函数内部增加更健壮的参数解析和错误处理。 |
| 智能体过早给出最终答案(未调用工具)。 | 1. LLM过于自信,认为自己能直接回答。 2. 任务描述不够清晰,未体现对工具的需求。 | 查看Thought过程,是否直接跳到了Final Answer。 | 1. 在用户指令中明确要求“请使用网络搜索”或“请计算”。 2. 调整提示词模板,强调在不确定或需要实时数据时必须使用工具。 3. 使用 AgentExecutor的max_iterations参数强制其进行更多步思考。 |
| API调用超时或网络错误。 | 工具依赖的外部API不稳定或网络环境差。 | 检查工具函数的异常捕获和超时设置。 | 1. 为所有网络请求添加timeout参数。2. 实现重试机制和降级策略(如返回缓存数据)。 3. 使用异步调用提升效率。 |
8. 最佳实践与工程建议
将智能体从Demo推向生产,需要考虑更多工程化因素:
1. 工具设计原则
- 单一职责:一个工具只做一件事。不要设计一个“万能工具”。
- 描述清晰:工具的描述是LLM选择它的唯一依据。务必用自然语言写清楚用途、输入格式和输出示例。
- 健壮性:工具函数内部必须有完善的错误处理(try-catch),返回给LLM的错误信息应友好且可操作。
- 安全性:尤其是执行代码、访问数据库或操作系统的工具,必须进行严格的输入验证和权限控制。
2. 提示词工程
- 系统提示词 (System Prompt):在初始化LLM或智能体时,通过系统提示词设定其角色、行为边界和目标。例如:“你是一个有帮助的AI助手,可以调用工具来获取信息或执行计算。在回答用户问题时,如果你不确定或需要最新信息,应该主动使用工具。”
- Few-shot示例:在提示词中提供1-2个“用户问题 -> 智能体思考+调用工具”的完整示例,能显著提升智能体使用工具的准确性。
3. 记忆与状态管理
- 短期记忆:
ConversationBufferMemory适合简单对话,但长对话会导致上下文过长、成本增加且可能超出模型限制。 - 长期记忆:对于需要记住跨会话信息的智能体,需要引入向量数据库(如Chroma, Pinecone)来存储和检索关键记忆片段。
- 摘要记忆:一种高级策略是定期将对话历史摘要化,只保留核心信息,以节省上下文窗口。
4. 监控与评估
- 日志记录:详细记录智能体的每一步
Thought、Action、Observation,这是调试和优化的重要依据。 - 链路追踪 (Tracing):使用像LangSmith这样的工具,可视化智能体的执行流程,分析耗时和错误点。
- 评估指标:定义成功率、任务完成步骤数、工具调用准确率等指标,持续评估智能体性能。
5. 成本与性能优化
- 上下文管理:警惕上下文无限增长。定期清理或摘要化记忆。
- 工具缓存:对频繁调用且结果变化不快的工具(如某些知识查询),引入缓存机制。
- 模型选择:任务规划可以用能力强的模型(如GPT-4),而简单的文本生成或格式化可以用更便宜的模型(如GPT-3.5-Turbo),进行混合调用。
9. 总结与后续学习方向
构建“超级智能体”远不止是让大模型学会调用API。它是一个系统工程,涉及规划推理、工具抽象、记忆管理、状态控制和安全约束等多个层面。本文通过一个从零开始的天气查询智能体,拆解了ReAct模式的核心流程,并展示了如何使用LangChain快速搭建原型。
本文的核心价值在于澄清了:
- 智能体的本质是任务分解与动态规划的执行系统,而非增强版聊天。
- 工具使用是智能体能力的延伸,精心设计的工具描述和健壮的工具函数是成功的关键。
- 构建过程是可迭代的,可以从单一工具开始,逐步增加记忆、复杂规划和多智能体协作。
如果你想继续深入,可以探索以下方向:
- 多智能体系统 (Multi-Agent Systems):让多个具有不同专长的智能体协作解决问题(如AutoGen框架)。
- 智能体模拟与测试:创建虚拟环境来测试智能体在复杂、长期任务中的表现。
- 将智能体接入实际应用:为你的网站、APP或内部系统构建一个AI助手,处理客服、数据查询、报告生成等任务。
- 探索更底层的框架:研究像
Microsoft Guidance或直接使用大模型的Function CallingAPI,以获得更精细的控制。
技术正在快速演进,但核心原则不变:以解决真实问题为导向,从简单可用的原型开始,在迭代中不断完善你的智能体设计。建议收藏本文中的代码示例,作为你探索智能体世界的第一个可运行起点。当你开始为你的智能体添加第一个自定义工具时,真正的挑战和乐趣才刚刚开始。