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消耗)》。​

相关推荐
Michaelliu_dev1 小时前
RoPE通俗讲解
人工智能·llm·位置编码·多模态大模型·rope·旋转位置编码·mllm
呆呆敲代码的小Y1 小时前
5 分钟上手 OpenMontage:把 AI 编程助手变成视频工作室
人工智能·aigc·音视频·ai视频生成·claude code·openmontage
swany1 小时前
同步数据中,只需要几秒钟 & milvus向量数据库不可用 dify1.16.1 升级后踩坑记录
开发语言·python·numpy
ShallWeL1 小时前
【机器学习】(30)—— 嵌入空间
人工智能·神经网络·机器学习·embedding
MindUp1 小时前
AI辅助PPT生成工具实测:百度文库等平台在技术学习场景下的内容生成与排版能力对比
人工智能·百度·powerpoint
甲维斯1 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·人工智能
console.log('npc')1 小时前
OpenClaw 使用教程:开源 AI Agent 编排框架完全指南
人工智能·microsoft·ai编程·openclaw
独行侠影a1 小时前
AI绘画与音乐:生成式艺术是创作还是抄袭?
人工智能