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

前言

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


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

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

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

关键变化

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

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

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

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

工具封装的核心要素

工具描述三要素

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

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

智能体会自动:

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

封装流程总结

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

工具调用的价值

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

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐