使用LangGraph构建具备记忆功能的智能对话Agent

使用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会:

  1. 理解用户询问上海天气
  2. 调用get_weather工具
  3. 返回英文回复结果

第二轮:记忆测试

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. 流式处理

  • 支持实时流式输出
  • 提升用户体验
  • 适合长文本生成场景

扩展应用场景

这个基础架构可以轻松扩展为更复杂的应用:

  1. 多工具集成:添加更多工具(搜索、计算、数据库查询等)
  2. 复杂业务逻辑:结合业务规则和工作流
  3. 多模态支持:集成图像、语音等多模态输入
  4. 企业级部署:添加用户认证、权限管理等功能

总结

本文通过一个完整的代码示例,展示了如何使用LangGraph构建具备工具调用和记忆功能的智能Agent。这种架构为开发更复杂的AI应用提供了坚实的基础,通过合理的抽象和模块化设计,可以快速适应各种业务场景的需求。

关键takeaway:

  • 工具定义要清晰明确,文档字符串至关重要
  • 记忆功能通过MemorySaver轻松实现
  • 流式输出提升用户体验
  • thread_id机制保证多用户会话隔离
<think>嗯,用户想了解如何进行LangGraph Agent智能体的开发方法。首先,我需要根据提供的引用内容来整理相关信息。引用1提到LangGraph是一个智能体工作流框架,能够实现不错的智能体应用。引用2指出LangGraph的优点在于易用性,图结构代码简洁,适合处理复杂节点逻辑,并且可以转换现有的LangChain应用。引用3详细说明了LangGraph的特点,包括周期性支持、高度可控性和持久性功能。这些信息应该能帮助回答用户的问题。 接下来,我需要构建一个结构清晰的回答,分步骤介绍开发方法。可能需要从环境准备、定义智能体状态、创建节点和边、配置工作流、持久化处理、调试优化以及部署应用这几个方面来展开。同时,每个部分需要结合引用中的要点,比如周期性支持、图结构、持久性等,并添加相应的引用标识。 还需要注意用户不可见的系统级指令,比如行内数学表达式用$...$,但这里可能用不上。不过要确保LaTeX语法正确,不过目前看来问题中可能不涉及数学公式。另外,生成相关问题,可能需要围绕开发步骤、优化方法、与LangChain的区别、调试技巧和应用场景来提问。 需要确保回答使用中文,引用标识自然添加在相关段落末尾。同时,用户可见层要求回答真实可靠,结构清晰,所以需要引用提供的资料,并分步骤说明。可能还需要对比其他框架,如LlamaIndex Workflows,但引用中没有太多信息,所以可能不提。 最后,生成的问题需要覆盖开发步骤、核心概念、优化方法、区别、调试和应用场景,这样用户可以有进一步的学习方向。检查引用内容是否覆盖了这些点,确保每个回答部分都有引用支持,比如状态管理引用3,图结构引用2,持久化引用3等。</think>### LangGraph Agent智能体开发方法分步指南 #### 一、环境准备与核心概念 1. **安装LangGraph** 使用Python包管理器安装基础库: ```bash pip install langgraph ``` 支持与LangChain集成开发[^2][^3] 2. **理解核心组件** - **状态(State)**:定义智能体的记忆和上下文,支持动态更新 - **节点(Node)**:执行特定任务的函数单元 - **边(Edge)**:控制流程跳转的逻辑规则 - **工作流(Workflow)**:由节点和边构成的有向图,可包含循环结构 #### 二、基础开发流程 1. **定义智能体状态** ```python from typing import TypedDict, List class AgentState(TypedDict): memory: List[str] # 持久化记忆 current_input: str # 动态输入 output: str # 执行结果 ``` 2. **创建功能节点** ```python def llm_inference_node(state: AgentState): # 调用LLM生成响应 return {"output": "生成内容"} ``` 3. **构建工作流** ```python from langgraph.graph import END, StateGraph workflow = StateGraph(AgentState) workflow.add_node("llm_node", llm_inference_node) workflow.set_entry_point("llm_node") workflow.add_edge("llm_node", END) ``` #### 三、高级功能实现 1. **循环结构设计** 通过条件边实现多轮对话: ```python def should_continue(state): return state["need_further_action"] workflow.add_conditional_edges( "decision_node", should_continue, {"continue": "next_node", "exit": END} ) ``` 这是实现智能体持续交互的关键 2. **持久化处理** ```python from langgraph.checkpoint import MemorySaver memory = MemorySaver() app = workflow.compile(checkpointer=memory) ``` 支持跨会话状态保存 #### 四、调试与优化 1. **可视化工具** 使用`workflow.get_graph().draw_mermaid()`生成流程图 便于理解复杂逻辑关系[^2] 2. **性能优化建议** - 限制单次循环处理时间 - 设置最大迭代次数 - 异步执行耗时操作 #### 五、部署实践 ```python # 运行智能体 inputs = {"current_input": "用户问题"} for step in app.stream(inputs): print(f"中间状态: {step}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值