记忆服务
AG-Kit 的记忆服务为 AI Agent 提供全面的记忆管理,支持短期对话历史和长期知识持久化。该服务为不同的部署场景提供多种实现,从开发到企业生产环境。概述
记忆服务由两个主要组件组成:- 短期记忆: 管理对话历史、上下文窗口和会话状态
- 长期记忆: 存储持久化知识、用户偏好和提取的见解
记忆实现
AG-Kit 为不同的用例和部署场景提供多种短期记忆实现。每种实现都支持统一的分支和摘要架构以及上下文工程能力。可用的实现
InMemoryMemory
用于开发和测试的易失性内存存储
TDAIMemory
基于 TDAI 服务的云端持久化存储
TypeORMMemory
支持多种数据库的灵活 ORM 存储
MySQLMemory
优化的 MySQL 实现,具有性能特性
MongoDBMemory
具有灵活模式的 NoSQL 文档存储
CloudBaseMemory
腾讯 CloudBase 无服务器集成
快速比较
| 实现 | 存储类型 | 持久化 | 可扩展性 | 用例 |
|---|---|---|---|---|
| InMemoryMemory | 易失性 | ❌ | 单实例 | 开发、测试 |
| TDAIMemory | 云端 | ✅ | 高 | 生产、企业 |
| TypeORMMemory | 数据库 | ✅ | 中高 | 自定义模式、企业 |
| MySQLMemory | MySQL | ✅ | 高 | MySQL 优化应用 |
| MongoDBMemory | NoSQL | ✅ | 非常高 | 灵活模式、分析 |
| CloudBaseMemory | 无服务器 | ✅ | 自动 | 中国市场、无服务器 |
基本用法示例
核心数据结构
Message
唯一消息标识符
消息角色类型
消息内容文本
消息时间戳
与消息关联的工具调用
工具调用标识符
IMemoryEvent
消息数据
事件状态和元数据
上下文工程
内置的自动上下文管理,用于在长对话中实现最佳性能。配置类型
ContextThresholds
性能开始下降的阈值
在 preRotThreshold 的此百分比时触发压缩
在 preRotThreshold 的此百分比时触发摘要
StructuredSummary
已更改的文件
用户的目标
最后完成的步骤
已做出的重要决策
需要保留的关键上下文
创建摘要的时间
用于恢复的可选上下文转储
通用功能
所有记忆实现共享以下核心能力:上下文工程
具有智能压缩和摘要的自动上下文管理:令牌管理
内置令牌计数和修剪,支持多种策略:基于内容的搜索
跨所有实现的相似性搜索和相关性评分:会话管理
多会话支持,具有隔离的对话上下文:会话分支
会话分支启用类 Git 的对话实验和时间旅行功能。创建实验性对话路径,测试不同的响应,并回滚到以前的状态。关键特性
- 对话实验: 在不丢失原始对话的情况下尝试不同的路径
- 时间旅行: 检出到任何先前的事件并从那里继续
- A/B 测试: 在并行分支中比较不同的 Agent 响应
- 撤销/回滚: 轻松恢复不需要的更改
基本操作
实现支持
| 实现 | 分支支持 |
|---|---|
| InMemoryMemory | ✅ 完全支持 |
| TDAIMemory | ❌ 不可用 |
| TypeORMMemory | ✅ 完全支持 |
| MySQLMemory | ✅ 完全支持 |
| MongoDBMemory | ✅ 完全支持 |
| CloudBaseMemory | ✅ 完全支持 |
令牌管理
AG-Kit 提供全面的令牌管理实用程序,用于处理 LLM 上下文窗口和优化内存使用。关键特性
- 精确分词: TiktokenTokenizer 用于精确的 OpenAI 模型令牌计数
- 智能修剪: 具有多种策略的自动消息修剪
- 上下文管理: 与所有记忆实现的内置集成
- 性能优化: 具有资源管理的高效令牌操作
基本用法
长期记忆
长期记忆智能地从对话中提取和存储重要信息,以构建持久的用户档案、偏好和知识库。关键特性
- 智能提取: 自动识别重要信息
- 语义搜索: 基于高级相似性的检索
- 记忆合并: 去重和关系映射
- 基于策略的组织: 按类型和用途对记忆进行分类
可用的实现
基本用法
核心数据结构
基础接口
API 参考
BaseMemory (抽象类)
所有记忆实现的基础类,具有内置的上下文工程。所有记忆实现都继承自此类并提供一致的接口方法。构造函数
记忆和上下文工程的配置
核心接口方法
所有记忆实现都从 BaseMemory 继承这些方法,以实现跨不同存储后端的一致记忆管理。基本操作
list(options?): Promise<IMemoryEvent[]>
使用过滤和分页支持检索事件。
可选的过滤和分页参数
符合条件的记忆事件数组
add(event, options?): Promise<void>
将单个事件添加到记忆存储。
要存储的记忆事件
事件存储的可选参数
addList(events, options?): Promise<void>
在批量操作中高效地添加多个事件。
要存储的记忆事件数组
批量存储的可选参数
delete(idOrIndex, options?): Promise<void>
从记忆中删除特定事件。
要删除的事件 ID 或索引
删除的可选参数
retrieve(query, options?): Promise<IMemoryEvent[]>
使用相似性匹配按内容搜索事件。
用于内容匹配的搜索查询文本
可选的搜索参数
具有相关性分数的匹配事件数组
clear(options?): Promise<void>
使用可选过滤从存储中清除事件。
选择性清除的可选参数
getCount(options?): Promise<number>
获取存储中的事件总数。
计数的可选参数
符合条件的事件总数
isEmpty(options?): Promise<boolean>
检查记忆存储是否为空。
空检查的可选参数
如果不存在符合条件的事件,则为 True
分支方法(在支持的地方)
在支持对话分支的实现中可用 (InMemoryMemory、TypeORMMemory、MySQLMemory、MongoDBMemory、CloudBaseMemory)。branch(name, fromEventId?): Promise<void>
创建一个新的对话分支以进行实验。
新分支的唯一名称
要从中分支的事件 ID(默认为当前 HEAD)
checkout(target, options?): Promise<void>
切换到不同的分支或检出特定事件。
要检出的分支名称或事件 ID
可选的检出参数
listBranches(): Promise<string[]>
列出记忆存储中的所有可用分支。
分支名称数组
deleteBranch(name): Promise<void>
删除特定分支及其所有事件。
要删除的分支名称
cleanupBranches(keep?): Promise<void>
删除未使用的分支以优化存储。
要保留的分支名称数组(默认为当前分支)
上下文工程方法
isCompacted(event: IMemoryEvent): boolean
检查事件是否已压缩。
要检查压缩的事件
如果事件具有压缩元数据,则为 True
decompressEvent(event: IMemoryEvent): IMemoryEvent
解压缩已压缩的事件以恢复原始内容。
要解压缩的已压缩事件
具有原始内容和状态的解压缩事件
decompressEvents(events: IMemoryEvent[]): IMemoryEvent[]
解压缩多个已压缩的事件。
要解压缩的事件数组
解压缩的事件数组
getMetrics(): object
获取上下文管理操作的性能指标。
包含性能统计信息的指标对象
长期记忆 API
Mem0LongTermMemory
构造函数
Mem0 配置对象
方法
record(memory: MemoryEntity): Promise<void>
使用智能处理将新的记忆实体记录到 Mem0 服务。
包含内容和元数据的完整记忆实体
semanticSearch(query: string, options?: MemoryQuery): Promise<MemoryEntity[]>
使用 Mem0 的 AI 驱动相似性匹配执行高级语义搜索。
用于语义匹配的搜索查询文本
搜索配置选项
具有相关性分数的匹配记忆数组
extractAndRecord(messages: Message[], context: Record<string, any>): Promise<MemoryEntity[]>
使用 AI 自动从对话消息中提取和记录重要记忆。
要分析的对话消息数组
用于记忆提取的额外上下文
提取和记录的记忆数组
令牌管理 API
TiktokenTokenizer
构造函数
Tiktoken 编码名称。支持的编码:
'o200k_base', 'cl100k_base', 'p50k_base', 'r50k_base', 'gpt2'方法
encode(text: string): Uint32Array
使用 tiktoken 将文本编码为令牌数组。
要编码为令牌的文本
令牌 ID 数组
decode(tokens: Uint32Array): string
将令牌解码回文本。
要解码的令牌 ID 数组
解码的文本字符串
countTokens(text: string): number
计算文本中的令牌数。
要计数令牌的文本
文本中的令牌数
free(): void
释放编码资源。
TokenTrimmer
构造函数
方法
countMessageTokens(message: { role: string; content: string }): number
计算消息的令牌数,包括格式化开销。
参数:
要计数令牌的消息对象
包括角色和格式化开销的总令牌数
trimMessages<T>(events: T[], maxTokens: number, strategy?: 'newest_first' | 'oldest_first'): T[]
使用指定策略修剪消息列表以适应令牌限制。
参数:
要修剪的事件/消息数组
修剪列表的最大令牌限制
修剪策略 - 超出限制时保留哪些消息
令牌限制内的修剪事件数组
newest_first: 保留最新消息,修剪较旧的消息oldest_first: 保留最早消息,修剪较新的消息- 超出限制的单个消息将使用 ”…” 后缀截断
- 考虑 ChatML 格式化开销(每条消息 4 个令牌)
free(): void
释放分词器资源。
返回:
无返回值
SimpleTokenizer
构造函数
估计的每字符令牌比率
方法
encode(text: string): Uint32Array
简单的基于字符的编码(每个字符成为一个令牌)。
参数:
要编码的文本
字符代码作为令牌的数组
decode(tokens: Uint32Array): string
将基于字符的令牌解码回文本。
参数:
要解码的令牌数组
解码的文本字符串
countTokens(text: string): number
基于字符长度和比率估计令牌数。
参数:
要计数令牌的文本
估计的令牌数