量子计算噪声抑制与最优控制理论应用
2026/6/3 4:44:04
假设你已经有一个简单的天气查询功能,如何把它变成大模型可以调用的工具?本文将带你完成从普通函数到大模型工具的完整封装过程。
首先,我们有一个简单的天气查询函数:
# weather_service.pyimportrequestsdefget_weather(city:str)->str:""" 查询指定城市的天气信息 Args: city: 城市名称(中文或拼音) Returns: 天气信息字符串 """# 使用公开的天气API(这里模拟实现)api_url=f"https://api.example.com/weather?city={city}"try:response=requests.get(api_url)data=response.json()# 提取关键信息weather_info={"城市":data.get("city",city),"温度":f"{data.get('temp','未知')}°C","湿度":f"{data.get('humidity','未知')}%","天气":data.get("weather","未知"),"风速":f"{data.get('wind_speed','未知')}m/s"}# 格式化输出result="\n".join([f"{k}:{v}"fork,vinweather_info.items()])returnresultexceptExceptionase:returnf"查询天气失败:{str(e)}"# 测试功能if__name__=="__main__":print(get_weather("北京"))输出示例:
城市: 北京 温度: 26°C 湿度: 65% 天气: 晴 风速: 3.2 m/s要让大模型能够调用这个函数,需要添加工具描述信息。在 LangChain 中,这非常简单:
# weather_tool.pyfromlangchain_core.toolsimporttoolimportrequests@tooldefget_weather(city:str)->str:""" 查询指定城市的实时天气信息 Args: city: 城市名称,可以是中文(如"北京")或拼音(如"beijing") Returns: 包含城市、温度、湿度、天气状况、风速的详细信息字符串 """api_url=f"https://api.example.com/weather?city={city}"try:response=requests.get(api_url)data=response.json()weather_info={"城市":data.get("city",city),"温度":f"{data.get('temp','未知')}°C","湿度":f"{data.get('humidity','未知')}%","天气":data.get("weather","未知"),"风速":f"{data.get('wind_speed','未知')}m/s"}return"\n".join([f"{k}:{v}"fork,vinweather_info.items()])exceptExceptionase:returnf"查询天气失败:{str(e)}"关键变化:
@tool装饰器现在让大模型知道这个工具,并学会调用它:
# weather_agent.pyfromlangchain_openaiimportChatOpenAIfromlangchain.agentsimportcreate_tool_calling_agent,AgentExecutorfromlangchain_core.promptsimportChatPromptTemplate,MessagesPlaceholderfromweather_toolimportget_weather# 1. 初始化大模型(使用本地 Ollama)llm=ChatOpenAI(base_url="http://localhost:11434/v1/",api_key="ollama",model="qwen3.5:4b")# 2. 定义工具列表tools=[get_weather]# 3. 定义系统提示词prompt=ChatPromptTemplate.from_messages([("system","你是一个专业的天气助手。当用户询问天气时,请调用 get_weather 工具获取天气信息,然后用友好的语言总结给用户。"),("user","{input}"),MessagesPlaceholder(variable_name="agent_scratchpad"),])# 4. 创建智能体agent=create_tool_calling_agent(llm,tools,prompt)# 5. 创建执行器agent_executor=AgentExecutor(agent=agent,tools=tools,verbose=True)# 测试智能体if__name__=="__main__":result=agent_executor.invoke({"input":"北京今天天气怎么样?"})print("\n=== 最终回复 ===")print(result["output"])用户输入:
北京今天天气怎么样?智能体执行过程(verbose 模式):
> 我需要调用 get_weather 工具来查询北京的天气。 > 正在调用工具: get_weather(city="北京") > 工具返回: 城市: 北京 温度: 26°C 湿度: 65% 天气: 晴 风速: 3.2 m/s > 我已经获取到北京的天气信息,可以总结给用户了。最终回复:
北京今天天气晴朗,温度26°C,湿度65%,风速3.2 m/s。天气不错,适合外出活动!一个好的工具描述需要包含:
@tooldefyour_tool(param1:str,param2:int)->str:""" 工具功能的详细描述(大模型会阅读这段文字来决定是否调用) Args: param1: 参数1的说明,包括格式要求 param2: 参数2的说明,包括取值范围 Returns: 返回值的格式和内容说明 """# 函数实现pass| 作用 | 说明 |
|---|---|
| 扩展能力边界 | 让大模型能做它本身做不到的事(如查询实时数据) |
| 获取实时信息 | 大模型的知识是固定的,工具可以获取最新数据 |
| 执行具体操作 | 调用外部API、数据库查询、文件操作等 |
| 保证准确性 | 关键数据通过工具获取,避免幻觉 |
| 实现自动化 | 智能体可以自动决定何时调用哪个工具 |
weather_agent/ ├── weather_service.py # 原始天气服务 ├── weather_tool.py # 封装后的工具 ├── weather_agent.py # 智能体主程序 └── requirements.txt # 依赖配置requirements.txt:
langchain langchain-openai requests当你有多个工具时,智能体会自动选择合适的工具:
# 新增工具示例@tooldefget_news(topic:str)->str:"""获取指定主题的最新新闻"""# 实现...pass@tooldefcalculate(expression:str)->str:"""计算数学表达式"""# 实现...pass# 更新工具列表tools=[get_weather,get_news,calculate]# 测试result=agent_executor.invoke({"input":"上海明天天气怎么样?还有最近的科技新闻有哪些?"})智能体会自动:
普通函数 → 添加 @tool 装饰器 → 编写详细文档 → 绑定到智能体 → 大模型自动调用