如何在本地搭建天气智能体项目

如何在本地搭建天气智能体项目

项目概述

本文将介绍如何在本地搭建一个完整的天气智能体项目。项目主要分为两部分:

  1. 使用 Ollama 部署通义千问 3.5(Qwen 3.5)大模型并完成连接测试
  2. 实现天气查询功能,让大模型调用工具并给出智能回复

技术栈说明

根据 2026 年 Ollama 最新公告(v0.18.0),我们使用以下技术:

  • Ollama OpenAI 兼容 APIhttp://localhost:11434/v1/
  • LangChain Community 版的 OpenAI 接口:无需真实 API Key
  • 模型qwen3.5:4b(通义千问 3.5 4B 版本)

第一部分:本地大模型部署与测试

环境准备

首先,我们已经在本地部署了 Ollama 平台(v0.18.0 或更高版本)。Ollama 的优势在于:

  • 环境配置简单,无需复杂的 CUDA 配置
  • 模型管理方便,支持一键下载和运行
  • 提供标准的 OpenAI 兼容 API 接口
  • 支持工具调用、流式响应等高级特性

部署通义千问 3.5(Qwen 3.5)

通义千问 3.5 是阿里巴巴 2026 年推出的最新开源大模型系列,具有以下特点:

  • 原生多模态支持(文本、图像、视频)
  • 256K 超长上下文窗口
  • Apache 2.0 协议,可免费商用
  • 4B 版本仅需约 3.4GB 显存
  1. 确保 Ollama 服务已启动
  2. 下载通义千问 3.5 4B 模型:
bash 复制代码
ollama pull qwen3.5:4b

测试大模型连接(使用 OpenAI SDK)

在开始正式项目之前,我们先测试一下 OpenAI 兼容接口是否正常工作。

创建一个简单的测试脚本 test_model.py

python 复制代码
from openai import OpenAI

def test_ollama_connection():
    # 初始化 OpenAI 客户端,指向本地 Ollama
    client = OpenAI(
        base_url="http://localhost:11434/v1/",
        api_key="ollama"  # 任意字符串即可,本地不需要真实 API Key
    )
    
    try:
        # 调用聊天补全接口
        response = client.chat.completions.create(
            model="qwen3.5:4b",
            messages=[
                {"role": "user", "content": "你好,请简单介绍一下你自己。"}
            ],
            stream=False
        )
        
        print("大模型回复:")
        print(response.choices[0].message.content)
        return True
    except Exception as e:
        print(f"连接失败:{e}")
        return False

if __name__ == "__main__":
    test_ollama_connection()

运行这个脚本,如果看到大模型的自我介绍,说明连接成功!

第二部分:天气智能体实现

项目设计

我们的天气智能体需要以下功能:

  1. 用户输入所在城市
  2. 查询该城市的实时天气信息
  3. 根据天气信息给出智能建议

安装依赖

首先,安装所需的 Python 包:

bash 复制代码
pip install langchain langchain-openai requests

天气 API 集成

我们使用公开的天气 API 接口来获取天气数据。创建 weather_tool.py

python 复制代码
import requests

def get_weather(city, api_key):
    """
    获取指定城市的天气信息
    """
    base_url = "https://api.openweathermap.org/data/2.5/weather"
    params = {
        "q": city,
        "appid": api_key,
        "units": "metric",  # 使用摄氏度
        "lang": "zh_cn"
    }
    
    try:
        response = requests.get(base_url, params=params)
        response.raise_for_status()
        data = response.json()
        
        # 解析天气数据
        weather_info = {
            "城市": data["name"],
            "温度": f"{data['main']['temp']}°C",
            "体感温度": f"{data['main']['feels_like']}°C",
            "湿度": f"{data['main']['humidity']}%",
            "风速": f"{data['wind']['speed']} m/s",
            "天气描述": data["weather"][0]["description"],
            "气压": f"{data['main']['pressure']} hPa"
        }
        
        return weather_info
    except Exception as e:
        return f"获取天气信息失败:{str(e)}"

使用 LangChain Community 版 OpenAI 接口

现在我们使用 LangChain Community 版的 OpenAI 兼容接口来构建智能体。创建 weather_agent.py

python 复制代码
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.agents import create_tool_calling_agent, AgentExecutor
from weather_tool import get_weather
import json

# 1. 定义天气查询工具
@tool
def weather_tool(city: str) -> str:
    """查询指定城市的天气信息
    
    Args:
        city: 城市名称,例如 "北京"、"上海"、"Tokyo"
    
    Returns:
        天气信息的JSON字符串
    """
    # 请替换为你自己的天气 API Key
    WEATHER_API_KEY = "your_api_key_here"
    
    weather_data = get_weather(city, WEATHER_API_KEY)
    
    if isinstance(weather_data, str):
        return weather_data
    
    return json.dumps(weather_data, ensure_ascii=False)

# 2. 初始化 LangChain ChatOpenAI,指向本地 Ollama
llm = ChatOpenAI(
    base_url="http://localhost:11434/v1/",
    api_key="ollama",  # 任意字符串即可
    model="qwen3.5:4b",
    temperature=0.7
)

# 3. 定义提示词模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个专业的天气助手。当用户询问天气时,请先调用天气查询工具获取天气信息,然后根据天气信息给出友好的回复,包括温度、湿度、风速等信息,并给出是否适合出游的建议。请用简洁、友好的语气回复用户。"),
    ("user", "{input}"),
    MessagesPlaceholder(variable_name="agent_scratchpad"),
])

# 4. 定义工具列表
tools = [weather_tool]

# 5. 创建智能体
agent = create_tool_calling_agent(llm, tools, prompt)

# 6. 创建执行器
agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True  # 显示详细执行过程
)

def main():
    print("天气智能体已启动!")
    print("输入 'quit' 可退出程序\n")
    
    while True:
        user_input = input("请输入要查询的城市或问题:")
        if user_input.lower() == "quit":
            break
        
        print("正在查询天气...")
        try:
            result = agent_executor.invoke({"input": user_input})
            print("\n" + "="*50)
            print(result["output"])
            print("="*50 + "\n")
        except Exception as e:
            print(f"执行出错:{e}")

if __name__ == "__main__":
    main()

简化版本(不使用 Agent)

如果你想要更简单的实现(手动调用工具),可以使用以下版本:

python 复制代码
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from weather_tool import get_weather
import json

# 初始化 LangChain ChatOpenAI
llm = ChatOpenAI(
    base_url="http://localhost:11434/v1/",
    api_key="ollama",
    model="qwen3.5:4b",
    temperature=0.7
)

# 定义提示词模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个专业的天气助手。请根据提供的天气信息给出友好的回复,包括温度、湿度、风速等信息,并给出是否适合出游的建议。请用简洁、友好的语气回复用户。"),
    ("user", "请查询{city}的天气。\n\n以下是获取到的天气信息:\n{weather_info}"),
])

# 创建链
chain = prompt | llm

class WeatherAgent:
    def __init__(self, weather_api_key):
        self.weather_api_key = weather_api_key
    
    def run(self, city):
        # 1. 获取天气信息
        weather_data = get_weather(city, self.weather_api_key)
        
        if isinstance(weather_data, str) and weather_data.startswith("获取天气信息失败"):
            return weather_data
        
        # 2. 构建天气信息字符串
        weather_info_str = json.dumps(weather_data, ensure_ascii=False, indent=2)
        
        # 3. 调用大模型生成回复
        response = chain.invoke({
            "city": city,
            "weather_info": weather_info_str
        })
        
        return response.content

def main():
    # 请替换为你自己的天气 API Key
    WEATHER_API_KEY = "your_api_key_here"
    
    agent = WeatherAgent(WEATHER_API_KEY)
    
    print("天气智能体已启动!")
    while True:
        city = input("请输入要查询的城市(输入 'quit' 退出):")
        if city.lower() == "quit":
            break
        
        print("正在查询天气...")
        try:
            result = agent.run(city)
            print("\n" + "="*50)
            print(result)
            print("="*50 + "\n")
        except Exception as e:
            print(f"执行出错:{e}")

if __name__ == "__main__":
    main()

使用说明

  1. 首先,你需要去天气 API 提供商(如 OpenWeatherMap)注册并获取你的 API Key
  2. 将 API Key 替换到代码中的 WEATHER_API_KEY 变量
  3. 确保 Ollama 服务正在运行,并且通义千问 3.5(qwen3.5:4b)模型已下载
  4. 安装依赖:pip install langchain langchain-openai requests
  5. 运行 weather_agent.py,输入城市名称即可查询天气

项目效果

当你运行这个天气智能体后,输入一个城市名称,它会:

  1. 调用天气 API 获取实时数据
  2. 将天气信息传递给本地大模型
  3. 大模型会根据天气情况给出智能回复,包括温度、湿度等信息,以及是否适合出游的建议

Ollama 2026 最新特性说明

根据 Ollama v0.18.0 公告,OpenAI 兼容 API 支持以下特性:

  • ✅ 工具调用(Tool/Function Calling)
  • ✅ 流式响应
  • ✅ JSON 模式
  • ✅ 结构化输出
  • ✅ 多轮对话
  • ✅ 系统提示词
  • reasoning_effort 参数(控制推理强度)

总结

通过这个项目,我们成功实现了:

  • 本地大模型的部署与测试(使用通义千问 3.5)
  • 使用 LangChain Community 版 OpenAI 接口
  • 工具调用的集成(两种实现方式:Agent 版和简化版)
  • 完整的智能对话体验

这个项目可以作为更复杂智能体应用的基础,你可以在此基础上添加更多工具,扩展更多功能。

相关推荐
贺国亚2 小时前
Agent框架-LangChain-LangGraph与AutoGen
langchain
程序员Aries12 小时前
LangChain 与大语言模型
人工智能·语言模型·langchain
csdnor_0115 小时前
Codex CLI 使用 Ollama 本地模型
解决方案·codex·ollama·gpt-oss·codex-cli
swipe17 小时前
DeepAgents 多 Agent 深度调研助手工程实战:从 createDeepAgent 到可控调研工作流
javascript·面试·langchain
guyoung18 小时前
BoxAgnts介绍(7)——OpenAI-API与Anthropic-API
openai·agent·ai编程
sleven fung1 天前
Milvus 向量数据库
开发语言·数据库·python·langchain·milvus
code bean1 天前
【LangChain】RunnableWithMessageHistory 完全指南(下):流式、截断与自定义
langchain
小碗羊肉1 天前
【Agent笔记 | 第五篇】LangChain&LangGraph
笔记·langchain
abigale031 天前
LangChain 多轮对话记忆:基于 session_id 实现多会话隔离
typescript·langchain·uuid·session_id