# 记忆(Memory)
对于智能体而言记忆是非常重要的一个组成部分，它让智能体能够记住发生过的事。在绝大部分对话与任务场景中，我们希望智能体能够结合历史信息进行解答与交流。

同人类的记忆一样，智能体的记忆可以简单分为下列两类：
* 短期记忆：Agent执行任务过程中的即时上下文信息，暂时保存和操作有限数量的记忆信息
* 长期记忆：将Agent的上下文信息实时进行持久化，始终保证提供长期的记忆信息

在这个定义过程中我们会发现，记忆除其本身的定义外，还会依赖如向量存储、快速检索等一些列技术。

此外，记忆除了上述提到的给智能体提供基于长短期上下文能力外，记忆还可提供非常多可观的作用。例如：通过对于记忆进行挖掘与处理，我们可以将记忆沉淀为经验知识；记忆可以记录与智能体的全部运行过程记录用户的“偏好”等等。

## 记忆架构
agentUniverse中，记忆的整体架构图如下所示：
![agentUniverse记忆架构](../../../../_picture/memory.jpg)
包含多智能体记忆传递、添加记忆、检索记忆、裁剪压缩记忆流程。

### 多智能体记忆传递流程

在多智能体记忆传递流程中，以`chat_history`参数为入口，将智能体A的特定记忆信息携带source（来源Agent A）标签，传递给智能体B，智能体B参照aU agent基础类中的`process_memory`方法，读取`chat_history`携带的记忆信息，并添加到智能体B对应的记忆中。

#### 多智能体记忆传递代码示例
在智能体A运行时，传递特定记忆信息给到智能体B，具体应用案例可参照aU sample工程中的[多轮多Agent讨论小组](../../../实践应用/讨论组.md)。
```python
from typing import List

from agentuniverse.agent.agent import Agent
from agentuniverse.agent.memory.message import Message
from agentuniverse.agent.agent_manager import AgentManager

memory_messages: List[Message] = [Message(content='你好，我是智能体A，很高兴认识你', source='agent_a')]

agent_b: Agent = AgentManager().get_instance_obj('agent_b')
agent_b.run({'chat_history': memory_messages})
```

### 添加记忆流程
在添加记忆流程中，获取记忆实例中配置的多个`memory_storage`（记忆存储）领域组件，将记忆的消息列表、智能体id（agent_id）、会话id（session_id）、source（记忆来源）等信息，进行多路存储。

目前agentUniverse内置[ChromaDB](../../../../../../agentuniverse/agent/memory/memory_storage/chroma_memory_storage.py)
、[SqlAlchemy](../../../../../../agentuniverse/agent/memory/memory_storage/sql_alchemy_memory_storage.py)、[本地内存](../../../../../../agentuniverse/agent/memory/memory_storage/ram_memory_storage.py)三种记忆存储方式，用户可根据实际需求选择合适的记忆存储方式。

特别提醒：在agent基类的`pre_parse_input`方法中，aU会自动读取当前智能体配置的`name`，设置为`agent_input`中的`agent_id`；`session_id`需用户执行智能体时传入。 记忆流程可以使用`agent_input`解析的参数作为入参。
```python
def pre_parse_input(self, input_object) -> dict:
    agent_input = dict()
    # Omitted code
    agent_input['agent_id'] = self.agent_model.info.get('name', '')
    agent_input['session_id'] = input_object.get_data('session_id') or ''
    # Omitted code
    return agent_input
```


### 检索记忆流程

在检索记忆流程中，获取记忆实例中配置的`memory_retrieval_storage`领域组件（若用户未配置，默认使用`memory_storages`中的第一个记忆存储组件），根据智能体id（agent_id）、会话id（session_id）、source（记忆来源），进行记忆检索。

[ChromaDB](../../../../../../agentuniverse/agent/memory/memory_storage/chroma_memory_storage.py)可根据query进行向量检索，
[SqlAlchemy](../../../../../../agentuniverse/agent/memory/memory_storage/sql_alchemy_memory_storage.py)、[本地内存](../../../../../../agentuniverse/agent/memory/memory_storage/ram_memory_storage.py)根据时间顺序条件过滤，检索出指定的记忆信息。
### 裁剪压缩记忆流程

在裁剪压缩记忆流程中，获取记忆实例中的`max_tokens`参数（prompt中记忆的最大token数），若检索记忆流程中获取的记忆信息超过最大token数，则进行裁剪压缩。

获取记忆实例中配置的`memory_compressor`（记忆压缩）领域组件，对裁剪的记忆进行压缩总结，并合成满足token数限制的最终记忆信息。

# 总结
至此您已初步了解记忆的作用，在下一节我们将具体向您介绍记忆组件的标准定义、如何自定义创建记忆、如何使用记忆等。