Official code for the paper "Memora: A Harmonic Memory Representation Balancing Abstraction and Specificity"
이 번역은 AI가 원문 README를 옮긴 것입니다. 원문이 항상 우선합니다.
Memora는 에이전트 메모리 관리의 골칫거리를 해결하기 위해 설계되었습니다. 에이전트는 언제 무엇을 저장할지, 또는 적절한 순간에 올바른 메모리를 어떻게 가져올지 고민하는 대신 Memora에 모든 것을 맡길 수 있습니다. 사용하기 쉬운 프레임워크를 제공함으로써 Memora는 개발자를 저수준 메모리 관리에서 해방시키고 지능형 메모리를 내장된 기능으로 만듭니다.
📄 논문: Memora: A Harmonic Memory Representation Balancing Abstraction and Specificity
Memora는 저장되는 내용과 저장 방식 및 접근 방식을 분리하는 조화로운 메모리 표현을 도입하여 RAG 파이프라인, 플랫 메모리 저장소, 그래프 기반 지식 베이스와 차별화됩니다. 모든 메모리 콘텐츠를 직접 인덱싱하는 대신, Memora는 기본 데이터를 제약하지 않으면서 메모리 위에 구조를 제공하는 스캐폴딩 레이어(기본 추상화 및 큐 앵커 사용)를 구축합니다.
+ 및 +)으로, 다대다 구조를 통해 관련 메모리를 연결합니다.이 설계의 핵심은 각 메모리 항목의 표현으로, 세 가지 구성 요소로 이루어집니다:
중요한 점은 기본 추상화와 큐 앵커만 인덱싱되고 메모리 값 자체는 인덱싱되지 않는다는 것입니다. 이를 통해 Memora는 원시 콘텐츠를 임베딩하거나 인덱싱할 때 일반적으로 발생하는 모호함 없이 풍부하고 충실도 높은 정보를 유지할 수 있습니다. 동시에 추상화 레이어는 메모리를 구성하고 접근하는 구조화된 방법을 제공하여 비정형 데이터에 대한 유사성 검색에 의존하지 않고 잘 정의된 표현을 통해 검색을 안내합니다.
결과적으로 Memora는 그래프 기반 접근 방식보다 유연하면서도 강력한 조직 구조를 제공합니다. 저장된 메모리의 세부 사항을 보존하는 동시에 가벼운 추상화를 사용하여 해당 정보에 대한 더 정밀하고 제어된 접근을 가능하게 합니다.
기존 에이전트 시스템에 최소한의 변경만으로 연결할 수 있도록 설계되어 메모리 처리의 완전한 재설계가 필요하지 않습니다. 메모리 값과 추상화를 명확히 분리하여 시간이 지남에 따라 일관된 업데이트, 중복 제거 및 구성을 가능하게 합니다. 동일한 환경 내에서 여러 에이전트가 접근할 수 있는 통합 메모리 레이어를 지원하여 지식의 조정과 재사용을 가능하게 합니다. 메모리 값과 추상화가 구성되는 방식에 따라 사실적, 일화적, 절차적 메모리 등 다양한 형태의 메모리를 표현할 수 있습니다. 에이전트 또는 역할 간에 메모리 범위를 지정하고 관리할 수 있어 프라이버시와 선택적 공유를 지원합니다. 메모리 표현을 특정 인프라에 강하게 결합하지 않고 다양한 스토리지 설정(로컬 또는 원격)과 호환됩니다.
Memora는 AI 에이전트를 위한 완전한 메모리 생애주기를 제공합니다:
사전 요구 사항: Python >= 3.10
# 소스에서 설치
git clone https://github.com/microsoft/Memora
cd Memora
pip install -e.
전체 실행 가능한 예제는 quickstart.py를 참조하세요.
from memora.memora_client import MemoraClient
# 설정으로 초기화 (설정 구성은 quickstart.py 참조)
memory_client = MemoraClient(cfg=cfg, user_id="my_user")
# 메모리에 컨텍스트 추가
memory_client.add("Alice is moving to Seattle for a new job.", type="doc")
# 메모리 쿼리 (의미적 검색)
results = memory_client.query("Where is Alice moving?", top_k=5)
for entry in results:
print(f"{entry.index}: {entry.value}")
# 프롬프트 기반 검색 정책을 사용한 고급 쿼리
results = memory_client.advance_query("Where is Alice moving?", query_type="prompt", top_k=5)
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):
# 관련 메모리 검색
memories = self.memory_client.query(user_message, top_k=5)
# 에이전트 로직
response =...
# 대화를 메모리에 저장
conversation = f"User: {user_message}\nAssistant: {response}"
self.memory_client.add(conversation, type="doc")
return response
Memora는 두 가지 확립된 벤치마크를 위한 실험 러너를 포함합니다. 둘 다 Hydra를 구성에 사용하며, 모든 매개변수를 명령줄에서 재정의할 수 있습니다.
LoCoMo 벤치마크는 단일 홉, 다중 홉, 시간적, 개방형 도메인 질문 유형에 걸쳐 긴 대화 메모리를 평가합니다.
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를 참조하세요.
LongMemEval 벤치마크는 여러 질문 유형에 걸쳐 장기 메모리 능력을 테스트합니다.
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를 참조하세요.
Memora는 GRPO(Group Relative Policy Optimization)를 통해 검색 정책 훈련을 지원합니다. 이는 강화 학습을 사용하여 주어진 쿼리에 대해 어떤 메모리를 검색할지 학습하며, 프롬프트 기반 LLM 호출을 미세 조정된 로컬 모델(예: LoRA를 사용한 Qwen 3B/7B)로 대체합니다.
GRPO 파이프라인은 다음으로 구성됩니다:
# GRPO로 검색 정책 훈련 (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 훈련 정책을 사용한 검색
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 Managed Identity 클라이언트 ID (api_type: "azure"의 경우) |
||
openai.api_key |
OpenAI API 키 (apitype: "openai"의 경우, 또는 OPENAIAPI_KEY 환경 변수 설정) |
||
openai.llmapibase |
채팅 완성을 위한 Azure OpenAI 엔드포인트 (예: https://.openai.azure.com/) |
||
openai.embeddingapibase |
임베딩을 위한 Azure OpenAI 엔드포인트 (llmapibase와 동일할 수 있음) |
||
openai.embeddingapiversion |
임베딩을 위한 API 버전 (예: 2024-02-01) |
||
openai.embeddingdeploymentname |
임베딩 모델의 Azure 배포 이름 | ||
openai.embedding_model |
임베딩을 위한 모델 이름 (예: text-embedding-3-small) |
Azure 설정 예시:
export AZURE_OPENAI_ENDPOINT="https://<your-resource>.openai.azure.com/"
export AZURE_MANAGED_IDENTITY_CLIENT_ID="<your-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/ # 핵심 Memora 라이브러리
│ ├── core/ # 메모리 저장소, 항목 모델, 세분화, 큐 인덱싱
│ ├── builder/ # 메모리 빌더 (채팅, 문서)
│ ├── processors/ # 문서 프로세서 (PDF, DOCX, Excel, Markdown 등)
│ ├── browser/ # 대화형 메모리 저장소 브라우저 및 뷰어
│ ├── retriever/ # 검색 전략 (의미적, 프롬프트 기반 정책, 로컬 GRPO 정책)
│ ├── rl/ # GRPO 훈련 (정책, 트레이너, 궤적 수집 및 점수화)
│ ├── db_clients/ # 데이터베이스 백엔드 (ChromaDB, Redis)
│ └── utils/ # 로깅, LLM 클라이언트, 도우미
├── app/
│ ├── locomo/ # LoCoMo 벤치마크 실험
│ └── longmemeval/ # LongMemEval 벤치마크 실험
├── quickstart.py # 빠른 시작 예제
└── requirements.txt # Python 종속성
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},
}
이 프로젝트에는 프로젝트, 제품 또는 서비스의 상표 또는 로고가 포함될 수 있습니다. Microsoft 상표 또는 로고의 승인된 사용은 Microsoft의 상표 및 브랜드 지침을 따라야 합니다. 수정된 버전에서 Microsoft 상표 또는 로고를 사용하는 경우 혼동을 일으키거나 Microsoft의 후원을 암시해서는 안 됩니다.