使用LangGraph构建具备记忆功能的智能对话Agent
在AI应用开发中,构建一个既能调用外部工具又能保持对话记忆的智能Agent是一个常见需求。本文将通过一个完整的代码示例,详细介绍如何使用LangGraph框架创建一个具备天气查询功能和对话记忆的React Agent。
项目概述
本项目实现了一个智能对话Agent,具备以下核心功能:
- 工具调用能力:能够调用天气查询工具获取指定地区的天气信息
- 对话记忆:通过MemorySaver保持对话历史,实现上下文理解
- 流式输出:支持实时流式响应,提升用户体验
- 线程隔离:通过thread_id实现多用户会话隔离
环境准备与依赖导入
首先,我们需要导入必要的依赖包并加载环境变量:
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langgraph.prebuilt import create_react_agent
from langgraph.checkpoint.memory import MemorySaver
load_dotenv()
这些导入包括:
dotenv
:用于加载环境变量,安全管理API密钥langchain_openai
:提供OpenAI模型接口langchain_core.tools
:工具装饰器,用于定义可调用的工具函数langgraph
:核心框架,提供Agent创建和记忆管理功能
定义工具函数
使用@tool
装饰器定义一个天气查询工具:
@tool
def get_weather(region: str) -> str:
"""
获取指定地区的天气
:param region: 地区
:return: 天气信息
"""
return f"{region}晴天,25度"
关键特点:
- 使用
@tool
装饰器将普通函数转换为Agent可调用的工具 - 函数文档字符串对Agent理解工具功能至关重要
- 参数类型注解帮助Agent正确传递参数
- 这里使用模拟数据,实际应用中可接入真实天气API
配置语言模型
llm = ChatOpenAI(
base_url="https://ark.cn-beijing.volces.com/api/v3",
api_key=os.getenv("OB_OPENAI_KEY"),
model="doubao-1.5-lite-32k-250115"
)
配置说明:
base_url
:指定API服务地址,这里使用的是字节跳动的豆包模型api_key
:从环境变量中获取API密钥,保证安全性model
:指定使用的模型版本
实现流式输出处理
def print_stream(stream):
print(stream)
for chunk in stream:
message = chunk['messages'][-1]
if isinstance(message, tuple):
print(message)
else:
message.pretty_print()
这个函数负责处理Agent的流式响应:
- 遍历流式输出的每个chunk
- 提取最新的消息内容
- 根据消息类型选择合适的打印方式
创建具备记忆功能的Agent
prompt = "你是一个智能助手,能够回答用户的问题。你可以选择调用工具,也可以选择不调用,针对用提出的问题,用英文回复"
# 创建记忆管理器
memory = MemorySaver()
# 创建React Agent
agent = create_react_agent(
llm,
tools=[get_weather],
checkpointer=memory,
prompt=prompt
)
核心组件:
- MemorySaver:负责保存和恢复对话历史
- create_react_agent:创建具备推理-行动能力的Agent
- checkpointer:启用记忆功能的关键参数
- prompt:定义Agent的行为指令和回复语言
多轮对话测试
配置会话线程
config = {"configurable": {"thread_id": "2"}}
通过thread_id
实现会话隔离,不同的thread_id对应独立的对话历史。
第一轮:天气查询
inputs = {"messages": [("user", "上海天气怎么样?")]}
print_stream(agent.stream(inputs, config=config, stream_mode="values"))
Agent会:
- 理解用户询问上海天气
- 调用
get_weather
工具 - 返回英文回复结果
第二轮:记忆测试
inputs = {"messages": [("user", "我刚问了你什么问题?")]}
print_stream(agent.stream(inputs, config=config, stream_mode="values"))
由于具备记忆功能,Agent能够回忆起之前的对话内容。
第三轮:身份询问
inputs = {"messages": [("user", "你是谁?")]}
print_stream(agent.stream(inputs, config=config, stream_mode="values"))
Agent会根据初始prompt回答自己的身份。
技术特点与优势
1. React模式
Agent采用"推理-行动"模式:
- Reasoning:分析用户问题,决定是否需要调用工具
- Acting:执行相应的行动(调用工具或直接回复)
2. 记忆持久化
- 使用MemorySaver自动保存对话历史
- 支持跨会话的上下文理解
- 通过thread_id实现多用户隔离
3. 流式处理
- 支持实时流式输出
- 提升用户体验
- 适合长文本生成场景
扩展应用场景
这个基础架构可以轻松扩展为更复杂的应用:
- 多工具集成:添加更多工具(搜索、计算、数据库查询等)
- 复杂业务逻辑:结合业务规则和工作流
- 多模态支持:集成图像、语音等多模态输入
- 企业级部署:添加用户认证、权限管理等功能
总结
本文通过一个完整的代码示例,展示了如何使用LangGraph构建具备工具调用和记忆功能的智能Agent。这种架构为开发更复杂的AI应用提供了坚实的基础,通过合理的抽象和模块化设计,可以快速适应各种业务场景的需求。
关键takeaway:
- 工具定义要清晰明确,文档字符串至关重要
- 记忆功能通过MemorySaver轻松实现
- 流式输出提升用户体验
- thread_id机制保证多用户会话隔离