
자신의 기억에 도전하는 Qwen MemoryAgent를 구축했습니다
요약
Qwen 모델과 pgvector를 활용하여 에이전트의 기억 충돌 문제를 해결하는 Archon MemoryAgent를 소개합니다. 이 시스템은 세션 간 데이터 불일치를 감지하고 스스로를 감사하는 셀프 감사(self-audit) 기능을 통해 기억의 신뢰성을 높입니다.
핵심 포인트
- 에이전트의 세션 간 기억 충돌 및 데이터 불일치 문제 해결
- Qwen 모델과 pgvector 기반의 메모리 레이어 구축
- 기억의 일관성을 유지하기 위한 셀프 감사(self-audit) 메커니즘 도입
- 신뢰 경계(trust boundary)를 고려한 아키텍처 설계
Qwen Cloud와 함께하는 Global AI Hackathon Series, MemoryAgent 트랙.
영어 내레이션, 자막 삽입, 다운로드 가능한 영어 자막 트랙이 포함되어 있습니다.
대부분의 "에이전트 기억 (agent memory)" 데모는 한 가지 유용한 사실을 증명합니다. 에이전트가 한 세션에서 사실을 기록하고 다른 세션에서 이를 다시 읽을 수 있다는 점입니다. 이는 중요하지만, 문제의 절반에 불과합니다. 우리는 에이전트 자신의 기억이 자기 자신과 충돌하기 (disagree with itself) 시작할 때 어떤 일이 발생하는지 알고 싶었습니다.
세션 간 에이전트 (cross-session agent)는 며칠에 걸쳐, 여러 프로세스에 걸쳐, 많은 개별 쓰기 이벤트로부터 사실을 축적합니다. 그 쓰기 작업 중 두 개가 동일한 기록을 서로 다른 방식으로 남기는 것을 막을 방법은 없습니다. 원래의 합성 데모(synthetic demo)에서는 서로 다른 세션이 동일한 INV-5521.amount 필드에 서로 다른 값을 할당합니다. 일반적인 벡터 스토어 (vector store)는 충돌을 드러내지 않은 채, 우연히 순위가 더 높게 매겨진 것을 반환할 수 있습니다. 호출자는 충돌하는 출처 (provenance) 없이 확신에 찬 답변을 보게 됩니다.
Archon MemoryAgent는 MemoryAgent 트랙을 위해 제출한 우리의 결과물로, Alibaba Cloud에서 라이브로 실행되며, pgvector 메모리 레이어와 함께 Qwen (text-embedding-v4 + qwen-plus)을 기반으로 구축되었습니다. 세션 간 지속성 (cross-session persistence)이 구현되어 있으며, 차별화된 부분은 셀프 감사 (self-audit)입니다. 즉, 기억이 스스로를 감사합니다.
신뢰 경계 (trust boundary)를 포함한 아키텍처
이 다이어그램은 인제스션 파이프라인 (ingestion pipeline), MemoryAgent 코어, 그리고 Qwen Cloud / Alibaba Cloud 통합을 보여줍니다:

신뢰 경계(trust boundary)는 모델 그래프만큼이나 중요합니다. 공개 영역(public surface)은 고정된, 멱등성(idempotent)을 가진 데모와 공개 테넌트(public-tenant) 읽기 기능으로 구성되며, 공개 시드(public seed) 및 회상(recall)은 할당량(quota) 제한을 받습니다. 쓰기(Writes), 피드백, 라이프사이클 작업, 의미 수준 감사(meaning-level audit), 그리고 스트리밍 가능한 HTTP MCP는 인증을 거치며 서버에 의해 테넌트(tenant)로 매핑됩니다. 이벤트 연결기(event linker)는 company + period + event_ref 단위로 그룹화하며, 손익(P&L) 합계는 통화별로 분리되어 유지됩니다.
위의 심사위원용 이미지는 표준 16:9 제출용 히어로(hero) 이미지입니다. 편집 가능한 소스는 docs/judge-architecture.svg에 공개되어 있으며, 더 상세한 기술 부록과 그 PNG/SVG 렌더링 파일은 docs/architecture.mmd로부터 생성됩니다.
핵심 아이디어: 탐지, 설명, 권장
이 에이전트는 자신의 활성 기억(active memories)에 대해 순수하고 도메인 중립적인 감사를 수행하는 POST /consistency를 노출합니다. 에이전트는 기억을 그것이 설명하는 레코드(명시적인 레코드 ID 또는 기원인 sourceRef; 허위 충돌을 만들어낼 수 있는 거친 형태의 company/period 키는 절대 사용하지 않음)별로 그룹화하며, 기억 고유의 두 가지 문제를 플래그(flag)로 표시합니다:
- 모순 (Contradiction): 두 개의 쓰기 이벤트가 동일한 레코드의 동일한 속성에 서로 다른 값을 할당하는 경우입니다. 각 기억은 자체적인 쓰기 타임스탬프(write timestamp)를 가지고 있기 때문에, 모순은 말 그대로 레코드를 서로 다르게 기억한 두 세션 사이의 문제입니다.
- 부재 (Absence): 어떤 기억이 어떠한 기억에도 저장되지 않은 다른 레코드를 참조하는 경우입니다. 즉, 매달린 참조(dangling reference) 또는 에이전트가 실제로 캡처하지 못한 예상되는 대응물(counterpart)을 의미합니다.
탐지(Detection)만으로는 호출자(caller)에게 다음에 무엇을 해야 할지 알려주지 않습니다. 두 값이 일치하지 않을 때, 즉각적인 질문은 _'어느 것을 신뢰해야 하는가?'_입니다. 모든 모순에 대해, 감사(audit)는 또한 **해결 권장 사항(resolution recommendation)**을 출력합니다: { recommendedMemoryId, recommendedValue, rule, confidence, rationale }. 이는 이미 메모리에 저장된 신호들에 대해 고정된 우선순위 사다리(priority ladder)를 통해 결정됩니다. 여기에는 새로운 데이터나 도메인 규칙서(rulebook)를 사용하지 않습니다:
- 중요도 (importance): 명시적으로 플래그가 지정된 높은 현저성(high-salience)을 가진 메모리는 플래그가 없는 이후의 쓰기(write)보다 우선합니다.
- 출처 권위 (source-authority): 원시 값(raw value)에 대해 구조화된 기록(structured record)은 파생된 서사적 노트(derived narrative note)보다 우선합니다.
- 최신성 (recency) (기본값): 그렇지 않은 경우, 나중에 작성된 쓰기가 승리합니다. 최신 세션이 이전 세션을 수정했을 것으로 가정하기 때문입니다.
그 결과는 **지상 실재(ground truth)가 아닌 권장 사항(recommendation)**입니다. 감사는 어떤 쓰기가 실제로 정확했는지 알 수 없으며, 단지 방어 가능한 정책(defensible policy)이 어느 쪽을 선호하는지만 보여줄 수 있습니다. 이는 절대로 메모리를 변형(mutate)하지 않습니다. 불일치를 표면화하고, 신뢰도(confidence) 및 한 줄의 근거(rationale)와 함께 한쪽을 권장하며, 호출자가 결정하도록 합니다. 이러한 분리는 의도적인 것입니다. 메모리는 불일치를 숨기는 대신 스스로의 불일치를 보고합니다.
_의미(meaning)_의 모순 또한
위의 감사(audit)는 메타데이터 필드를 비교하기 때문에, 비교 가능한 키를 공유하지 않으면서 의미(meaning) 측면에서 서로 상충하는 메모리에는 무지합니다. 예를 들어, _"공급업체는 항상 제때 결제한다"_와 _"공급업체는 만성적으로 결제가 늦다"_와 같은 경우입니다. 두 메모리 모두 비교할 수 있는 수치적 속성을 가지고 있지 않으므로, 필드 수준의 감사(field-level audit)는 아무것도 그룹화하지 않고 'OK'를 보고합니다. 즉, 불일치가 전적으로 산문(prose) 속에 존재하게 됩니다. 이를 보완하는 의미론적(semantic) 감사(POST /consistency/semantic, src/memory/semantic-consistency.ts)가 이 간극을 메웁니다. 이 방식은 각 메모리를 동일한 text-embedding-v4 회상(recall) 경로로 임베딩하고, 코사인 유사도(cosine similarity)를 통해 동일 주제 쌍만 유지한 다음, 구성된 QWEN_JUDGE_MODEL에게 이들이 직접적으로 모순되는지 온라인으로 질문합니다(qwen-plus가 롤백 기준점(rollback baseline)이며, 후보는 버전 관리된 승격 게이트(versioned promotion gate)를 통과한 후에만 자격을 얻습니다). 오프라인에서는 결정론적인 극성/부정 휴리스틱(deterministic polarity/negation heuristic)을 사용하여 키가 없는 상태에서도 CI에서 감사가 실행될 수 있도록 합니다. 라이브 Explorer에서 심판(judge)은 실행 전 범위를 확인합니다: maxPairs: 1 설정 시, 가장 유사도가 높은 하나의 적격한 insight 쌍만 확인합니다. 더 넓은 범위의 API는 호출자 제한(caller-bounded)을 유지합니다. 온라인 심판은 실패 시 차단(fails closed) 방식으로 작동합니다. 즉, 모든 오류나 파싱 불가능한 응답은 오류 메타데이터와 함께 명시적인 inconclusive(결론 불능) 결과를 반환하며, 결코 충돌이 없는 깨끗한 결과로 위장하거나 모순을 지어내지 않습니다. 이 심판은 **동일한 읽기 전용 해결 사다리(read-only resolution ladder)**를 재사용하며, 규칙 기반 경로와 마찬가지로 절대로 메모리를 변형(mutate)하지 않습니다. 이는 필드 수준 엔진과 병렬로 실행되는 추가적인 점검 방식이며, 어느 경로도 대체하지 않습니다. 이 기능은 인증 및 할당량 제한이 적용되는 HTTP 및 HTTP MCP(audit_memory 도구가 semantic: true를 인자로 받음)를 통해 노출되며, 고정된 모순 쌍은 공개된 멱등적(idempotent) 데모 시드에 심어져 있어 에이전트가 자신의 메모리 내에서 의미 수준의 모순을 포착하는 것을 직접 확인할 수 있습니다. 이러한 증거에는 한계가 있습니다. 우리는 라이브 데모에서 메커니즘을 보여줄 수 있으며, 점수가 매겨진 결정론적 픽스처(deterministic fixture)를 오프라인에서 재현할 수 있습니다.
과거의 온라인 실험들은 출처에 대한 주의 사항과 함께 기술 부록(technical appendix)에 남아 있으며, 여기서는 깔끔한 출시 증거로서 제시되지 않습니다.
오프라인에서 재현 가능한 측정치
메모리 품질에 대한 주장은 증거가 필요합니다. 아래의 결정론적(deterministic) 주장들은 라이브 제공자 호출 없이 커밋된 픽스처(fixtures)로부터 재현 가능하며, CI(지속적 통합)에서 제어됩니다.
검색 (Retrieval). 고정된 다양한 수동 라벨링 코퍼스(corpus) 상의 실제 text-embedding-v4 임베딩(embeddings)에 대해, 우리의 reranked-hybrid 검색기(밀집(dense) + 상호 순위 융합(Reciprocal Rank Fusion)으로 결합된 어휘적(lexical) 방식, 이후 후보 집합에 대해 제한된 qwen-plus 리스트와이즈(listwise) 재순위화(rerank) 적용)는 이 고정된 코퍼스의 세 가지 보고된 지표에서 강력한 단일 벡터 밀집(single-vector dense) 조건보다 우수한 성능을 보입니다:
| 지표 (Metric) | 밀집 베이스라인 (dense baseline) | reranked-hybrid |
|---|---|---|
| MRR | 0.883 | 0.911 |
| ... |
밀집 조건은 LangChain의 VectorStoreRetriever에 문서화된 일반적인 유사도 모드와 유사한, 명시적이고 재현 가능한 단일 벡터 코사인(cosine) 대조군입니다. 이는 제품 간의 직접 비교나 모든 시스템의 현재 기본 설정에 대한 주장이 아닙니다.
하이브리드(Hybrid) 방식 단독으로는 깨끗한 코퍼스의 상위 순위 정렬에서 현대적인 임베더(embedder)를 이기지 못합니다. 그 결과 때문에 우리는 제한된 Qwen 리스트와이즈 재순위화를 추가했으며, 코퍼스를 중복 데이터 쪽으로 다시 튜닝하는 대신 해당 결과가 없음을(null result) 보고했습니다. 의미가 뒤섞인(meaning-shuffled) 대조군 검색기는 거의 확률 수준으로 무너지며, 이는 벤치마크가 실제로 의미론(semantics)을 구별해낸다는 것을 증명합니다. CI 주장은 픽스처에 국한됩니다: 커밋된 라벨링된 검색 픽스처에서, 하이브리드 Recall@3 및 Recall@5는 반드시 밀집(dense) 재현율(recall)만큼 높게 유지되어야 합니다. 이는 보지 못한 코퍼스에 대한 보편적인 주장이 아닙니다.
자가 감사 (Self-audit). 주입된 충돌(injected conflicts)이 포함된 라벨링된 데이터셋과 일관된 대조군 세트(동의하는 재-수집(re-ingests), 부동 소수점 노이즈(float-noise), 속성 이름을 공유하는 별개의 레코드)에 대해:
5 / 5 주입된 문제 감지, 오탐률 0: 100% 탐지율(detection), 100% 정밀도(precision)를 달성했습니다. 대조군 세트(control set)가 중요한 이유는 감사 과정이 충돌처럼 보이기만 하는 것들에 대해서는 _침묵_을 유지하는지 확인하기 때문입니다.
해결. 선언된 중요도 → 권한 → 최신성 정책을 인코딩한 네 가지 사례에 대해:
**4 / 4 선언된 정책 준수(선택된 메모리 + 규칙)**를 달성했으며, 구조적 불변량(모든 모순이 해결되고, 추천 사항은 실제 메모리를 가리키며, 신뢰도가 [0,1] 범위 내에 있음)도 강제되었습니다.
이는 정책 준수(policy-conformance)를 측정하는 것이지, 정책 최적성(policy-optimality)을 측정하는 것이 아닙니다. 100%라는 결과는 추천 시스템이 자신이 명시하고 방어할 수 있는 정책을 충실히 구현했음을 의미할 뿐, 그 정책 자체가 보편적으로 옳다는 것을 의미하지 않습니다. 따라서 이는 신뢰도를 가진 추천 사항으로 남으며, 결코 자동 편집(automatic edit)이 아닙니다.
지속성(Persistence)이란 새로운 탭이 아니라 새로운 프로세스를 의미합니다
이 추적 기능은 여전히 진정한 세션 간 지속성을 요구합니다. 저희의 엔드투엔드 테스트는 메모리를 세션 A에서 작성한 후, 해당 프로세스를 완전히 종료하고(풀을 닫고; 인프로세스에 아무것도 남지 않음), 새 인스턴스와 공유된 상태가 없는 새로운 세션 B를 통해 의미로 그 메모리들을 회상하고 근거를 제시하며 인용된 qwen-plus 답변을 서술합니다. 두 세션 사이에 공유되는 유일한 것은 데이터베이스뿐입니다. 이것이
출시된 금융 증빙(financial proof) 기능은 두 가지 명시적인 입력을 받습니다: 급여 대장(payroll register), 은행 확인서(bank confirmation), 급여 명세서(payslips)를 통합하는 문서 파이프라인과 매입/매출 송장(purchase/sales invoices)을 위한 엄격한 JSON 경로입니다. 이러한 기억(memories)을 바탕으로, 시스템은 출처와 연결된 급여 총액, 매입, 매출, 알려진/알려지지 않은 현금, 그리고 통화별(per currency) 순이익을 보고합니다. 통화가 혼합되어 있는 경우, 최상위 화폐 총액은 null로 처리되며, by_currency가 독립적인 총액을 보유합니다. 지원되는 통화 증거가 없는 급여는 알 수 없는 것으로 간주되어 화폐 집계에서 제외됩니다. 이는 결코 EUR로 가정되거나 UNSPECIFIED 의사 통화(pseudo-currency)를 통해 결합되지 않습니다.
이 범위는 더 넓은 Archon 로드맵보다 의도적으로 좁게 설정되었습니다. 본 항목은 출시된 주문/영수증/일반 은행 명세서 추출, EBITDA, 또는 매출 목표를 주장하지 않습니다.
스택 및 실행 환경
- Qwen 모델: Alibaba Cloud Model Studio / DashScope를 통해 제공되는
text-embedding-v4(1024차원 임베딩),qwen-plus(RAG 서술, 재순위화(rerank) 및 기술), 상태 확인이 가능한 구성된 시맨틱 판사(semantic judge), 그리고qwen-vl-max(급여 문서 비전 추출). - 메모리 저장소(Memory store): PostgreSQL 기반의 pgvector를 사용하며, HNSW 코사인 인덱스를 가진
agent_memory(embedding vector(1024))를 활용합니다. 시맨틱 회상(semantic recall)은ORDER BY embedding <=> $query방식을 사용합니다. - 라이브 배포: docker-compose를 실행하는 Alibaba Cloud ECS 인스턴스(
ecs.e-c1m2.large, ap-southeast-1)를 사용하며, 백엔드 컨테이너가 메모리 저장소로서 셀프 호스팅된 pgvector 컨테이너와 함께 하나의 퍼블릭 URL 뒤에서 실행됩니다. 저장소가 pg-wire 방식이므로, 동일한 코드를 관리형 ApsaraDB RDS / AnalyticDB for PostgreSQL 인스턴스(deploy/에 포함된 Function Compute 대안)에 대해 변경 없이 실행할 수 있으며,DATABASE_URL만 교체하면 즉시 적용됩니다.
DashScope 키가 없는 오프라인 환경에서는 결정론적 페이크(deterministic Fakes)를 통해 클라우드 자격 증명 없이도 모델의 이음새와 pgvector/fixture 경로를 테스트할 수 있습니다. 운영 환경은 실패 시 차단(fail-closed) 방식으로 작동합니다: /ready를 위해서는 실제 Qwen plus로 구성된 판사 인증이 반드시 필요합니다.
게시된 live k6 기록은 제한된 운영 증거를 추가합니다: 이전의 정확한 릴리스 e4b208a…에서, 읽기 전용 0 → 1 → 2 → 0 도착률 램프(arrival-rate ramp)는 HTTP 실패 없이 342개의 HTTP 요청과 42개의 근거 있는 Qwen 회상(recalls)을 완료했습니다. 이는 포화 테스트(saturation test), 최대 처리량(maximum-throughput) 주장, 또는 나중에 제출된 소스에 대한 증명이 아니라, 의도적으로 겸손하게 설정된 프로덕션 경로의 안정성/지연 시간(latency) 증거입니다.
우리가 출시한 것을 변화시킨 네 번의 반복(iterations)
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기