microsoft/Memora

Official code for the paper "Memora: A Harmonic Memory Representation Balancing Abstraction and Specificity"

GitHub에서 열기 ↗ llmllm-agentsmemory
188
GitHub 스타
17
포크
Python
언어
MIT
라이선스
2026.06.16
최근 푸시
2026.06.30
별표한 날

AI 분석

설치 난이도: 보통
큐레이터 노트
에이전트 메모리 관리에 혁신적인 접근법을 제시하는 연구 프로젝트로, 특히 메모리 추상화와 검색 정책 최적화에 관심이 있는 개발자나 연구자에게 유용합니다. 다만 프로덕션보다는 실험 및 프로토타이핑 용도에 적합합니다.

강점

  • 메모리 값과 추상화를 분리하는 독창적인 표현 방식으로, 세부 정보 손실 없이 구조화된 검색이 가능합니다.
  • 다양한 검색 전략(의미적, 프롬프트 기반, 하이브리드, GRPO)을 지원하여 유연성이 높습니다.
  • LoCoMo, LongMemEval 등 공인된 벤치마크 실험 코드를 포함하여 연구 재현성이 뛰어납니다.

약점

  • GRPO 기반 검색 정책은 실험적 단계로, 실제 프로덕션 환경에서의 안정성과 성능이 검증되지 않았습니다.
  • 벡터 데이터베이스로 ChromaDB만 기본 지원하며, 다른 DB(예: Pinecone, Weaviate)는 직접 구현해야 합니다.
  • 문서화가 비교적 상세하지만, 에이전트 통합 예제가 단순하여 복잡한 시나리오에서의 사용법이 부족할 수 있습니다.

주의사항

  • Azure OpenAI 의존성이 강하며, OpenAI API 사용 시에도 특정 설정이 필요하므로 클라우드 비용이 발생할 수 있습니다.
  • 프로젝트가 아직 초기 단계(별 73개, 포크 3개)로, API 변경 가능성이 있습니다.
  • 논문이 2026년에 발표된 최신 연구이므로, 커뮤니티 피드백과 추가 검증이 필요합니다.

시작 가이드

  • README의 quickstart.py 예제를 실행하여 기본 메모리 저장 및 검색 흐름을 체험해보세요.
  • LoCoMo 또는 LongMemEval 벤치마크를 실행하여 Memora의 성능을 기존 RAG 방식과 비교해보세요.
  • GRPO 훈련 파이프라인을 GPU 환경에서 시험해보고, 자체 데이터로 검색 정책을 미세 조정해보세요.

README 한국어 번역

이 번역은 AI가 원문 README를 옮긴 것입니다. 원문이 항상 우선합니다.

Memora: 추상화와 구체성의 균형을 이루는 조화로운 메모리 표현

소개

Memora는 에이전트 메모리 관리의 골칫거리를 해결하기 위해 설계되었습니다. 에이전트는 언제 무엇을 저장할지, 또는 적절한 순간에 올바른 메모리를 어떻게 가져올지 고민하는 대신 Memora에 모든 것을 맡길 수 있습니다. 사용하기 쉬운 프레임워크를 제공함으로써 Memora는 개발자를 저수준 메모리 관리에서 해방시키고 지능형 메모리를 내장된 기능으로 만듭니다.

📄 논문: Memora: A Harmonic Memory Representation Balancing Abstraction and Specificity

Memora의 차별점

Memora는 저장되는 내용과 저장 방식 및 접근 방식을 분리하는 조화로운 메모리 표현을 도입하여 RAG 파이프라인, 플랫 메모리 저장소, 그래프 기반 지식 베이스와 차별화됩니다. 모든 메모리 콘텐츠를 직접 인덱싱하는 대신, Memora는 기본 데이터를 제약하지 않으면서 메모리 위에 구조를 제공하는 스캐폴딩 레이어(기본 추상화 및 큐 앵커 사용)를 구축합니다.

  • 메모리 값(인덱싱되지 않음): 전체 저장 정보로, 압축이나 손실 없이 세부 사항을 보존합니다.
  • 기본 추상화(인덱싱됨): 메모리가 무엇에 관한 것인지 포착하는 일대일 요약이며, 업데이트 및 집계의 표준 단위 역할을 합니다.
  • 큐 앵커(인덱싱됨): 여러 의미적 진입점(예: ++)으로, 다대다 구조를 통해 관련 메모리를 연결합니다.

이 설계의 핵심은 각 메모리 항목의 표현으로, 세 가지 구성 요소로 이루어집니다:

중요한 점은 기본 추상화와 큐 앵커만 인덱싱되고 메모리 값 자체는 인덱싱되지 않는다는 것입니다. 이를 통해 Memora는 원시 콘텐츠를 임베딩하거나 인덱싱할 때 일반적으로 발생하는 모호함 없이 풍부하고 충실도 높은 정보를 유지할 수 있습니다. 동시에 추상화 레이어는 메모리를 구성하고 접근하는 구조화된 방법을 제공하여 비정형 데이터에 대한 유사성 검색에 의존하지 않고 잘 정의된 표현을 통해 검색을 안내합니다.

결과적으로 Memora는 그래프 기반 접근 방식보다 유연하면서도 강력한 조직 구조를 제공합니다. 저장된 메모리의 세부 사항을 보존하는 동시에 가벼운 추상화를 사용하여 해당 정보에 대한 더 정밀하고 제어된 접근을 가능하게 합니다.

주요 기능

  • 가벼운 통합:
  • 구조화된 메모리 표현:
  • 공유 메모리 공간:
  • 다양한 메모리 유형 지원:
  • 제어된 접근 및 격리:
  • 유연한 스토리지 백엔드:

기존 에이전트 시스템에 최소한의 변경만으로 연결할 수 있도록 설계되어 메모리 처리의 완전한 재설계가 필요하지 않습니다. 메모리 값과 추상화를 명확히 분리하여 시간이 지남에 따라 일관된 업데이트, 중복 제거 및 구성을 가능하게 합니다. 동일한 환경 내에서 여러 에이전트가 접근할 수 있는 통합 메모리 레이어를 지원하여 지식의 조정과 재사용을 가능하게 합니다. 메모리 값과 추상화가 구성되는 방식에 따라 사실적, 일화적, 절차적 메모리 등 다양한 형태의 메모리를 표현할 수 있습니다. 에이전트 또는 역할 간에 메모리 범위를 지정하고 관리할 수 있어 프라이버시와 선택적 공유를 지원합니다. 메모리 표현을 특정 인프라에 강하게 결합하지 않고 다양한 스토리지 설정(로컬 또는 원격)과 호환됩니다.

Memora 작동 방식

Memora는 AI 에이전트를 위한 완전한 메모리 생애주기를 제공합니다:

  1. 메모리 수집 — 에이전트가 대화나 문서를 처리할 때 Memora는 관련 사실, 에피소드 및 절차적 지식을 자동으로 추출합니다. 대화를 주제별 에피소드로 분할하고 핵심 정보를 구조화된 메모리 항목으로 추출합니다.
  1. 지능형 저장 — 메모리는 의미적 임베딩과 함께 벡터 데이터베이스(ChromaDB)에 저장됩니다. Memora는 기존 메모리를 중복 제거, 병합 및 업데이트하여 저장소를 깨끗하고 최신 상태로 유지합니다. 선택적 큐 인덱스는 고수준 큐를 메모리에 매핑하여 빠르고 구조화된 조회를 제공합니다.
  1. 적응형 검색 — 쿼리 시 Memora는 여러 검색 전략을 지원합니다:
  • 의미적 — 메모리 저장소에 대한 벡터 유사성 검색
  • 프롬프트 기반 — LLM이 안내하는 다단계 검색 정책으로 검색을 반복적으로 정제
  • 하이브리드 — 의미적 검색과 BM25/키워드 매칭을 결합하여 재현율 향상
  • GRPO (실험적) — GRPO(Group Relative Policy Optimization)를 통해 훈련된 강화 학습 기반 검색 정책
  1. 답변 생성 — 검색된 메모리가 포맷되어 LLM 프롬프트에 주입되어 근거 기반의 맥락 인식 응답을 생성합니다.

설치

사전 요구 사항: 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)

에이전트에서 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):
        # 관련 메모리 검색
        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

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

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를 참조하세요.

GRPO 실험 (실험적)

Memora는 GRPO(Group Relative Policy Optimization)를 통해 검색 정책 훈련을 지원합니다. 이는 강화 학습을 사용하여 주어진 쿼리에 대해 어떤 메모리를 검색할지 학습하며, 프롬프트 기반 LLM 호출을 미세 조정된 로컬 모델(예: LoRA를 사용한 Qwen 3B/7B)로 대체합니다.

  1. 궤적 수집 — 현재 정책을 사용하여 검색 궤적 샘플링
  2. 궤적 점수화 — 근거 기반, 중복성 및 비용을 기준으로 궤적 점수화
  3. 정책 훈련 — 그룹 상대적 이점을 사용하여 GRPO로 검색 정책 훈련

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의 후원을 암시해서는 안 됩니다.

원본 저장소: microsoft/Memora

라이선스: MIT

게재 제외를 원하시면 삭제 요청을 보내주세요.