为了实现一个名为Mem0的Agent Memory系统,我们需要定义一个内存结构,该结构能够存储信息,并允许Agent(智能体)进行读取、写入和查询操作。以下是一个简单的Python实现,它模拟了一个基本的Agent Memory系统。```pythonc
摘要:记忆存储是构建智能个性化、越用越懂你的Agent的核心挑战。上期我们探讨了模型方案实现长记忆存储,本期将聚焦工程实现层面。
- What:记忆内容(手动管理 vs 自动识别)
- How:记忆处理(压缩抽取
记忆存储是构建智能个性化、越用越懂你的Agent的核心挑战。上期我们探讨了模型方案实现长记忆存储,本期将聚焦工程实现层面。
What:记忆内容(手动管理 vs 自动识别)
How:记忆处理(压缩/抽取 vs 直接存储)
Where:存储介质(内存/向量库/图数据库)
Length:记忆长度管理(截断 vs 无限扩展)
Format:上下文构建方式
Retrieve:记忆检索机制
下面我们看两个开源方案LlamaIndex和Mem0对于记忆存储的实现方式
LlamaIndex
https://github.com/run-llama/llama_index/tree/main/llama-index-core/llama_index/core/memory
LlamaIndex提供了长短记忆两种记忆存储方式,短期记忆管理对话历史不做任何处理,当短期记忆超过设定的存储上限则进行持久化存储,或通过事实抽取压缩,或通过向量存储进行相关记忆召回。
短期记忆
通过前文定义的记忆维度分析其实现:
维度
实现方式
What
手动管理:通过put/get方法读写
How
原始存储:无压缩或抽象处理
Where
内存存储:基于SQLAlchemy
Length
Token限制:超限时丢弃早期记忆
Format
线性拼接:直接拼接所有记忆
Retrieve
全量获取:无筛选机制
以下是一个在智能体中使用Memory的示例,短期记忆默认使用Memory初始化,直接传入Agent的运行过程中,Agent每一步运行都会调用finalize方法来更新Memory。运行完以下对话后的通过get方法获取最新的短期记忆如下。
from llama_index.core.memory import Memory
from llama_index.llms.azure_openai import AzureOpenAI
from llama_index.core.agent.workflow import FunctionAgent
memory = Memory.from_defaults(session_id="my_session", token_limit=40000)
import asyncio
llm = AzureOpenAI(**kwargs)
agent = FunctionAgent(llm=llm, tools=[])
response = await agent.run("你好",memory=memory)
如果不使用Agent直接用大模型自己编排工作流的话,需要手动把历史对话插入Memory
from llama_index.core.llms import ChatMessage
memory.put_messages(
[
ChatMessage(role="user", content="你好"),
ChatMessage(role="assistant", content="你好,有什么我能帮您的么?"),
]
)
长期记忆
llamaIndex提供3种长期记忆,分别是StaticMemoryBlock,FactExtractionMemoryBlock,VectorMemoryBlock,差异主要在
StaticMemoryBlock:没有Put方法,不由短期记忆转化而来,而是静态记忆,手动初始化后写入system或者user信息中,再也不变,适合System Message,或者固定推理格式风格等描述之类
VectorMemoryBlock:依旧是线性存储不做处理,不过是写入向量引擎,通过最后一个Message,或者多个memssage拼成的context-window作为检索query进行相关记忆的检索召回。
FactExtractionMemoryBlock:通过事实抽取进行记忆压缩存储。
这里我们举个理财师和客户间对话的例子,来看下当短期记忆超过token_limit * chat_history_token_ratio后,会自动持久化到长期记忆,写入system memsage(也可以写入user message通过insert_method来控制),这时系统指令会变成什么样子。
