现有项目智能体加持:从天气查询功能到大模型工具封装
·
现有项目智能体加持:从天气查询功能到大模型工具封装
前言
假设你已经有一个简单的天气查询功能,如何把它变成大模型可以调用的工具?本文将带你完成从普通函数到大模型工具的完整封装过程。
第一步:实现天气查询功能
首先,我们有一个简单的天气查询函数:
# weather_service.py
import requests
def get_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}" for k, v in weather_info.items()])
return result
except Exception as e:
return f"查询天气失败:{str(e)}"
# 测试功能
if __name__ == "__main__":
print(get_weather("北京"))
输出示例:
城市: 北京
温度: 26°C
湿度: 65%
天气: 晴
风速: 3.2 m/s
第二步:封装成大模型工具
要让大模型能够调用这个函数,需要添加工具描述信息。在 LangChain 中,这非常简单:
# weather_tool.py
from langchain_core.tools import tool
import requests
@tool
def get_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}" for k, v in weather_info.items()])
except Exception as e:
return f"查询天气失败:{str(e)}"
关键变化:
- 添加了
@tool装饰器 - 函数文档字符串变得更详细(大模型需要这些信息来理解工具)
第三步:创建智能体并绑定工具
现在让大模型知道这个工具,并学会调用它:
# weather_agent.py
from langchain_openai import ChatOpenAI
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from weather_tool import get_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。天气不错,适合外出活动!
工具封装的核心要素
工具描述三要素
一个好的工具描述需要包含:
- 功能说明:工具能做什么
- 参数定义:需要什么输入,格式是什么
- 返回说明:输出是什么格式
@tool
def your_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
进阶:多个工具组合
当你有多个工具时,智能体会自动选择合适的工具:
# 新增工具示例
@tool
def get_news(topic: str) -> str:
"""获取指定主题的最新新闻"""
# 实现...
pass
@tool
def calculate(expression: str) -> str:
"""计算数学表达式"""
# 实现...
pass
# 更新工具列表
tools = [get_weather, get_news, calculate]
# 测试
result = agent_executor.invoke({"input": "上海明天天气怎么样?还有最近的科技新闻有哪些?"})
智能体会自动:
- 识别需要调用两个工具
- 先调用 get_weather(“上海”)
- 再调用 get_news(“科技”)
- 综合两个结果回复用户
封装流程总结
普通函数 → 添加 @tool 装饰器 → 编写详细文档 → 绑定到智能体 → 大模型自动调用
工具调用的价值
- 从"只能说"到"能做事":大模型不再只是聊天,而是可以执行实际操作
- 连接虚拟与现实:把AI的推理能力和现实世界的数据、服务连接起来
- 构建智能工作流:多个工具组合可以实现复杂的自动化任务
更多推荐

所有评论(0)