Skip to content

Commit 0e550c6

Browse files
authored
Merge pull request #367 from abbyzhou02/v2
docs: sync memory module docs English version
2 parents ef3279e + 10e42b5 commit 0e550c6

28 files changed

+1132
-75
lines changed

content/cn/open_source/modules/memories/naive_textual_memory.md

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
---
22
title: "NaiveTextMemory: 简单明文记忆"
3-
desc: "MemOS 中最轻量级的记忆模块,专为快速原型开发和简单场景设计。无需向量数据库,使用关键词匹配即可快速检索。"
3+
desc: "MemOS 中最轻量级的记忆模块,专为快速原型开发和简单场景设计。无需向量数据库,使用关键词匹配即可快速检索。让我们用最简单的方式开始使用 MemOS 记忆系统!
4+
`NaiveTextMemory` 是一个基于内存的明文记忆模块,将记忆存储在内存列表中,使用关键词匹配进行检索。它是学习 MemOS 的最佳起点,也适用于演示、测试和小规模应用。"
5+
46
---
57

6-
# NaiveTextMemory: 简单明文记忆
78

8-
让我们用最简单的方式开始使用 MemOS 记忆系统!
99

10-
`NaiveTextMemory` 是一个轻量级、基于内存的明文记忆模块,将记忆存储在内存列表中,使用关键词匹配进行检索。它是学习 MemOS 的最佳起点,也适用于演示、测试和小规模应用。
1110

1211
## 目录
1312

@@ -144,7 +143,7 @@ memory = NaiveTextMemory(config: NaiveTextMemoryConfig)
144143

145144

146145

147-
::alert{type="info"}
146+
::note
148147
**示例对比**<br>
149148
查询:"猫咪" <br>
150149
- **关键词匹配**:只匹配包含"猫"、"猫咪"的记忆<br>

content/cn/open_source/modules/memories/tree_textual_memory.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
---
22
title: "TreeTextMemory: 分层结构的明文记忆"
3-
---
4-
5-
让我们在MemOS中构建你的第一个**基于图的、树形明文记忆**
3+
desc: "让我们在MemOS中构建你的第一个**基于图的、树形明文记忆**!
64
75
**TreeTextMemory** 支持以结构化方式组织、关联并检索记忆,同时保留丰富的上下文信息与良好的可解释性。
86
9-
MemOS当前使用[Neo4j](/open_source/modules/memories/neo4j_graph_db)作为后端,未来计划支持更多图数据库。
7+
MemOS当前使用[Neo4j](/open_source/modules/memories/neo4j_graph_db)作为后端,未来计划支持更多图数据库。"
8+
---
9+
10+
1011

1112
## 目录
1213

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
---
2+
title: 对话
3+
desc: 集成“检索、生成、存储”全链路的 RAG 闭环接口,支持基于 MemCube 的个性化回复与记忆自动沉淀。
4+
---
5+
6+
:::note
7+
有关API字段、格式等信息的完整列表,详见[Chat 接口文档](/api_docs/chat/chat)
8+
:::
9+
10+
**接口路径**
11+
* **全量响应**`POST /product/chat/complete`
12+
* **流式响应 (SSE)**`POST /product/chat/stream`
13+
14+
**功能描述**:本接口是 MemOS 的核心业务编排入口。它能够自动从指定的 `readable_cube_ids` 中召回相关记忆,结合当前语境生成回复,并可选地将对话结果自动回写至 `writable_cube_ids` 中,实现 AI 应用的自我进化。
15+
16+
17+
## 1. 核心架构:ChatHandler 编排流程
18+
19+
1. **记忆检索 (Retrieval)**:根据 `readable_cube_ids` 调用 **SearchHandler**,从隔离的 Cube 中提取相关的事实、偏好及工具背景。
20+
2. **上下文增强生成 (Generation)**:将检索到的记忆片段注入 Prompt,调用指定的 LLM(通过 `model_name_or_path`)生成针对性回复。
21+
3. **记忆自动闭环 (Storage)**:若开启 `add_message_on_answer=true`,系统会调用 **AddHandler** 将本次对话异步存入指定的 Cube,无需开发者手动调用添加接口。
22+
## 2. 关键接口参数
23+
24+
### 2.1 身份与语境
25+
| 参数名 | 类型 | 必填 | 说明 |
26+
| :--- | :--- | :--- | :--- |
27+
| **`query`** | `str` || 用户当前的提问内容。 |
28+
| **`user_id`** | `str` || 用户唯一标识,用于鉴权与数据隔离。 |
29+
| `history` | `list` || 短期历史对话记录,用于维持当前会话的连贯性。 |
30+
| `session_id` | `str` || 会话 ID。作为“软信号”提升该会话内相关记忆的召回权重。 |
31+
32+
### 2.2 MemCube 读写控制
33+
| 参数名 | 类型 | 默认值 | 说明 |
34+
| :--- | :--- | :--- | :--- |
35+
| **`readable_cube_ids`** | `list` | - | **读:** 允许检索的记忆 Cube 列表(可跨个人库与公共库)。 |
36+
| **`writable_cube_ids`** | `list` | - | **写:** 对话完成后,自动生成的记忆应存入的目标 Cube 列表。 |
37+
| **`add_message_on_answer`** | `bool` | `true` | 是否开启自动回写。建议开启以维持记忆的持续更新。 |
38+
39+
### 2.3 算法与模型配置
40+
| 参数名 | 类型 | 默认值 | 说明 |
41+
| :--- | :--- | :--- | :--- |
42+
| `mode` | `str` | `fast` | 检索模式:`fast` (快速), `fine` (精细), `mixture` (混合)。 |
43+
| `model_name_or_path` | `str` | - | 指定使用的 LLM 模型名称或路径。 |
44+
| `system_prompt` | `str` | - | 覆盖默认的系统提示词。 |
45+
| `temperature` | `float` | - | 采样温度,控制生成文本的创造性。 |
46+
| `threshold` | `float` | `0.5` | 记忆召回的相关性阈值,低于该值的记忆将被剔除。 |
47+
48+
## 3. 工作原理
49+
50+
MemOS提供两种响应模式可供选型:
51+
### 3.1 全量响应 (`/complete`)
52+
* **特点**:等待模型生成全部内容后一次性返回 JSON。
53+
* **场景**:非交互式任务、后台逻辑处理、或对实时性要求较低的简单应用。
54+
55+
### 3.2 流式响应 (`/stream`)
56+
* **特点**:采用 **Server-Sent Events (SSE)** 协议,实时推送 Token。
57+
* **场景**:聊天机器人、智能助手等需要即时打字机反馈效果的 UI 交互。
58+
59+
## 4. 快速上手
60+
61+
推荐使用开源版内置的 `MemOSClient` 进行调用。以下示例展示了如何询问关于 R 语言学习的建议,并利用记忆功能:
62+
63+
```python
64+
from memos.api.client import MemOSClient
65+
66+
client = MemOSClient(api_key="...", base_url="...")
67+
68+
# 发起对话请求
69+
res = client.chat(
70+
user_id="dev_user_01",
71+
query="根据我之前的偏好,推荐一套 R 语言数据清理方案",
72+
readable_cube_ids=["private_cube_01", "public_kb_r_lang"], # 读:个人偏好+公共库
73+
writable_cube_ids=["private_cube_01"], # 写:沉淀至个人空间
74+
add_message_on_answer=True, # 开启自动记忆回写
75+
mode="fine" # 使用精细检索模式
76+
)
77+
78+
if res:
79+
print(f"AI 回复内容: {res.data}")
80+
```
81+
82+
83+
:::note
84+
**开发者提示:**
85+
若需要针对 `Playground` 环境进行调试,请访问专用的调试流接口 /product/chat/stream/playground 。
86+
:::
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
---
2+
title: 添加记忆 (Add Memory)
3+
desc: MemOS 的核心生产接口。通过 MemCube 隔离机制,实现个人记忆、知识库及多租户场景下的异步记忆生产。
4+
---
5+
6+
**接口路径**`POST /product/add`
7+
**功能描述**:这是系统存储非结构化数据的核心入口。它支持通过对话列表、纯文本或元数据,将原始数据转化为结构化的记忆片段。在开源版中,系统通过 **MemCube** 实现记忆的物理隔离与动态组织。
8+
9+
## 1. 核心机理:MemCube 与隔离
10+
11+
在开源架构中,理解 MemCube 是高效使用接口的关键:
12+
13+
* **隔离单元**:MemCube 是记忆生成的原子单位,Cube 之间完全独立,系统仅在单个 Cube 内部进行去重和冲突解决。
14+
* **灵活映射**
15+
* **个人模式**:将 `user_id` 作为 `writable_cube_ids` 传入,即建立个人私有记忆。
16+
* **知识库模式**:将知识库的唯一标识(QID)作为 `writable_cube_ids` 传入,内容即存入该知识库。
17+
* **多目标写入**:接口支持同时向多个 Cube 写入记忆,实现跨域同步。
18+
19+
20+
## 2. 关键接口参数
21+
22+
核心参数定义如下:
23+
24+
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
25+
| :--- | :--- | :--- | :--- | :--- |
26+
| **`user_id`** | `str` || - | 用户唯一标识符,用于权限校验。 |
27+
| **`messages`** | `list/str`|| - | 待存储的消息列表或纯文本内容。 |
28+
| **`writable_cube_ids`** | `list[str]`|| - | **核心参数**:指定写入的目标 Cube ID 列表。 |
29+
| **`async_mode`** | `str` || `async` | 处理模式:`async` (后台队列处理) 或 `sync` (当前请求阻塞)。 |
30+
| **`is_feedback`** | `bool` || `false` | 若为 `true`,系统将自动路由至反馈处理器执行记忆更正。 |
31+
| `session_id` | `str` || `default` | 会话标识符,用于追踪对话上下文。 |
32+
| `custom_tags` | `list[str]`|| - | 自定义标签,可作为后续搜索时的过滤条件。 |
33+
| `info` | `dict` || - | 扩展元数据。其中的所有键值对均支持后续过滤检索。 |
34+
| `mode` | `str` || - | 仅在 `async_mode='sync'` 时生效,可选 `fast` (快速) 或 `fine` (精细)。 |
35+
36+
## 3. 工作原理 (Component & Handler)
37+
38+
当请求到达后端时,系统由 **AddHandler** 调度核心组件执行以下逻辑:
39+
40+
1. **多模态解析**:由 `MemReader` 组件将 `messages` 转化为内部记忆对象。
41+
2. **反馈路由**:若 `is_feedback=True`,Handler 会提取对话末尾作为反馈,直接修正已有记忆,不生成新事实。
42+
3. **异步分发**:若为 `async` 模式,`MemScheduler` 将任务推入任务队列,接口立即返回 `task_id`
43+
4. **内部组织**:算法在目标 Cube 内执行组织逻辑,通过去重和融合优化记忆质量。
44+
45+
## 4. 快速上手示例
46+
47+
推荐使用 `MemOSClient` SDK 进行标准化调用:
48+
49+
```python
50+
from memos.api.client import MemOSClient
51+
52+
# 初始化客户端
53+
client = MemOSClient(api_key="...", base_url="...")
54+
55+
# 场景一:为个人用户添加记忆
56+
client.add_message(
57+
user_id="sde_dev_01",
58+
writable_cube_ids=["user_01_private"],
59+
messages=[{"role": "user", "content": "我正在学习 R 语言的 ggplot2。"}],
60+
async_mode="async",
61+
custom_tags=["Programming", "R"]
62+
)
63+
# 场景二:往知识库导入内容并开启反馈
64+
client.add_message(
65+
user_id="admin_01",
66+
writable_cube_ids=["kb_finance_2026"],
67+
messages="2026年财务审计流程已更新,请参考附件。",
68+
is_feedback=True, # 标记为反馈以更正旧版流程
69+
info={"source": "Internal_Portal"}
70+
)
71+
```
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
---
2+
title: 删除记忆 (Delete Memory)
3+
desc: 从指定的 MemCube 中永久移除记忆条目、关联文件或符合特定过滤条件的记忆集合。
4+
---
5+
6+
**接口路径**`POST /product/delete_memory`
7+
**功能描述**:本接口用于维护记忆库的准确性与合规性。当用户要求遗忘特定信息、数据过时或需要清理特定的上传文件时,可以通过此接口在向量数据库与图数据库中同步执行物理删除。
8+
9+
## 1. 核心机理:Cube 级物理清理
10+
11+
在开源版中,删除操作遵循严格的 **MemCube** 隔离逻辑:
12+
13+
* **作用域限制**:通过 `writable_cube_ids` 参数,删除操作被严格锁定在指定的记忆体中,绝不会误删其他 Cube 的内容。
14+
* **多维删除**:支持按 **记忆 ID**(精确)、**文件 ID**(关联删除)以及 **Filter 过滤器**(条件逻辑)三种维度并发执行清理。
15+
* **原子性同步**:删除操作由 **MemoryHandler** 触发,确保底层向量索引与图数据库中的实体节点同步移除,防止召回“幻觉”。
16+
17+
18+
19+
## 2. 关键接口参数
20+
核心参数定义如下:
21+
22+
| 参数名 | 类型 | 必填 | 说明 |
23+
| :--- | :--- | :--- | :--- |
24+
| **`writable_cube_ids`** | `list[str]` || 指定执行删除操作的目标 Cube 列表。 |
25+
| **`memory_ids`** | `list[str]` || 待删除的记忆唯一标识符列表。 |
26+
| **`file_ids`** | `list[str]` || 待删除的原始文件标识符列表,将同步清理该文件产生的全部记忆。 |
27+
| **`filter`** | `object` || 逻辑过滤器。支持按标签、元信息或时间戳批量删除符合条件的记忆。 |
28+
29+
## 3. 工作原理 (MemoryHandler)
30+
31+
1. **权限与路由**:系统通过 `user_id` 校验操作权限,并将请求路由至 **MemoryHandler**
32+
2. **定位存储**:根据 `writable_cube_ids` 定位底层的 **naive_mem_cube** 组件。
33+
3. **分发清理任务**
34+
* **按 ID 清理**:直接根据 UUID 在主数据库和向量库中执行记录抹除。
35+
* **按 Filter 清理**:先检索出符合条件的记忆 ID 集合,再执行批量物理移除。
36+
4. **状态反馈**:操作完成后返回成功状态,相关内容将立即从 [**检索接口**](./search_memory.md) 的召回范围中消失。
37+
38+
## 4. 快速上手示例
39+
40+
使用 `MemOSClient` 执行不同维度的删除操作:
41+
42+
```python
43+
# 初始化客户端
44+
client = MemOSClient(api_key="...", base_url="...")
45+
46+
# 场景一:精确删除单条已知的错误记忆
47+
client.delete_memory(
48+
writable_cube_ids=["user_01_private"],
49+
memory_ids=["2f40be8f-736c-4a5f-aada-9489037769e0"]
50+
)
51+
52+
# 场景二:批量清理某一特定标签下的所有过时记忆
53+
client.delete_memory(
54+
writable_cube_ids=["kb_finance_2026"],
55+
filter={"tags": {"contains": "deprecated_policy"}}
56+
)
57+
```
58+
## 5. 注意事项
59+
60+
不可恢复性:删除操作是物理删除。一旦执行成功,该记忆将无法再通过检索接口召回。
61+
62+
文件关联性:通过 `file_ids` 删除时,系统会自动溯源并清理该文件解析出的事实记忆和摘要。
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
---
2+
title: 获取记忆 (Get Memories)
3+
desc: 分页查询或全量导出指定 Cube 中的记忆集合,支持按类型过滤及子图提取。
4+
---
5+
6+
**接口路径**
7+
* **分页查询**`POST /product/get_memory`
8+
* **全量导出**`POST /product/get_all`
9+
10+
**功能描述**:用于列出或导出指定 **MemCube** 中的记忆资产。通过这两个接口,您可以获取系统生成的原始记忆片段、用户偏好或工具使用记录,支持分页展示与结构化导出。
11+
12+
## 1. 核心机理:分页 vs. 全量导出
13+
14+
在开源版中,系统通过 **MemoryHandler** 提供了两种不同的集合访问模式:
15+
16+
* **业务分页模式 (`/get_memory`)**
17+
* **设计初衷**:为前端 UI 列表设计。支持 `page``page_size` 参数。
18+
* **特性**:默认包含偏好记忆(`include_preference`),支持轻量级的数据加载。
19+
* **全量导出模式 (`/get_all`)**
20+
* **设计初衷**:为数据迁移或复杂关系分析设计。
21+
* **核心能力**:支持传入 `search_query` 提取相关的**子图(Subgraph)**,或按 `memory_type`(文本/动作/参数)导出全量数据。
22+
23+
24+
## 2. 关键接口参数
25+
26+
### 2.1 分页查询参数 (`/get_memory`)
27+
28+
| 参数名 | 类型 | 必填 | 说明 |
29+
| :--- | :--- | :--- | :--- |
30+
| **`mem_cube_id`** | `str` || 目标 MemCube ID。 |
31+
| **`user_id`** | `str` || 用户唯一标识符。 |
32+
| **`page`** | `int` || 页码(从 1 开始)。若设为 `None` 则尝试全量导出。 |
33+
| **`page_size`** | `int` || 每页条目数。 |
34+
| `include_preference` | `bool` || 是否包含偏好记忆。 |
35+
36+
### 2.2 全量/子图导出参数 (`/get_all`)
37+
38+
| 参数名 | 类型 | 必填 | 说明 |
39+
| :--- | :--- | :--- | :--- |
40+
| **`user_id`** | `str` || 用户 ID。 |
41+
| **`memory_type`** | `str` || 记忆类型:`text_mem`, `act_mem`, `para_mem`|
42+
| `mem_cube_ids` | `list` || 待导出的 Cube ID 列表。 |
43+
| `search_query` | `str` || 若提供,将基于此查询召回并返回相关的记忆子图。 |
44+
45+
## 3. 快速上手示例
46+
47+
### 3.1 前端分页展示 (SDK 调用)
48+
49+
```python
50+
# 获取第一页,每页 10 条记忆
51+
res = client.get_memory(
52+
user_id="sde_dev_01",
53+
mem_cube_id="cube_research_01",
54+
page=1,
55+
page_size=10
56+
)
57+
58+
for mem in res.data:
59+
print(f"[{mem['type']}] {mem['memory_value']}")
60+
```
61+
### 3.2 导出特定的事实记忆子图
62+
```python
63+
# 提取与“R 语言”相关的全部事实记忆
64+
res = client.get_all(
65+
user_id="sde_dev_01",
66+
memory_type="text_mem",
67+
search_query="R language visualization"
68+
)
69+
```
70+
71+
## 4. 响应结构说明
72+
接口返回标准的业务响应,其中 data 包含记忆对象数组。每条记忆通常包含以下核心字段:
73+
74+
`id`: 记忆唯一标识,用于执行 获取详情 或 删除 操作。
75+
76+
`memory_value`: 经过算法加工后的记忆文本。
77+
78+
`tags`: 关联的自定义标签。
79+
80+
::note
81+
开发者提示: 如果您已知记忆 ID 并希望查看其完整的元数据(如 confidence 或 usage 记录),请使用`获取记忆详情`(Get_ memory_by_id)接口。 :::

0 commit comments

Comments
 (0)