15天学会AI应用开发(十八)使用LangGraph实现精确记忆功能

上一篇文章介绍了如何使用LangGraph实现会话记忆功能,可是历史会话又多又杂,难以全部记忆,开发者更希望AI应用记住关键信息,比如用户喜欢什么、爱好什么等等。

对于AI应用的精确记忆需求,LangChain支持在调用create_agent时输入store参数,以指定数据存储方式,接下来介绍如何通过store参数存取用户的偏好信息。

一、创建智能体实例时的输入参数

上一篇文章调用create_agent时,仅用到了少数几个参数,为方便后续的函数引用,下面逐一说明create_agent的常见输入参数:

model:智能体推理所需的大模型实例。

tools:智能体可调用的工具集合,如计算器、搜索、数据库等。

system_prompt:智能体的提示词信息,可规定智能体的特定行为。

middleware:给智能体的执行链路挂载全局拦截处理器,在大模型调用、工具执行、消息流转的前后统一做切面处理,无需修改智能体的主要逻辑。可用于压缩历史记录、统一打印日志、过滤输入输出、限制请求流量、异常统一捕获等等。

context_schema:智能体会话的上下文信息,包括用户ID、租户信息、数据库连接、访问权限等等。

checkpointer:智能体的状态快照持久化管理器,可开启会话记忆、断点续跑、状态存档能力。不传该参数则智能体完全无状态,每轮调用后会清空所有历史对话与工具执行记录。

store:智能体的数据存储器,可长期记忆用户的业务数据。为InMemoryStore实例时,表示数据保存在内存中;为SqliteStore实例时,表示数据保存在Sqlite。

debug:是否打印调试日志。

二、存储工具Store的常见用法

不管InMemoryStore还是SqliteStore,都基于BaseStore,且拥有统一的存取方法,说明如下:

put:往指定键名存入对应的键值。

get:从指定键名获取对应的键值。

delete:删除指定键名及其对应的键值。

search:按照指定条件搜索对应的键名及其键值。

比如下面的代码就定义了存取用户偏好的两个工具方法:

复制代码
from dataclasses import dataclass
from langchain.tools import tool, ToolRuntime

@dataclass
class Context:
    user_id: str

@tool
def remember_user_preference(
    key: str,
    value: str,
    runtime: ToolRuntime[Context]
) -> str:
    """记住用户的偏好设置"""
    user_id = runtime.context.user_id

    # 写入 Store
    runtime.store.put(
        ("users",user_id),           # namespace,名字空间
        user_id,              # key,键名
        {"preferences": {key: value}}  # value,键值
    )
    return f"已记住:{key} = {value}"

@tool
def get_user_preference(
    key: str,
    runtime: ToolRuntime[Context]
) -> str:
    """获取用户的偏好设置"""
    user_id = runtime.context.user_id

    # 从 Store 读取
    item = runtime.store.get(("users",user_id), user_id)
    if item:
        prefs = item.value.get("preferences", {})
        return prefs.get(key, "未设置")
    return "未找到用户信息"

三、使用InMemoryStore记住用户偏好

在命令行窗口执行下面命令,即可安装LangChain及其用到的Ollama插件,以及记忆功能需要的LangGraph:

复制代码
pip install langchain langchain-core langchain-ollama langgraph

由于之前使用的离线大模型Qwen2:1.5B不支持tool工具调用,因此得下载支持tool工具调用的离线大模型Qwen2.5:3B,也就是在命令行窗口执行下面命令,即可下载大模型qwen2.5:3b:

复制代码
ollama pull qwen2.5:3b

等待大模型下载完毕,在命令行窗口执行下面命令,即可启动Ollama并加载大模型:

复制代码
ollama serve

在Python代码开头添加下面的导包语句,表示引入LangChain的智能体组件create_agent、人类消息组件HumanMessage、LangChain的大模型工具OllamaLLM,以及LangGraph的内存存储组件InMemoryStore:

复制代码
from langchain.agents import create_agent
from langchain.messages import HumanMessage
from langchain_ollama import ChatOllama
from langgraph.store.memory import InMemoryStore

在OllamaLLM的构造方法中填写model参数,指定当前引用的离线大模型名称,如下:

复制代码
llm = ChatOllama(model="qwen2.5:3b")  # 改成你本地的模型

然后编写下面的LangChain调用代码,先调用create_agent创建支持内存存取的智能体实例,再通过智能体实例的invoke实例调用离线大模型,示例代码如下:

复制代码
# 用户提到喜欢什么东西时,会调用remember_user_preference工具;用户询问喜欢什么东西时,会调用get_user_preference工具。
agent = create_agent(
    model=llm,
    context_schema=Context,
    tools=[remember_user_preference, get_user_preference],
    system_prompt="当用户提到喜欢什么东西时,请调用remember_user_preference工具;当用户询问喜欢什么东西时,请调用get_user_preference工具。",
    store=InMemoryStore()
)

while True:
    user_input = input("用户:")
    if user_input in ["退出", "exit", "quit"]:
        print("对话结束")
        break

    # 调用离线大模型
    result = agent.invoke(
        {"messages": [HumanMessage(content=user_input)]},
        context=Context(user_id="user_123")
    )
    print(f"AI:{result['messages'][-1].content}\n")

运行上面的Python代码,根据提示先后输入问题内容"我喜欢绿色"、"我喜欢什么颜色?",输出日志结果如下:

复制代码
用户:我喜欢绿色
AI:你的最喜欢的颜色是绿色。如果你有其他偏好想要记住,随时告诉我哦!

用户:我喜欢什么颜色?
AI:你的喜欢的颜色是绿色。如果你有任何其他问题,或者需要帮助,请告诉我!

由日志信息发现,AI应用在第一个问答中得知用户喜欢绿色,在第二个问答中正确回忆起用户的偏好颜色。可见通过LangGraph的内存存储组件InMemoryStore,初步实现了用户偏好的精确记忆功能。

本系列的AI应用开发文章目录为《15天学会AI应用开发全目录(零基础小白,零Token消耗)》。​

相关推荐
小四的小六10 小时前
一次出站重试风暴的沙箱复盘:重试没退避,Agent 十几分钟烧穿整月额度
aigc·openai·ai编程
海边捡石子10 小时前
从零设计一个通用智能电话平台:FreeSWITCH + ESL + AI 实战架构
人工智能·架构·webrtc
小虎AI生活10 小时前
Claude Duet 抢的不是活,是你每天早上那半小时
aigc·ai编程
u13013010 小时前
GitHub 热榜项目:日榜(2026-10-21)
人工智能·github
薛定e的猫咪10 小时前
(ICLR 2026)DF-META:面向 FJSP 的无导数元学习实例自适应调度
人工智能·深度学习·学习·算法·机器学习
shengjk110 小时前
你以为是大模型在执行命令?真相是它只会“说“
人工智能·aigc·ai编程
tellmewhoisi10 小时前
深度学习1:基本概念,感知机,激活函数(阶跃,sigmoid,Tanh函数)
人工智能·深度学习
Thinker QAQ10 小时前
并发编程(十一):Shared Memory 与 Message Passing——关系与组合使用
java·python·go·并发编程·shared memory·message passing
IT_陈寒10 小时前
JavaScript的闭包陷阱,这个坑我躺了三天才爬出来
前端·人工智能·后端
用户83562907805110 小时前
如何使用 Python 对 Excel 数据进行分组和分级显示
后端·python