microsoft/Memora
GitHub: microsoft/Memora
Memora 是微软提出的 AI agent 记忆管理框架,通过将记忆内容与索引抽象分离,在不丢失细节的前提下实现精准的存储与检索。
Stars: 192 | Forks: 16
Memora:平衡抽象与具体性的调和记忆表示

[](https://opensource.org/licenses/MIT)

[](https://arxiv.org/abs/2602.03315)
## 简介
Memora 旨在消除 agent 记忆管理的烦恼。无需再操心何时存储何种记忆,或是如何在恰当时机提取正确记忆,agent 可以完全依赖 Memora 来处理这一切。通过提供易于使用的框架,Memora 将开发者从底层的记忆管理中解放出来,使智能记忆成为一项内置能力。
### Memora 的独特之处
通过引入**将存储内容与其组织和访问方式分离的调和记忆表示**,Memora 有别于 RAG pipeline、扁平记忆存储和基于图的知识库。Memora 并非直接对所有记忆内容进行索引,而是构建了一个脚手架层(使用主要抽象和线索锚点),在不限制底层数据的前提下为记忆提供结构支撑。
该设计的核心在于每个记忆条目的表示,它由三个组件构成:
- **记忆值(未索引)**:完整存储的信息,保留细粒度细节,不进行压缩或造成丢失
- **主要抽象(已索引)**:一对一的摘要,捕捉记忆的核心主题,并作为更新和聚合的规范单元
- **线索锚点(已索引)**:多个语义入口点(例如 ```
+ ``` ),通过多对多结构连接相关记忆
至关重要的是,只有主要抽象和线索锚点被索引,而记忆值本身并未被索引。这使得 Memora 能够保留丰富、高保真的信息,而不会引入通常与索引或 embedding 原始内容相关的模糊性。同时,抽象层提供了一种结构化的方式来组织和访问记忆,通过定义良好的表示来引导检索,而不是依赖于对非结构化数据的相似度计算。
因此,Memora 保持了比基于图的方法更高的灵活性,同时仍提供强大的组织结构。它在存储的记忆中保留了细节,同时使用轻量级的抽象来实现对该信息的**更精确、受控的访问**。
## 核心功能
- **轻量级集成:**
旨在以极少的改动接入现有的 agent 系统,无需对记忆处理进行全面重新设计。
- **结构化记忆表示:**
在记忆值及其抽象之间提供清晰的分离,从而实现随时间推移的一致更新、去重和组织。
- **共享记忆空间:**
支持统一的记忆层,可在同一环境中跨 agent 访问,实现知识的协同与重用。
- **支持多种记忆类型:**
能够表示不同形式的记忆(例如事实性、情节性、程序性记忆),具体取决于记忆值和抽象的构建方式。
- **受控的访问与隔离:**
允许跨 agent 或角色划定和管理记忆范围,支持隐私保护和选择性共享。
- **灵活的存储后端:**
兼容不同的存储设置(本地或远程),无需将记忆表示与特定基础设施紧密耦合。
## Memora 的工作原理
Memora 为 AI agent 提供了完整的记忆生命周期:
1. **记忆摄取** — 当 agent 处理对话或文档时,Memora 会自动提取相关的事实、情节和程序性知识。它将对话切分为主题情节,并将关键信息提炼为结构化的记忆条目。
2. **智能存储** — 记忆通过语义 embedding 存储在向量数据库 (ChromaDB) 中。Memora 会对现有记忆进行去重、合并和更新,以保持存储的整洁和最新。可选的 **cue index** 将高层级的线索映射到记忆,以实现快速、结构化的查找。
3. **自适应检索** — 在查询时,Memora 支持多种检索策略:
- **Semantic** — 基于记忆库的向量相似度搜索
- **Prompted** — 由 LLM 引导的多步检索策略,迭代优化搜索过程
- **Hybrid** — 结合语义搜索与 BM25/关键词匹配以提升召回率
- **GRPO** *(实验性)* — 基于 Group Relative Policy Optimization 训练的强化学习检索策略
4. **答案生成** — 检索到的记忆将被格式化并注入到 LLM prompt 中,从而生成有依据、具备上下文感知的回复。
## 安装说明
**前置条件:** Python >= 3.10
```
# 从源码安装
git clone https://github.com/microsoft/Memora
cd Memora
pip install -e .
```
## 快速开始
请参阅 [`quickstart.py`](quickstart.py) 获取完整的可运行示例。
```
from memora.memora_client import MemoraClient
# 使用您的配置进行初始化(配置设置请参见 quickstart.py)
memory_client = MemoraClient(cfg=cfg, user_id="my_user")
# 将上下文添加到 memory
memory_client.add("Alice is moving to Seattle for a new job.", type="doc")
# 查询 memory(semantic search)
results = memory_client.query("Where is Alice moving?", top_k=5)
for entry in results:
print(f"{entry.index}: {entry.value}")
# 使用 prompted retrieval policy 进行高级查询
results = memory_client.advance_query("Where is Alice moving?", query_type="prompt", top_k=5)
```
### 在 Agent 中使用 Memora
```
from memora.memora_client import MemoraClient
class MyAgent:
def __init__(self, cfg):
self.memory_client = MemoraClient(cfg=cfg, user_id="agent_user")
def generate_response(self, user_message):
# Retrieve relevant memories
memories = self.memory_client.query(user_message, top_k=5)
# Your agent logic here
response = ...
# Store conversation in memory
conversation = f"User: {user_message}\nAssistant: {response}"
self.memory_client.add(conversation, type="doc")
return response
```
## 运行基准实验
Memora 包含了针对两个成熟基准的实验运行器。两者均使用 [Hydra](https://hydra.cc/) 进行配置 —— 所有参数均可在命令行中被覆盖。
### LoCoMo
[LoCoMo](https://arxiv.org/abs/2402.17753) 基准评估跨单跳、多跳、时间和开放域问题类型的长对话记忆能力。
```
cd app/locomo
# 在 LoCoMo 上运行 Memora
python run_memora.py \
llm.model="gpt-4.1-mini" \
memory.memory_store="memora-cue" \
memory.enable_cue_index=True \
retrieval.strategy="prompt"
```
完整详情请参阅 [app/locomo/README.md](app/locomo/README.md)。
### LongMemEval
[LongMemEval](https://arxiv.org/abs/2410.10813) 基准测试跨多种问题类型的长期记忆能力。
```
cd app/longmemeval
# 在 LongMemEval 上运行 Memora
python run_memora.py \
llm.model="gpt-4.1-mini" \
memory.memory_store="memora-semantic" \
memory.enable_episodic_memory=True \
retrieval.strategy="semantic"
```
完整详情请参阅 [app/longmemeval/README.md](app/longmemeval/README.md)。
### GRPO 实验 *(实验性)*
Memora 支持通过 Group Relative Policy Optimization (GRPO) 训练检索策略。它利用强化学习来学习针对特定查询应检索哪些记忆,使用经过 fine-tuning 的本地模型(例如带 LoRA 的 Qwen 3B/7B)替代被提示的 LLM 调用。
GRPO pipeline 包含以下步骤:
1. **轨迹收集** — 使用当前策略采样检索轨迹
2. **轨迹评分** — 基于依据性、冗余度和成本对轨迹进行评分
3. **策略训练** — 使用带有组相对优势的 GRPO 训练检索策略
#### 训练
```
# 使用 GRPO 训练 retrieval policy(需要 GPU)
python -m memora.rl.grpo_trainer \
--config app/locomo/conf/config.yaml \
--output_dir ./grpo_output \
--model_name Qwen/Qwen2.5-3B-Instruct \
--num_train_epochs 5 \
--batch_size 4 \
--group_size 4 \
--learning_rate 1e-5 \
--checkpoint_every 10 \
--temperature 1.0
```
#### 使用训练好的策略进行推理
```
from memora import MemoraClient
client = MemoraClient(cfg=cfg, user_id="user_123")
# 使用 GRPO 训练的 policy 进行 retrieval
memories = client.advance_query(
context="What did we discuss about the project?",
query_type="grpo",
checkpoint_path="./grpo_output/final",
top_k=5,
)
```
#### 单独收集轨迹
```
python -m memora.rl.collect_trajectories \
--config app/locomo/conf/config.yaml \
--data_path app/locomo/data/locomo10.json \
--output trajectories.json
```
## 配置
LoCoMo 和 LongMemEval 实验均通过各自 `conf/` 目录中的 YAML 文件进行配置。你需要配置的关键设置包括:
| 设置 | 描述 |
|---------|-------------|
| `openai.api_type` | `"azure"` 或 `"openai"` |
| `openai.managed_identity` | Azure 托管标识客户端 ID(用于 `api_type: "azure"`) |
| `openai.api_key` | OpenAI API 密钥(用于 `api_type: "openai"`,或设置 `OPENAI_API_KEY` 环境变量) |
| `openai.llm_api_base` | 用于对话补全的 Azure OpenAI endpoint(例如,`https://.openai.azure.com/`) |
| `openai.embedding_api_base` | 用于 embedding 的 Azure OpenAI endpoint(可与 `llm_api_base` 相同) |
| `openai.embedding_api_version` | embedding 的 API 版本(例如,`2024-02-01`) |
| `openai.embedding_deployment_name` | embedding 模型的 Azure 部署名称 |
| `openai.embedding_model` | embedding 的模型名称(例如,`text-embedding-3-small`) |
**Azure 配置示例:**
```
export AZURE_OPENAI_ENDPOINT="https://.openai.azure.com/"
export AZURE_MANAGED_IDENTITY_CLIENT_ID=""
```
```
openai:
api_type: "azure"
managed_identity: "${oc.env:AZURE_MANAGED_IDENTITY_CLIENT_ID}"
llm_api_base: "${oc.env:AZURE_OPENAI_ENDPOINT}"
embedding_api_base: "${oc.env:AZURE_OPENAI_ENDPOINT}"
embedding_api_version: "2024-02-01"
embedding_deployment_name: "text-embedding-3-small"
embedding_model: "text-embedding-3-small"
```
**OpenAI 配置示例:**
```
export OPENAI_API_KEY="sk-..."
```
```
openai:
api_type: "openai"
api_key: "${oc.env:OPENAI_API_KEY}"
embedding_model: "text-embedding-3-small"
```
## 项目结构
```
Memora/
├── src/memora/ # Core Memora library
│ ├── core/ # Memory store, entry models, segmentation, cue indexing
│ ├── builder/ # Memory builders (chat, document)
│ ├── processors/ # Document processors (PDF, DOCX, Excel, Markdown, etc.)
│ ├── browser/ # Interactive memory store browser & viewer
│ ├── retriever/ # Retrieval strategies (semantic, prompted policy, local GRPO policy)
│ ├── rl/ # GRPO training (policy, trainer, trajectory collection & scoring)
│ ├── db_clients/ # Database backends (ChromaDB, Redis)
│ └── utils/ # Logging, LLM clients, helpers
├── app/
│ ├── locomo/ # LoCoMo benchmark experiments
│ └── longmemeval/ # LongMemEval benchmark experiments
├── quickstart.py # Quick start example
└── requirements.txt # Python dependencies
```
## 引用
如果你认为 Memora 对你有用,请引用我们的论文:
```
@misc{xia2026memoraharmonicmemoryrepresentation,
title={Memora: A Harmonic Memory Representation Balancing Abstraction and Specificity},
author={Menglin Xia and Xuchao Zhang and Shantanu Dixit and Paramaguru Harimurugan and Rujia Wang and Victor Ruhle and Robert Sim and Chetan Bansal and Saravan Rajmohan},
year={2026},
eprint={2602.03315},
archivePrefix={arXiv},
primaryClass={cs.AI},
url={https://arxiv.org/abs/2602.03315},
}
```
## 许可证
本项目基于 MIT 许可证授权 —— 详情请参阅 [LICENSE](LICENSE) 文件。
## 商标标签:AI智能体, DLL 劫持, Petitpotam, Python, TruffleHog, 人工智能, 大语言模型, 学术论文, 搜索引擎查询, 无后门, 用户模式Hook绕过, 记忆系统, 逆向工具