Agent中的memory

rag系列文章目录

文章目录

  • rag系列文章目录
  • 前言
  • 一、Memory机制作用
  • 二、memory分类
  • 三、langgraph实践
  • 总结


前言

众所周知,大模型是无状态的。但是基于大模型的agent一般是有状态的,也就是它有记忆功能。在AI Agent框架中,Memory机制是核心组件之一,它赋予Agent持续学习和上下文感知的能力,使其能够像人类一样基于历史交互进行决策。


一、Memory机制作用

上下文保持(Context Preservation)
存储对话历史、工具调用记录等,确保多轮交互中Agent能理解用户意图的连贯性。例如,用户问“上海天气如何?”后追问“明天呢?”,Agent需记忆前一轮的“上海”地理位置

状态持久化(State Persistence)
支持断点续传:通过Checkpoint机制(如MemorySaver或PostgresSaver)将运行时状态序列化存储,崩溃后可从最近状态恢复,避免重复计算。
典型场景:长时间运行的任务(如代码生成)中途中断后,可从上次保存的步骤继续。

个性化适配(Personalization)
记忆用户偏好或历史行为(如常查询的城市),实现定制化响应。

协作与隔离(Multi-agent Coordination)
通过thread_id隔离不同用户/任务的记忆,避免数据混淆。例如,多用户对话中,每个用户的会话历史独立存储。

资源优化(Token Efficiency)
动态修剪或摘要历史消息(如trim_messages),避免上下文窗口溢出或token浪费。例如仅保留最近3条消息或按token数截断。

二、memory分类

短期记忆:
本质:就是上下文窗口内的 对话历史,存储在 KV Cache 或者文本 buffer 里。
使用场景
• 聊天机器人(连续对话)
• 任务执行中,需要记住上一轮用户的指令

长期记忆:
本质:把对话内容、用户信息等存入一个外部数据库(向量库/知识库),通过 检索 机制在需要时取出。
使用场景
• 长期陪伴型智能体(记住用户的兴趣、习惯)
• 多会话场景(跨会话记忆,不仅限于一次对话)
• Agent 需要跨天/跨周执行任务(如知识管理、个人助理)

类型存储方式实现原理适用场景
短期记忆State / Buffer / Cache把对话历史拼接进 prompt连续对话、任务短期上下文
长期记忆向量库 / 数据库embedding + 检索 / 摘要存储长期个性化、多会话、跨时空任务

三、langgraph实践

  • 无记忆情况
from typing_extensions import TypedDict, Annotated
from typing import Any
from langchain_core.messages import HumanMessage, AnyMessage, SystemMessage
from langchain_groq import ChatGroq
from langchain_openai import ChatOpenAI
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
from langgraph.prebuilt import ToolNode, tools_conditionfrom dotenv import load_dotenvload_dotenv()# Define the state
class MessagesState(TypedDict):messages: Annotated[list[AnyMessage], add_messages]# Tool: Person Information
def get_person_details(person_name: str) -> str:"""Retrieve details of a person."""return f"{person_name} is a DevOps Engineer."# Tool: Location Information
def get_person_location(person_name: str) -> str:"""Retrieve location of a person."""return f"{person_name} lives in Bangalore."# Initialize the Groq chat model
llm = ChatOpenAI(base_url="",model="gpt-4o-mini",api_key="",temperature=0.0)# Bind tools to the Groq model
tools = [get_person_details, get_person_location]
llm_with_tools = llm.bind_tools(tools)# System message
sys_msg = SystemMessage(content="You are a helpful assistant that provides accurate responses based on the given tools.")# Define the assistant node
def assistant(state: MessagesState):return {"messages": [llm_with_tools.invoke([sys_msg] + state["messages"])]}# Build the graph
builder = StateGraph(MessagesState)
builder.add_node("assistant", assistant)
builder.add_node("tools", ToolNode(tools))# Adding Edges
builder.add_edge(START, "assistant")
builder.add_conditional_edges("assistant", tools_condition)
builder.add_edge("tools", "assistant")# Example without memory
react_graph = builder.compile()# Test interaction without memory
messages = [HumanMessage(content="Tell me about Harsha?she is girl")]
result = react_graph.invoke({"messages": messages})
# for message in result['messages']:
#     message.pretty_print()# Test interaction without memory
messages = [HumanMessage(content="Is she a Devops Enginer?")]
result = react_graph.invoke({"messages": messages})
for message in result['messages']:message.pretty_print()
  • 有记忆情况
from typing_extensions import TypedDict, Annotated
from typing import Any
from langchain_core.messages import HumanMessage, AnyMessage, SystemMessage
from langchain_groq import ChatGroq
from langchain_openai import ChatOpenAI
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
from langgraph.prebuilt import ToolNode, tools_condition
from langgraph.checkpoint.memory import MemorySaverfrom dotenv import load_dotenvload_dotenv()# Define the state
class MessagesState(TypedDict):messages: Annotated[list[AnyMessage], add_messages]# Tool: Person Information
def get_person_details(person_name: str) -> str:"""Retrieve details of a person."""return f"{person_name} is a DevOps Engineer."# Tool: Location Information
def get_person_location(person_name: str) -> str:"""Retrieve location of a person."""return f"{person_name} lives in Bangalore."# Initialize the Groq chat model
# llm = ChatGroq(model="llama-3.3-70b-versatile")
llm = ChatOpenAI(base_url="",model="gpt-4o-mini",api_key="",temperature=0.0)
# Bind tools to the Groq model
tools = [get_person_details, get_person_location]
llm_with_tools = llm.bind_tools(tools)# System message
sys_msg = SystemMessage(content="You are a helpful assistant that provides accurate responses based on the given tools.")
memory = MemorySaver() # Define the assistant node
def assistant(state: MessagesState):return {"messages": [llm_with_tools.invoke([sys_msg] + state["messages"])]}# Build the graph
builder = StateGraph(MessagesState)
builder.add_node("assistant", assistant)
builder.add_node("tools", ToolNode(tools))# Adding Edge
builder.add_edge(START, "assistant")
builder.add_conditional_edges("assistant", tools_condition)
builder.add_edge("tools", "assistant")
react_graph = builder.compile(checkpointer=memory)# Test interaction with memory
# Thread ID for maintaining context
config = {"configurable": {"thread_id": "1"}}messages = [HumanMessage(content="Tell me about Harsha?she is girl")]
result = react_graph.invoke({"messages": messages}, config)messages = [HumanMessage(content="Is she a Devops Enginer?")]
result = react_graph.invoke({"messages": messages}, config)
for message in result['messages']:message.pretty_print()

这里根据上面的问题,agent能够自动推理出,第二个问题的主体人。


总结

类似人脑一样,memory机制是agent智能化的基石。当前,memory机制也有一些挑战,比如记忆泄露(未清理的旧数据可能导致存储膨胀(需设置TTL))、隐私合规(GDPR要求用户数据可删除)等。

参考文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/919040.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/919040.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI与IT从业者的未来:替代焦虑还是协作革命?

​​引言:技术渗透与核心命题​​2025年,人工智能技术已从实验室走向产业核心。国务院《关于深入实施“人工智能”行动的意见》推动AI在医疗、制造、金融等领域的规模化落地,全球AI应用用户规模突破2.3亿,生成式AI工具渗透率达16.…

手机版碰一碰发视频系统批量剪辑功能开发,支持OEM贴牌

引言在当今短视频盛行的时代,视频内容的快速生产与分享变得愈发重要。手机版碰一碰发视频系统,借助 NFC 等近场通信技术,实现了便捷的数据交互与视频分享,而在此基础上集成的批量剪辑功能,更是为内容创作者和商家带来了…

Spring AMQP如何通过配置文件避免硬编码实现解耦

在使用Spring AMQP基于注解声明监听者时,可通过抽取常量来避免硬编码:RabbitListener(bindings QueueBinding(exchange Exchange(MQConstant.USER_EXCHANGE),value Queue(MQConstant.USER_QUEUE),key MQConstant.USER_REDIS_BINDING))public void de…

解决zabbix图片中文乱码

要把 Zabbix 前端字体替换为 simkai.ttf(楷体,解决乱码常用),按以下步骤操作:1. 确认 simkai.ttf 路径 先找到系统里 simkai.ttf 字体文件,若没有,可从 Windows 系统(C:\Windows\Fon…

实例分割-动手学计算机视觉13

介绍 实例分割(instance segmentation)的目的是从图像中分割出每个目标实例的掩模(mask)。与语义分割相比,实例分割不但要区分不同的类别,还要区分出同一种类别下的不同目标实例。如图13-1所示 语义分割的结果中,不同的羊对应的标签是一样的…

水环境遥感分析!R语言编程+多源遥感数据预处理;水体指数计算、水深回归分析、水温SVM预测、水质神经网络建模及科研级可视化制图

系统性地整合R语言编程、遥感数据处理及机器学习建模,涵盖水线提取(水体指数与阈值法)、水深反演(多元回归)、水温预测(支持向量机)、水质评估(神经网络)等核心内容&…

微信公众号/小程序百万级OpenID自动化获取工具

摘要 本报告详细阐述了微信用户列表数据获取与处理工具的设计思路,包括分页处理机制、频率控制策略、断点续传功能和分布式存储方案。针对微信API调用限制和用户数据规模特点,该工具旨在高效、安全地获取和存储微信用户列表数据,同时严格遵守微信API调用频率限制,确保系统…

物联网系统中传感器到网关到物联网平台的传输路径、协议、原理、用途与架构详解

摘要物联网(IoT)系统通过传感器、网关和物联网平台实现数据的采集、传输、处理和应用。本文详细分析了传感器到网关再到物联网平台的传输路径,涵盖直接连接、网关中继、边缘计算、多级网关和混合路径五种方式;介绍了短距离&#x…

SpringBoot自动注入配置类初步实现

一.SpringBoot自动装配SpringBoot 的 自动装配(Auto-Configuration) 是它的核心特性之一,它让开发者可以 "开箱即用",避免手动配置大量的 XML 或 Java Config。它的核心思想是:"约定优于配置"&…

直播预告|鸿蒙生态中的AI新玩法

想知道鸿蒙生态里 AI 能玩出啥新花样? 8 月 14 日(周四)20:00 ,「开发者・面对面 坚果派特辑 —— 鸿蒙生态中的 AI 新玩法」直播来袭! 🔍 直播亮点抢先看 AI赋能鸿蒙产品开发:将分享如何利用AI…

智能合约:区块链时代的“数字契约革命”

一、技术原理与核心特征1. 定义与本质智能合约是运行在区块链上的自动化程序,通过代码定义业务规则,在预设条件满足时自动执行操作(如资金转移、信息更新),无需人工干预。其核心特性包括:自动执行&#xff…

【数据分析】比较SparCC、Pearson和Spearman相关性估计方法在合成组学数据上的表现

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍 加载R包 模拟数据 构建网络 RMSE指数计算 画图 总结 系统信息 介绍 在生物信息学和生态学研究中,组学数据的分析越来越依赖于对微生物群落或基因表达数据中物种或基因间相关性的…

Google C++ 风格指南

文章目录背景介绍风格指南的目标C 版本头文件自包含头文件#define 防护包含所需内容前置声明在头文件中定义函数头文件包含顺序与命名规范作用域命名空间内部链接非成员函数、静态成员函数与全局函数局部变量静态与全局变量关于析构的决策关于初始化的决策常见模式thread_local…

安装部署_WVP流媒体

文章目录一、DEV_WVP流媒体开发手册1、搭建流媒体服务clone代码:安装编译器cmake构建和编译项目修改配置文件启动项目2、搭建GB28181协议视频平台安装 jdk, nodejs, maven, git安装redis安装postgresqlclone代码编译前端代码编译后端代码配置文件修改3、设备接入测测…

软件I2C实现(2):I2C协议实现

0 参考资料 I2C 总线规范.pdf 1 I2C协议实现 1.1 SCL、SDA引脚初始化 将SCL、SDA初始化为开漏输出,电平设置为高电平(使用外部上拉电阻拉高)。 /*** @brief 软件I2C初始化** @param sw_i2c_cfg 软件I2C配置指针*/ int sw_i2c_init(sw_i2c_cfg_t *sw_i2c_cfg) {GPIO_InitT…

疯狂星期四文案网第40天运营日记

网站运营第40天,点击观站: 疯狂星期四 crazy-thursday.com 全网最全的疯狂星期四文案网站 运营报告 今日访问量 今日搜索引擎收录情况 必应秒发秒收 百度收录很慢 网站优化点 优化seo 修复已知bug

【大语言模型 01】注意力机制数学推导:从零实现Self-Attention

注意力机制数学推导:从零实现Self-Attention - 开启大语言模型的核心密码 关键词:注意力机制、Self-Attention、Transformer、数学推导、PyTorch实现、大语言模型、深度学习 摘要:本文从数学原理出发,详细推导Self-Attention的完整…

2025 环法战车科技对决!维乐 Angel Glide定义舒适新标

环法赛场不仅是顶尖车手的竞技舞台,更是自行车科技的时尚秀场。然而经常骑行的朋友都知道,当顶级战车遇上专业坐垫,方能成就完美骑行体验。2025 年环法赛场上的新战车们各展神通,而维乐 Angel Glide 坐垫以其独特的科技与设计&…

VS Code配置MinGW64编译ALGLIB库

VS Code用MinGW64编译C代码安装MSYS2软件并配置ALGLIB库和测试引用库代码的完整具体步骤。 1. 安装 MSYS2 下载 MSYS2: 访问 MSYS2 官网下载最新安装包(如 msys2-x86_64-latest.exe) 安装: 运行安装程序,默认路径为 C…

《WINDOWS 环境下32位汇编语言程序设计》第2章 准备编程环境

2.1 Win32可执行文件的开发过程 在DOS下,生成一个可执行文件的步骤比较简单,用编译器将源程序编译为obj文件,再用链接器将obj文件链接成exe文件,不同语言的开发过程都差不多。 DOS可执行文件中的内容是由源程序中所写的代码和数…