에이전트가 작업을 반복할 때, 이전 경험을 기억하면 더 잘합니다.
하지만 "기억"이라고 해서 모두 같은 것은 아닙니다. 단순한 로그 저장과 학습하는 메모리는 다릅니다.
Hindsight은 후자를 구현합니다. GitHub에서 58,000개 이상의 스타를 받은 이 프로젝트는 에이전트 메모리를 단순한 데이터 저장이 아닌, 생물학적 영감을 받은 데이터 구조로 설계했습니다.
Biomimetic 메모리 구조
Hindsight의 메모리는 인간의 기억 방식을 모방합니다.
Human Memory Model Hindsight Implementation
───────────────── ────────────────────────
World Facts ──▶ World facts (사실, 정의)
Experiences ──▶ Experiences (경험, 사건)
Observations ──▶ Observations (관찰, 패턴)
Mental Models ──▶ Mental models (추상화, 규칙)
각 메모리 타입은 서로 다른 수명 주기와 검색 전략을 가집니다.
World facts: 영구적, 자주 업데이트됨
Experiences: 반영구적, 특정 컨텍스트에 종속
Observations: 반영구적, 패턴 기반
Mental models: 장기적, 드물게 업데이트
Retain → Recall → Reflect: 세 가지 연산
Hindsight의 핵심 API는 세 가지 연산으로 구성됩니다.
Retain → 메모리에 저장 (write)
Recall → 관련 메모리 검색 (read)
Reflect → 기존 메모리에 대한 심층 분석 (analyze)
Retain: 저장
from hindsight import HindsightClient
client = HindsightClient()
# 월드 팩트 저장
await client.retain("my-bank", "Alice loves hiking in Yosemite")
# 경험 저장
await client.retain("my-bank", "Alice asked about mortgage rates on 2026-10-15")
메모리는 뱅크(bank) 단위로 조직됩니다. 각 뱅크는 사용자나 프로젝트별로 분리됩니다.
Recall: 검색 — 4가지 전략의 병렬 실행
Hindsight의 가장 기술적으로 흥미로운 부분은 Recall입니다. 네 가지 병렬 검색 전략을 사용하고, 결과를 하나의 순위로 통합합니다.
Recall Query: "What does Alice like?"
│
├── Semantic Search (벡터) ──┐
├── Keyword Search (BM25) ├── Reciprocal Rank Fusion ──▶ 최종 순위
├── Graph Search (엔티티) │
└── Temporal Search (시간) ─┘
각 전략의 역할:
| 전략 | 방법 | 강점 | 약점 |
|---|---|---|---|
| Semantic | 벡터 유사도 | 의미적 관련성 | 정확한 키워드 누락 가능 |
| Keyword | BM25 | 정확한 매칭 | 의미적 관련성 부족 |
| Graph | 엔티티/시간/인과 그래프 | 구조적 관계 | 그래프 구축 비용 |
| Temporal | 시간 범위 필터링 | 시계열 정확도 | 시간 정보 없는 메모리 무용 |
Reciprocal Rank Fusion (RRF)
네 전략의 결과를 통합하는 방법은 Reciprocal Rank Fusion입니다.
RRF 점수 = Σ 1 / (k + rank_i)
여기서 k는 상수(일반적으로 60), rank_i는 각 전략에서의 순위.
예시:
메모리 A: Semantic 1위, Keyword 5위 → 1/61 + 1/65 = 0.031
메모리 B: Semantic 3위, Keyword 2위 → 1/63 + 1/62 = 0.032
메모리 B가 약간 우세 — 두 전략에서 모두 상위권이기 때문.
RRF는 각 전략의 절대 점수가 아니라 상대 순위만 사용합니다. 이는 서로 다른 스코어링 시스템을 가진 전략들을 공정하게 비교할 수 있게 합니다.
Reflect: 심층 분석
Reflect는 기존 메모리를 바탕으로 한 심층 분석 연산입니다. 단순한 검색이 아니라, 메모리 간의 관계를 파악하고 새로운 통찰을 생성합니다.
# Alice의 행동 패턴 분석
reflection = await client.reflect("my-bank", """
Analyze Alice's financial behavior patterns.
What are her priorities and concerns?
""")
# 결과: "Alice는 주택 구매에 관심이 많으며,
# 이자율 변동에 민감하게 반응함.
# 2026년 10월 이후 대출 관련 문의 증가 중."
이 기능은 단순 RAG 시스템에는 없는 Hindsight만의 차별점입니다.
아키텍처: 자체 호스팅 가능
Hindsight은 Docker, pip(베어 메탈), 임베디드 DB(pg0) 세 가지 방식으로 배포할 수 있습니다.
Docker 배포:
hindsight-server (메인 서비스)
├── Retention Service (저장)
├── Recall Service (검색)
├── Reflect Service (분석)
└── Storage Backend (PostgreSQL + pgvector)
임베디드 모드:
pip install hindsight-all
# 서버 없이 Python에서 직접 사용
LiteLLM 통합을 통해 100개 이상의 모델을 지원합니다. 이는 Hindsight가 다양한 LLM 생태계와 호환될 수 있게 합니다.
60+ 통합 — 이미지의 힘
Hindsight는 Claude Code, Codex, Cursor, LangGraph, CrewAI, n8n 등 60개 이상의 도구와 통합됩니다.
┌── Claude Code
├── Codex
├── Cursor
├── LangGraph
├── CrewAI
├── n8n
사용자 데이터 ──┤ ... (60+ 통합)
├── OpenHands
├── AutoGen
├── LangChain
├── LlamaIndex
└── ...
이 통합 생태계가 Hindsight의 58k 스타를 견인하는 주요 요인입니다.
한계와 고려사항
- 그래프 검색 오버헤드: Graph Search를 활성화하려면 엔티티 추출과 그래프 구축이 필요합니다. 초기 설정 비용이 큽니다.
- 메모리 성장: Retain만 반복하면 메모리가 무한히 커집니다. 정리(policy)가 필요합니다.
- Reflect 비용: Reflect 연산은 LLM 호출을 수반하므로, 빈번한 실행에는 비용이 발생합니다.
- Self-hosted 복잡성: Docker 배포는 비교적 쉽지만, 베어 메탈(pip) 설치에는 플랫폼별 주의가 필요합니다. Intel Mac은
hindsight-all-slim이 필요합니다.
개발자 테이크어웨이
에이전트 메모리를 설계할 때 가장 중요한 질문은 세 가지입니다.
1. 무엇을 기억하는가? 월드 팩트, 경험, 관찰, 멘탈 모델 — 각각 다른 수명과 검색 전략이 필요합니다.
2. 어떻게 찾는가? 단일 검색 전략(벡터만)으로는 부족합니다. Semantic + Keyword + Graph + Temporal의 4전략 병렬 검색이 실제 사용 사례에서 더 나은 결과를 냅니다.
3. 어떻게 학습하는가? 단순 검색을 넘어 Reflect 연산으로 메모리 간의 관계를 분석해야, 에이전트가 진정한 의미의 "학습"을 할 수 있습니다.
Hindsight는 이 세 가지를 모두 제공합니다. 58k 스타는 단순한 인기 숫자가 아니라, 에이전트 메모리에 대한 시장의 명확한 요구를 나타냅니다.