深入探索 LangGraph构建智能体与上下文管理的艺术

基本信息

  • LangGraph上下文配置config、状态state、跨对话记忆
  • 模型调用通义千问(阿里Tongyi大模型)

上下文管理

LangGraph 作为一款强大的框架,为开发者提供了构建智能体的丰富工具和灵活的上下文管理机制。本文将通过实际代码示例,深入探讨如何利用 LangGraph 构建智能体,并管理其上下文,以实现高效、智能的交互。

LangGraph 提供了三种主要方式来提供上下文:

类型 描述 易变性 时长
配置(静态上下文) 运行开始时传递的数据 每次运行
状态(可变上下文) 执行期间可以改变的动态数据 每次运行或对话
记忆(存储跨对话上下文) 可以在对话之间共享的数据 跨对话

在 LangGraph 中,构建一个智能体的基本步骤如下:

  1. 选择或定义模型:选择一个合适的语言模型作为智能体的核心,例如阿里云的 Tongyi 大模型。
  2. 定义工具函数:根据需要完成的任务,定义一系列工具函数,这些函数可以被智能体调用来获取外部信息或执行特定操作。
  3. 构建智能体:使用 LangGraph 提供的 create_react_agent 函数,将模型和工具函数组合成一个智能体。
  4. 调用智能体:通过调用智能体的 invoke 方法,传入用户的消息和配置信息,获取智能体的响应。

以下是一个简单的示例,展示如何构建一个能够回答关于中国工商银行保险问题的智能体:

# -*- coding: utf-8 -*-
from langgraph.prebuilt import create_react_agent
from langchain_community.chat_models.tongyi import ChatTongyi 
from langchain_core.messages import AnyMessage
from langchain_core.runnables import RunnableConfig
from langgraph.prebuilt.chat_agent_executor import AgentState

# 模型初始化
llm = ChatTongyi(
    model="qwen-turbo",
    temperature=0,
    verbose=True,
)

# 定义一个工具函数
def get_ICBC(anyStr: str) -> str:
    """获得中国工商银行的保险."""
    return "工银安盛人寿保险有限公司 简称工银安盛人寿!"


# 构建一个智能体
agent = create_react_agent(
    model=llm,
    tools=[get_ICBC],
)
# 智能体的调用
answer = agent.invoke(
    {
   
   "messages": [{
   
   "role": "user", "content": "你能告诉我中国工商银行的保险名称?"}]},
)

# for i in answer["messages"]:
#     print(i)
print(answer["messages"][-1].content)

运行结果截图

在这里插入图片描述
在这个示例中,我们定义了一个工具函数 get_ICBC,返回关于中国工商银行保险的信息。然后,使用 create_react_agent 函数创建了一个智能体,并通过 invoke 方法调用它,传入用户的问题。智能体会调用 get_ICBC 工具函数,并返回结果。

上下文管理

智能体的强大之处不仅在于其能够执行任务,还在于其能够根据上下文信息做出更智能的决策。
上下文信息可以包括用户的身份信息、历史对话记录、内部状态等。
LangGraph 提供了多种方式来管理上下文,使得智能体能够更好地理解和响应用户的需求。

配置(静态上下文)

配置是运行开始时传递给智能体的数据,在每次运行中保持不变。例如,我们可以为智能体设置一个用户名称,使其在对话中使用这个名称来称呼用户

1.使用上下文自定义提示词 配置(静态上下文)
# -*- coding: utf-8 -*-
from langgraph.prebuilt import create_react_agent
from langchain_community.chat_models.tongyi import ChatTongyi 
from langchain_core.messages import AnyMessage
from langchain_core.runnables import RunnableConfig
from langgraph.prebuilt.chat_agent_executor import AgentState

# 模型初始化
llm = ChatTongyi(
    model="qwen-turbo",
    temperature=0,
    verbose=True,
)

# 定义一个工具函数
def get_ICBC(anyStr: str) -> str:
    """获得中国工商银行的保险."""
    return "工银安盛人寿保险有限公司 简称工银安盛人寿!"

#提示词方法
def prompt(
    state: AgentState,
    config: RunnableConfig
### AI Agent 持久化存储的实现方式数据保存 AI Agent 的持久化存储是确保其在重启后仍能恢复状态、保持上下文连贯性和用户交互一致性的关键。以下是几种常见的实现方式及其技术细节: #### 1. 短期记忆的持久化存储 短期记忆通常用于线程级持久性,使代理能够跟踪多轮对话并保存图的执行状态。以下是一些具体的实现方式: - **PostgresSaver 检查点**:通过将短期记忆的状态保存到 PostgreSQL 数据库中,可以实现跨会话的持久化存储[^1]。这种方式适用于需要高可靠性和事务支持的场景。 - **InMemorySaver**:虽然 InMemorySaver 主要用于内存中的短期记忆管理,但在生产环境中,可以通过定期将内存中的状态序列化并存储到磁盘或数据库中来实现持久化[^1]。 #### 2. 长期记忆的持久化存储 长期记忆通常用于跨线程持久性,允许存储特定于用户或应用程序的数据。以下是几种实现方式: - **BaseStore 和 InMemoryStore**:BaseStore 是长期记忆的基础接口,而 InMemoryStore 是其具体实现之一。它可以在内存中快速存取数据,但为了防止数据丢失,通常需要结合持久化机制[^1]。 - **LangGraph 的持久化状态**:LangGraph 提供了长期记忆的存储机制,允许保存和回忆特定命名空间内的信息。这种机制使得 AI 能够在不同对话或用户交互中保留和利用信息[^2]。 #### 3. 基于分布式系统的持久化存储 对于大规模应用,分布式系统提供了更强大的持久化能力。以下是两种常见的分布式持久化方案: - **Pulsar 消息持久化存储**:Pulsar 使用 Bookies(存储节点)将消息持久化到分布式文件系统或对象存储系统中,如 HDFS 或 AWS S3。这种方式适合需要高吞吐量和低延迟的应用场景[^3]。 - **Kafka 存储机制**:Kafka 将数据划分为多个分区(Partition),并通过日志文件的形式持久化到磁盘上。每个分区对应一个逻辑上的消息队列,确保数据的可靠性和高效访问[^4]。 #### 4. 技术选型实践建议 在选择持久化存储方案时,需要根据实际需求权衡以下几个方面: - **性能**:如果需要高频读写操作,可以选择内存数据库(如 Redis)或分布式缓存(如 Memcached)。 - **可靠性**:对于关键业务数据,建议使用关系型数据库(如 PostgreSQL、MySQL)或分布式存储系统(如 HDFS、Cassandra)。 - **扩展性**:如果数据规模较大且需要动态扩展,分布式系统(如 Pulsar、Kafka)可能是更好的选择。 ```python # 示例代码:将短期记忆状态保存到 PostgreSQL 数据库中 import psycopg2 def save_checkpoint(state, connection_string): try: # 连接到数据库 conn = psycopg2.connect(connection_string) cursor = conn.cursor() # 插入或更新状态 query = "INSERT INTO agent_state (id, state) VALUES (%s, %s) ON CONFLICT (id) DO UPDATE SET state = %s" cursor.execute(query, (1, state, state)) # 提交事务 conn.commit() except Exception as e: print(f"Error saving checkpoint: {e}") finally: if conn: conn.close() # 调用示例 state = {"user_id": 123, "context": "current conversation"} connection_string = "dbname=agent user=postgres password=secret" save_checkpoint(state, connection_string) ``` ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小何慢行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值