LangChain 新版 create_agent 实战:实现可多轮对话的工具调用天气智能体

作者:青云 发布时间: 2026-09-06 阅读量:1 评论数:0

一、前言

随着 LangChain 1.0 版本正式迭代,官方废弃了老旧的 initialize_agentcreate_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 的核心价值就是让大模型拥有调用外部工具、自主推理解决问题的能力,也是后续复杂智能应用、自动化工作流的基础。

评论