Skip to content

5. 记忆与会话

为什么需要

一次对话不止一个请求:agent 应该记得前面说过什么。AmritaCore 把两件事分开:

  • session_id —— 一次对话的标识符。它是唯一的:它命名一次对话, 本身并不"共享"任何东西。
  • 数据存储 —— 对话历史实际存放在哪里。这是数据后端的职责,不是框架的。

本教程展示两者如何配合。

1. 唯一的会话 ID

每个 ChatObject 需要一个唯一的 session_id(或预构建的 context——两者互斥):

python
import uuid

chat = agent.get_chatobject(
    "My name is Alice.",
    session_id=str(uuid.uuid4()),  # 每个对话唯一
)
async with chat.begin():
    ...

这个 id 传给后端,后端把它当作历史数据的存储键。不同 id 的两次对话永远 独立

2. 谁存数据?后端

AmritaCore 本身不存储对话历史。它把 session_id 交给数据后端 (AbilityBackend / MemoryBackend),由后端决定数据存放在哪里:

  • LegacyBackend(默认)—— 记忆保存在进程内:某个 id 的历史只存活 于进程生命周期,存在全局容器中。
  • 你自己的后端 —— 实现后端接口,把历史存到数据库、Redis、文件…… (见数据层)。

所以两个 ChatObject 是否"看到同一段历史",由后端的存储决定,而不是 复用同一个 id。如果你的后端在某个 id 下存了数据,第二次用该 id 的对话就会 加载它;如果没存,就不会。

3. 记忆摘要

长会话会撞上下文上限。开启自动摘要:

python
from amrita_core import minimal_init
from amrita_core.config import AmritaConfig

config = AmritaConfig()
config.llm.enable_memory_abstract = True
config.llm.memory_abstract_threshold = 4000  # tokens
await minimal_init(config)

当 prompt 超过阈值,较旧轮次会在请求发出前被摘要。(内置 step 策略还会 执行 Step 间压缩——见 Step 循环。)

4. 刚才发生了什么

  • session_id 是一次对话的唯一标识符——只负责命名
  • 数据后端决定历史存在哪里、能存活多久
  • 摘要让长会话保持在上下文窗口内

下一步

教程路径已完成。推荐下一步:

Apache 2.0 许可证(一些内容可能没有完全翻译成中文,请以英文文档为准。)