如何在本地搭建天气智能体项目
项目概述
本文将介绍如何在本地搭建一个完整的天气智能体项目。项目主要分为两部分:
- 使用 Ollama 部署通义千问 3.5(Qwen 3.5)大模型并完成连接测试
- 实现天气查询功能,让大模型调用工具并给出智能回复
技术栈说明
根据 2026 年 Ollama 最新公告(v0.18.0),我们使用以下技术:
- Ollama OpenAI 兼容 API :
http://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 显存
- 确保 Ollama 服务已启动
- 下载通义千问 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()
运行这个脚本,如果看到大模型的自我介绍,说明连接成功!
第二部分:天气智能体实现
项目设计
我们的天气智能体需要以下功能:
- 用户输入所在城市
- 查询该城市的实时天气信息
- 根据天气信息给出智能建议
安装依赖
首先,安装所需的 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()
使用说明
- 首先,你需要去天气 API 提供商(如 OpenWeatherMap)注册并获取你的 API Key
- 将 API Key 替换到代码中的
WEATHER_API_KEY变量 - 确保 Ollama 服务正在运行,并且通义千问 3.5(
qwen3.5:4b)模型已下载 - 安装依赖:
pip install langchain langchain-openai requests - 运行
weather_agent.py,输入城市名称即可查询天气
项目效果
当你运行这个天气智能体后,输入一个城市名称,它会:
- 调用天气 API 获取实时数据
- 将天气信息传递给本地大模型
- 大模型会根据天气情况给出智能回复,包括温度、湿度等信息,以及是否适合出游的建议
Ollama 2026 最新特性说明
根据 Ollama v0.18.0 公告,OpenAI 兼容 API 支持以下特性:
- ✅ 工具调用(Tool/Function Calling)
- ✅ 流式响应
- ✅ JSON 模式
- ✅ 结构化输出
- ✅ 多轮对话
- ✅ 系统提示词
- ✅
reasoning_effort参数(控制推理强度)
总结
通过这个项目,我们成功实现了:
- 本地大模型的部署与测试(使用通义千问 3.5)
- 使用 LangChain Community 版 OpenAI 接口
- 工具调用的集成(两种实现方式:Agent 版和简化版)
- 完整的智能对话体验
这个项目可以作为更复杂智能体应用的基础,你可以在此基础上添加更多工具,扩展更多功能。