LangGraph 实战指南:长期记忆管理

LangGraph为智能对话系统设计了一种独特的“记忆”机制,它包括长期记忆和短期记忆两种类型。

基本信息

  • 模型调用通义千问(阿里Tongyi大模型)
  • 短期记忆:通过维护会话中的消息的历史记录,来跟踪正在进行的对话。短期记忆也称为线程级记忆。
  • 长期记忆:跨会话存储用户特定或应用程序级数据。长期记忆又称为跨线程记忆。

长期记忆就像是一个“记忆仓库”,可以存储用户的各种信息,比如名字、语言偏好、历史对话记录等。这些信息被组织成一个个“记忆单元”,每个单元都有自己的“文件夹”(命名空间)和“文件名”(键)。比如,一个聊天机器人可以为每个用户创建一个独立的命名空间,里面存储着用户的各种偏好信息。

使用 LangGraph 管理长期记忆

通过三个简单的demo例子来看看LangGraph是如何在实际中工作的。

要使用长期记忆,需要:

  • 配置存储以在调用之间保留数据
  • 使用该get_store功能从工具或提示中访问LangSmith商店

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 typing_extensions import TypedDict

from langgraph.store.memory import InMemoryStore
from langgraph.config import get_store


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

# 写入get_store()
store = InMemoryStore() 

class UserInfo(TypedDict): 
    name: str

# 类似于文件夹
user_namespace = "users" 

def save_user_info(user_info: UserInfo, config: RunnableConfig) -> str: 
    """保存用户信息"""

    # 与create_react_agent提供的一样
    store = get_store() 
    user_id = config["configurable"].get("user_id")
    store.put((user_namespace,), user_id, user_info) 
    return "已成功保存!"

#构建一个智能体
agent = create_react_agent(
    model=llm,
    tools=[save_user_info],
    store=store
)

# #智能体的调用
response = agent.invoke(
    {"messages": [{"role": "user", "content": "我的名字是小何慢行"}]},
    config={"configurable": {"user_id": "xhmx_id"}} 
)

print(response)
print(response["messages"][-1].content)

#直接访问仓库来获取值。
print(store.get((user_namespace,), "xhmx_id"))
print(store.get((user_namespace,), "xhmx_id").value)


运行结果截图

在这里插入图片描述

2 读取用户信息

需要读取用户信息时,可以定义一个读取函数,从长期记忆中获取用户的信息。
假设第一个用例中保存了用户信息,现在我们来读取它。

# -*- 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 typing_extensions import TypedDict

from langgraph.store.memory import InMemoryStore
from langgraph.config import get_store


#模型初始化
llm = ChatTongyi(
    model="qwen-turbo",#qwen-max-latest qwen-plus
    temperature=0,
    verbose=True,
    )
# 读取get_store()
store = InMemoryStore() 


#类似于文件夹
user_namespace = "users" 
#类似于文件名
user_key = "xhmx_id"

store.put(  
    (user_namespace,),  #可以多个
    user_key,  
    {
        "name": "小何慢行",
        "sex": "男",
        "language": "汉语",
    } 
)

def get_user_info(config: RunnableConfig) -> str:
    """查询用户信息"""
    store = get_store() 
    user_id = config["configurable"].get("user_id")
    user_info = store.get((user_namespace,), user_id) 
    return str(user_info.value) if user_info else "未记录该用户"

#构建一个智能体
agent = create_react_agent(
    model=llm,
    tools=[get_user_info],
    store=store 
)


#直接访问仓库来获取值。
response = agent.invoke(
    {"messages": [{"role": "user", "content": "我要看下自身信息"}]},
    config={"configurable": {"user_id": user_key}}
)

print(response)
print(response["messages"][-1].content)

运行结果截图

在这里插入图片描述

3 语义搜索:找到相关记忆

LangGraph 还允许通过语义相似性搜索长期记忆中的项目。

有时候,我们可能需要根据内容的相似性来搜索记忆,而不仅仅是通过关键词。可以通过描述来找到相关的信息。

# -*- 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 typing_extensions import TypedDict

from langgraph.store.memory import InMemoryStore
from langgraph.config import get_store


#模型初始化
llm = ChatTongyi(
    model="qwen-turbo",#qwen-max-latest qwen-plus
    temperature=0,
    verbose=True,
    )
#返回嵌入向量占位符列表
def embed(texts: list[str]) -> list[list[float]]:
    # 可以替换为实际的嵌入函数。 embed": init_embeddings("openai:text-embedding-3-small")
    return [[1.0, 2.0] * len(texts)]


# from langchain_community.embeddings import DashScopeEmbeddings
# from langchain.embeddings import init_embeddings
# embeddings = DashScopeEmbeddings(dashscope_api_key="sk-b8b221d506c041e08db52e622d48b2")


# 数据保存到内存中的字典。可以使用基于数据库的存储 如postgresql
store = InMemoryStore(index={"embed": embed, "dims": 2})

user_id = "users"
application_context = "chitchat"
namespace = (user_id, application_context)

user_key = "xhmx_id_memory"

store.put(
    namespace,
    user_key,
    {
        "rules": [
            "用户只会说汉语和Python。",
            "用户喜欢简洁直白的语言。",
        ],
        "my-key": "my-value",
    },
)


# 通过ID获取memory信息
item = store.get(namespace, user_key)
print(item)

print("------------------------")
# 按内容等价性进行筛选,按向量相似性会排序
items = store.search(
    namespace, filter={"my-key": "my-value"}, query="语言偏好"
)
print(items)

运行结果截图

在这里插入图片描述
通过语义搜索找到了与“语言偏好”相关的记忆,即使我们没有直接使用这个关键词来保存记忆。

预建记忆工具
LangMem是由 LangChain 维护的一个库,它提供了用于管理代理中长期记忆的工具。可以参阅LangMem 文档以获取使用示例。

LangGraph的长期记忆,为智能对话系统提供了一个强大的“记忆”功能。它不仅能够让系统记住用户的信息和偏好,还能通过语义搜索快速找到相关信息。

这种记忆机制的设计,让智能对话系统更加人性化,能够更好地满足用户的需求。无论是智能客服还是个人助手,LangGraph都能让它们变得更加智能和贴心。

下一节:

1.langgraph的新特性:支持人工参与的循环审查

基于大模型智能体Agent的LangGraph入门与实战课程目标:本课程旨在为LangGraph的初学者提供深入的理论知识和实践技能,使其能够独立构建和部署基于LangGraph的应用程序。课程形式:理论讲解 + 实战演练第1课 LangGraph基础架构与环境配置-LangGraph的概念解析第2课 LangGraph基础架构与环境配置-LangGraph的环境搭建与依赖管理第3课 LangGraph的基础原理与应用入门-构建基本聊天机器人及使用工具增强第4课 LangGraph的基础原理与应用入门-内存管理、人在回路、状态更新第5课 LangGraph高级图控制技术-并行节点扇出和扇入、增加额外步骤、条件分支第6课 LangGraph高级图控制技术-稳定排序、Map-Reduce并行执行、图递归控制第7课 LangGraph持久化机制与状态管理-线程级持久化、子图持久化、跨线程持久化第8课 LangGraph Human-in-the-loop-断点设置、动态设置断点、编辑更新状态第9课 LangGraph Human-in-the-loop-等待用户输入、时间旅行、工具评审第10课 LangGraph在具有长期记忆的有状态Agent中的应用-长期记忆及短期记忆、过滤信息、删掉信息第11课 LangGraph在具有长期记忆的有状态Agent中的应用-摘要总结、跨线程持久化、代理语义搜索第12课 LangGraph工具集成与调用-直接调用ToolNode、大模型使用工具第13课 LangGraph工具集成与调用-工具调用报错处理、运行时值传递给工具、注入参数第14课 LangGraph工具集成与调用-配置传入工具、从工具更新图状态、管理大量工具第15课 LangGraph子图设计与实现-添加及使用子图、父图及子图状态管理第16课 LangGraph子图设计与实现-子图状态的查看与更新、子图输入输出的转换与处理第17课 LangGraph项目实战演练-多智能体系统主管委托各个代理第18课 LangGraph课程复习与答疑 自我反思案例及论文案例讲解
### LangGraph 的实际应用案例与教程 LangGraph 是一种用于构建复杂多模态对话系统的工具,它能够通过图结构的方式管理多个 Agent 和工具之间的交互关系。以下是关于 LangGraph 的一些具体实战案例和使用教程。 #### 1. 工具定义与 LLM 集成 在 LangGraph 中,可以通过 `ToolAgent` 思想来设计一个可调用外部工具的智能体 (Agent)[^2]。这种设计允许开发者将不同的功能模块化,并让 Agent 动态选择合适的工具完成任务。例如,在一个多模态问答场景下,可以集成搜索引擎、数据库查询器以及文档解析器等多种工具。 ```python from langchain.agents import Tool, initialize_agent from langchain.llms import OpenAI from langgraph.graphs import GraphBuilder # 初始化LLM llm = OpenAI(temperature=0) # 定义工具函数 def search_web(query): """模拟网络搜索""" return f"Searched result for {query}" tools = [ Tool( name="SearchWeb", func=search_web, description="Useful when you need to look up information on the web." ) ] agent_chain = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True) ``` 上述代码展示了如何创建一个简单的 Web 查询工具并将其绑定到 Agent 上[^2]。 --- #### 2. 环境搭建与依赖安装 为了运行基于 LangGraph 的项目,首先需要准备好相应的 Python 虚拟环境,并安装必要的库文件[^3]: ```bash pip install langchain pip install langchain_openai pip install langgraph ``` 这些命令会下载 LangChain 及其扩展包,还包括支持 LangGraph 所需的核心组件。 --- #### 3. 图形化建模实例 以下是一个更复杂的例子,展示如何利用 LangGraph 构造一个包含多个节点的任务流图表。此示例适用于处理涉及多种数据源的知识检索问题。 ```python import langgraph as lg # 创建一个新的图形对象 builder = lg.GraphBuilder() # 添加节点A - 文本摘要生成器 node_a = builder.add_node("TextSummarizer") # 添加节点B - 数据表分析器 node_b = builder.add_node("DataTableAnalyzer") # 建立连接 A -> B 表明先执行文本总结再做数据分析 edge_ab = builder.connect(node_a, node_b) # 导出JSON表示形式以便可视化查看整个流程布局 json_graph = builder.export_json() print(json_graph) ``` 这段脚本说明了怎样借助 LangGraph 来规划不同阶段的工作顺序,并最终导出便于理解的结果格式[^1]。 --- #### 4. 接入 Ernie Speed 大模型 如果希望进一步提升性能,则可以选择引入百度推出的预训练语言模型——Ernie Speed。该版本针对速度进行了优化改进,非常适合实时响应需求较高的应用场景。结合 LangGraph 后,便能快速部署一套具备强大自然语言理解和推理能力的服务端解决方案。 ```python from erniebot import ERNIEBot ernie_model = ERNIEBot(api_key='your_api_key', secret_key='your_secret_key') response = ernie_model.chat(prompt="解释一下量子力学的基础概念") print(response['result']) ``` 以上片段演示了调用 Ernie Speed API 获取答案的过程。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小何慢行

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

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

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

打赏作者

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

抵扣说明:

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

余额充值