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
英文地址,請注明出處:http://en.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可執行文件中的內容是由源程序中所寫的代碼和數…