现有项目智能体加持:从天气查询功能到大模型工具封装
2026/6/3 4:35:57 网站建设 项目流程

现有项目智能体加持:从天气查询功能到大模型工具封装

前言

假设你已经有一个简单的天气查询功能,如何把它变成大模型可以调用的工具?本文将带你完成从普通函数到大模型工具的完整封装过程。


第一步:实现天气查询功能

首先,我们有一个简单的天气查询函数:

# 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)}"

关键变化

  1. 添加了@tool装饰器
  2. 函数文档字符串变得更详细(大模型需要这些信息来理解工具)

第三步:创建智能体并绑定工具

现在让大模型知道这个工具,并学会调用它:

# 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。天气不错,适合外出活动!

工具封装的核心要素

工具描述三要素

一个好的工具描述需要包含:

  1. 功能说明:工具能做什么
  2. 参数定义:需要什么输入,格式是什么
  3. 返回说明:输出是什么格式
@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":"上海明天天气怎么样?还有最近的科技新闻有哪些?"})

智能体会自动:

  1. 识别需要调用两个工具
  2. 先调用 get_weather(“上海”)
  3. 再调用 get_news(“科技”)
  4. 综合两个结果回复用户

封装流程总结

普通函数 → 添加 @tool 装饰器 → 编写详细文档 → 绑定到智能体 → 大模型自动调用

工具调用的价值

  1. 从"只能说"到"能做事":大模型不再只是聊天,而是可以执行实际操作
  2. 连接虚拟与现实:把AI的推理能力和现实世界的数据、服务连接起来
  3. 构建智能工作流:多个工具组合可以实现复杂的自动化任务

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询