一、前言
随着 LangChain 1.0 版本正式迭代,官方废弃了老旧的 initialize_agent、create_react_agent 写法,统一推荐使用全新的 create_agent 构建智能体。新版 API 更简洁、稳定性更高、适配生产场景,同时原生支持工具调用、系统人设、多轮对话上下文维护。
今天通过一个极简实战案例:搭建可多轮对话的天气查询智能体,从零演示 LangChain 新版 Agent 的完整开发流程,包含:自定义工具开发、智能体推理调用、上下文记忆、对话交互终端,适合新手入门 Agent 开发。
二、项目实现效果
本次实现的天气智能体具备以下能力:
自动判断用户意图,天气问题强制调用工具,不编造答案
调用公开天气接口,获取真实温度、体感、湿度、风速等数据
根据温度自动附带穿衣、防暑、保暖建议
支持多轮连续对话,自动维护上下文历史
无城市信息时主动询问,非天气问题礼貌拒绝
支持手动清空对话、退出终端交互
三、核心技术要点
1. 新版 Agent 核心优势
create_agent 是 LangChain 1.0 官方主推的智能体构建方式,替代旧版复杂的 React 智能体写法,优势如下:
极简 API,一行代码构建可生产的智能体
原生支持 ReAct 推理逻辑:思考 → 决策 → 调用工具 → 生成答案
自动管理工具调用、消息状态、中间件逻辑
支持自定义系统人设、工具约束、输出规范
2. 自定义工具开发规范
通过 @tool 装饰器快速定义工具,严格遵循:工具名称、入参类型、功能描述、异常兜底,Agent 会根据工具描述自动判断调用时机,无需手动判断用户问题。
3. 手动维护多轮对话记忆
本次不依赖 LangChain 内置记忆组件,采用手动维护消息列表的方式,更轻量化、可控性更强,适合小型对话机器人开发。
四、完整可运行代码
import os
import json
import requests
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langchain_core.messages import HumanMessage,AIMessage,ToolMessage
from dotenv import load_dotenv
load_dotenv() # 读取项目下的.env文件
# 自定义天气查询工具
@tool
def get_weather(city: str) -> str:
"""查询指定城市的当前天气,包括温度、天气状况、湿度、风速。
当用户问某个城市天气、气温、冷不冷、热不热、下不下雨时用这个工具。
Args:
city: 城市名称
"""
try:
url = f"https://wttr.in/{city}?format=j1&lang=zh"
resp = requests.get(url, timeout=10, headers={"User-Agent": "curl/7.68.0"})
resp.raise_for_status()
data = resp.json()
cur = data["current_condition"][0]
area = data["nearest_area"][0]
return (
f"【{area['areaName'][0]['value']}天气】"
f"{cur['weatherDesc'][0]['value']},"
f"{cur['temp_C']}°C(体感{cur['FeelsLikeC']}°C),"
f"湿度{cur['humidity']}%,风速{cur['windspeedKmph']}km/h"
)
except Exception:
return f"【{city}天气】(模拟数据)晴,28°C,体感30°C,湿度65%"
# 注册工具列表
tools = [get_weather]
tool_map = {t.name: t for t in tools}
# 初始化大模型(兼容通义千问等OpenAI接口模型)
llm = ChatOpenAI(
model=os.getenv("DASHSCOPE_MODEL"),
base_url=os.getenv("DASHSCOPE_BASE_URL"),
api_key=os.getenv("DASHSCOPE_API_KEY"),
temperature=0,
)
# 构建新版智能体
agent = create_agent(
model=llm,
tools=tools,
system_prompt="""
你是天气小助手,专业友好。
1. 问天气必须调用get_weather工具,不要编造
2. 回答简洁自然,根据温度给穿衣建议(<10度保暖,>30度防暑)
3. 用户没说城市时礼貌询问
4. 非天气问题礼貌说明你主要提供天气服务
""",
)
# 自定义多轮对话会话类
class WeatherChat:
"""多轮对话会话:自己维护消息历史"""
def __init__(self):
self.messages = [] # 消息列表,存储完整对话历史
def send(self, user_input: str) -> str:
"""发送用户消息,返回助手回答"""
# 1. 追加用户最新提问
self.messages.append(HumanMessage(content=user_input))
# 2. 调用智能体,传入完整对话上下文
result = agent.invoke({"messages": self.messages})
# 3. 更新完整消息历史(包含工具调用过程)
self.messages = result["messages"]
# 4. 返回最终AI回答
return self.messages[-1].content
def clear(self):
"""清空对话历史,重置会话"""
self.messages = []
if __name__ == "__main__":
print("=" * 50)
print(" 天气助手 进阶版(多轮对话版)")
print("命令:quit 退出 | clear 清空对话")
print("=" * 50)
chat = WeatherChat()
while True:
user_input = input("\n你: ").strip()
if not user_input:
continue
if user_input.lower() in ("quit", "exit", "q"):
print("再见!")
break
if user_input.lower() == "clear":
chat.clear()
print("对话已清空,重新开始~")
continue
answer = chat.send(user_input)
print(f"助手: {answer}")
五、代码核心模块解析
1. 自定义 Tool 工具开发
使用 @tool 装饰器快速声明工具,函数文档字符串至关重要,Agent 依靠文档描述理解工具用途、匹配用户问题。
同时做了异常捕获,网络失败时返回兜底模拟数据,保证程序不崩溃。
2. 新版 create_agent 智能体初始化
相比旧版 Agent,新版写法极度精简,只需传入:模型、工具列表、系统提示词,即可自动拥有 推理+工具调用+迭代执行 能力。通过 system_prompt 固定助手人设和业务规则,约束输出行为。
3. 手动实现多轮对话记忆
自定义 WeatherChat 会话类,通过维护 messages 消息列表保存完整对话上下文。每次提问都会携带历史消息,实现连续对话效果,同时支持手动清空会话,轻量化且灵活可控。
4. 终端交互逻辑
封装简易终端交互,支持空输入过滤、清空对话、退出程序,体验接近在线对话机器人。
六、开发踩坑与总结
1. 版本适配问题
LangChain 1.0+ 彻底废弃旧 Agent API,新手不要沿用网上老旧 initialize_agent 教程,统一使用 create_agent,避免兼容报错。
2. 工具描述必须精准
Agent 不会主动识别工具功能,完全依赖工具函数的文档字符串,描述不清晰会导致不调用工具、乱调用工具的问题。
3. 必须维护完整消息上下文
多轮对话必须持续更新 messages 列表,否则智能体会丢失上文记忆,无法完成连续问答任务。
七、扩展方向
本项目是最简 Agent 落地模板,可继续拓展功能:
新增时间查询、IP查询、计算器等更多自定义工具
接入 LangChain 官方记忆组件,持久化对话记录
增加流式输出,实现打字机效果
封装成接口,对接 Web/小程序前端页面
八、环境依赖
pip install langchain langchain-openai python-dotenv requests
九、小结
通过本次天气智能体实战,彻底掌握了 LangChain 新版 Agent 开发流程:工具定义 → 智能体创建 → 人设约束 → 上下文记忆 → 交互落地。Agent 的核心价值就是让大模型拥有调用外部工具、自主推理解决问题的能力,也是后续复杂智能应用、自动化工作流的基础。