
当然下面我将为你展示一个完整的、可运行的天气查询工具封装示例。这个示例会涵盖从最基础的原生函数定义到使用LangChain框架的两种主流方式让你直观地看到代码是如何工作的。核心工具的定义要素在看代码前我们先明确一个标准的工具Tool通常包含哪几个核心要素。无论使用哪种框架这些要素都是通用的name (名称)工具的唯一标识符供 LLM 调用如 get_weather。description (描述)清晰说明工具的功能帮助 LLM 理解“在什么情况下使用它”如 “获取指定城市的实时天气信息”。parameters (参数)定义工具需要接收哪些输入包括参数名、类型、是否必需等。这通常使用 JSON Schema 格式来定义。function (执行逻辑)当 LLM 决定调用工具后真正执行业务逻辑的代码如调用天气 API 并返回结果。示例一原生 API 调用方式 (以 OpenAI 为例)这种方式最底层能让你清晰地看到 LLM 与工具之间的交互流程几乎所有高级框架都基于这个原理构建。环境准备pip install openaifrom openai import OpenAIimport json定义工具 (Tools)这是一个符合 OpenAI API 规范的工具定义列表tools [{“type”: “function”,“function”: {“name”: “get_weather”,“description”: “获取指定城市的实时天气信息”,“parameters”: {“type”: “object”,“properties”: {“city”: {“type”: “string”,“description”: “城市名称如’北京’、‘上海’”},“unit”: {“type”: “string”,“enum”: [“celsius”, “fahrenheit”],“description”: “温度单位”}},“required”: [“city”] # 必填参数}}}]实现工具的实际执行逻辑def get_weather(city: str, unit: str “celsius”) - dict:“”“模拟的天气查询函数实际应用中会调用第三方API”“”# 这里是模拟数据你可以替换成真实的API调用逻辑print(f【工具执行中】正在查询 {city} 的天气单位: {unit})return {“city”: city,“temperature”: 25 if unit “celsius” else 77,“condition”: “晴朗”}创建一个简单的Agent循环def run_agent(user_message: str):client OpenAI()messages [{“role”: “user”, “content”: user_message}]while True: # 第一步调用大模型传入工具定义 response client.chat.completions.create( modelgpt-4o-mini, # 也可以替换为 qwen-max 等国内模型 messagesmessages, toolstools, tool_choiceauto # 让模型自动决定是否调用工具 ) msg response.choices[0].message # 将模型的回复可能包含工具调用指令加入对话历史 messages.append(msg) # 第二步检查模型是否决定调用工具 if msg.tool_calls: for tool_call in msg.tool_calls: # 解析工具调用信息 function_name tool_call.function.name function_args json.loads(tool_call.function.arguments) # 根据工具名进行路由执行对应的函数 if function_name get_weather: result get_weather(**function_args) # 将工具执行的结果以特定格式加入对话历史 messages.append({ role: tool, tool_call_id: tool_call.id, # 必须与上一步的id匹配 content: json.dumps(result, ensure_asciiFalse) }) else: # 如果模型没有调用工具说明它已经准备好生成最终回复 print(fnAgent最终回复: {msg.content}) break运行你的Agentif name “main”:run_agent(“北京今天多少度”)# run_agent(“查一下上海的天气然后和北京的比较一下。”)代码执行流程解析定义工具我们创建了一个 tools 列表里面定义了一个名为 get_weather 的工具包括它的描述和参数城市、单位。实现逻辑get_weather 函数是工具的实际执行体这里用模拟数据代替了真实的 API 调用。Agent 循环run_agent 函数是核心它实现了经典的 ReAct 循环思考 (Reason)调用大模型传入用户问题和工具列表模型会决定下一步是调用工具还是直接回答。行动 (Act)如果模型决定调用工具我们就解析指令执行 get_weather 函数。观察 (Observe)将工具执行的结果如 {“city”: “北京”, “temperature”: 25}以特定格式塞回对话历史。循环带着新的信息再次调用大模型让它基于最新信息继续思考直到任务完成。示例二使用 LangChain 框架 (推荐)LangChain 是一个流行的 Agent 开发框架它极大地简化了工具的创建和管理。以下是使用 LangChain 重写的等效代码环境准备pip install langchainfrom langchain_core.tools import toolfrom langchain_openai import ChatOpenAI # 以OpenAI为例也可替换为其他模型使用 tool 装饰器定义工具 (LangChain方式)tooldef get_weather(city: str, unit: str “celsius”) - str:“”获取指定城市的天气信息。Args: city: 城市名称 unit: 温度单位默认为celsius # 这里是模拟数据替换为真实的API调用 print(f【LangChain工具执行中】正在查询 {city} 的天气单位: {unit}) return f{city} 今天天气晴朗气温25摄氏度。创建AgentLangChain会自动从tool装饰的函数中提取name, description, argstools [get_weather]初始化大模型llm ChatOpenAI(model“gpt-4o-mini”)创建一个默认的Agent执行器 (具体如何创建Agent和Executor取决于LangChain版本)由于LangChain API更新较快此处省略具体创建步骤重点展示工具定义agent_executor create_some_kind_of_agent_executor(llm, tools)运行Agent (伪代码)agent_executor.invoke({“input”: “北京今天多少度”})— 更高级的定义方式 (使用Pydantic) —from pydantic import BaseModel, Field定义工具的输入参数模型class WeatherInput(BaseModel):city: str Field(description“城市名称”)unit: str Field(default“celsius”, description“温度单位”)使用tool装饰器并指定args_schematool(args_schemaWeatherInput)def get_weather_advanced(input: WeatherInput) - str:“”“获取指定城市的天气信息(高级版)。”“”print(f【LangChain高级工具执行中】正在查询 {input.city} 的天气单位: {input.unit}“)return f”{input.city} 今天天气晴朗气温25摄氏度。此时tools列表应使用这个高级版工具tools_advanced [get_weather_advanced]LangChain 的优势代码简洁使用 tool 装饰器只需写一个普通函数框架会自动帮你提取 name, description, parameters。类型安全通过集成 Pydantic 模型可以非常优雅地定义复杂的输入输出结构并进行自动验证。生态丰富LangChain 拥有庞大的生态内置了成百上千种现成的工具如搜索、数据库、各种API可以直接拿来用。总结与建议从原生到框架建议先理解示例一的原理这是 Agent 工作的基石。然后再使用示例二的框架来提高开发效率。工具的质量决定Agent的智商一个优秀的工具关键在于清晰的描述 (description) 和严谨的参数定义 (parameters)。这直接决定了 LLM 能否准确地理解和使用它。从模拟到真实在示例中我们用一个返回固定值的函数模拟了工具。在你的实际项目中只需要将函数体内的逻辑替换为真实的 API 调用、数据库查询或代码执行即可。希望这个详细的代码示例能帮助你更好地理解和实践 Agent 的工具调用如果你在运行或修改代码时遇到任何问题随时可以提问。