Azure AI Foundry를 활용한 지속 가능한 에이전트 메모리: 완전한 개발자 가이드
요약
Azure AI Foundry Memory Service를 사용하여 지속 가능한 메모리를 가진 AI 에이전트를 구축하는 방법을 다루는 개발자 가이드입니다. 상태 비저장(stateless) 에이전트의 한계를 극복하기 위한 메모리 유형, 아키텍처, Python 구현 및 배포 과정을 상세히 설명합니다.
핵심 포인트
- 상태 비저장 에이전트의 한계인 사용자 컨텍스트 상실 문제 해결
- Azure AI Foundry의 3단계 파이프라인 기반 메모리 아키텍처 이해
- Python Foundry Agent Framework를 활용한 실전 구현 방법
- 메모리 유형 선택 및 프로비저닝을 통한 개인화된 AI 구축
Meta Description: Azure AI Foundry Memory Service를 사용하여 지속 가능한 메모리 (persistent memory)를 가진 AI 에이전트를 구축하는 방법을 배워보세요. 개념, 메모리 유형, 범위 (scope), 프로비저닝 (provisioning), 그리고 Foundry Hosted Agent Framework를 사용한 전체 Python 구현을 다루는 완전한 개발자 가이드입니다.
Azure AI Foundry를 활용한 지속 가능한 에이전트 메모리: 완전한 개발자 가이드
목차
- 서론 (Introduction)
- Azure AI Foundry 메모리란 무엇인가?
- 메모리 유형 심층 분석 (Memory Types Deep Dive)
- 메모리 아키텍처: 실제 작동 방식
- 액세스 패턴 (Access Patterns): 도구(Tool) vs 저수준 API (Low-Level API)
- 범위 (Scope) 이해하기
- 실습: 메모리 스토어 프로비저닝 (Provisioning a Memory Store)
- 실습: Foundry Hosted Memory 에이전트 구축
- 에이전트 실행 및 배포
- 보안 모범 사례 (Security Best Practices)
- 할당량 (Quotas), 제한 (Limits) 및 지역별 가용성
- 결론 + 다음 단계
서론 (Introduction)
당신이 SaaS 제품을 위해 세련된 AI 어시스턴트를 막 출시했다고 상상해 보세요. 사용자들이 로그인하여 질문을 던지면, 날카롭고 도움이 되는 답변을 얻습니다. 출시는 성공적이었습니다. 그러다 불만 사항들이 들어오기 시작합니다.
"왜 매 세션마다 제 이름을 계속 물어보는 거죠?"
"지난주에 제가 채식주의자라고 말했는데, 왜 또 스테이크를 추천하는 거죠?"
"마치 기억상실증 환자와 대화하는 기분이에요."
이것이 바로 상태 비저장(stateless) 에이전트 문제입니다. 이는 대화형 AI (conversational AI)의 약속과 실제 운영 환경 배포 사이의 가장 좌절스러운 간극 중 하나입니다. 모든 대화는 백지 상태에서 시작됩니다. 에이전트는 자신이 누구와 대화하고 있는지, 그 사람이 무엇을 선호하는지, 혹은 어제, 지난주, 또는 한 달 전에 무엇을 논의했는지 전혀 알지 못합니다. 그 결과, 사용자 경험은 공허하고 반복적으로 느껴지며, 이는 사용자들이 기대했던 지능적이고 개인화된 어시스턴트와는 정반대의 모습이 됩니다.
해결책은 지속성 메모리(persistent memory)이며, Azure AI Foundry Memory는 바로 이 문제에 대한 Microsoft의 프로덕션급(production-grade) 해답입니다. Azure AI Foundry 플랫폼의 일부로 도입된 Memory Service는 에이전트가 세션 전반에 걸쳐 사실을 기억하고, 긴 대화 기록을 간결한 요약본으로 추출하며, 적절한 순간에 정확한 컨텍스트(context)를 검색할 수 있는 능력을 부여합니다. 이 모든 과정은 사용자가 처음부터 맞춤형 메모리 시스템을 직접 구축하고 유지 관리할 필요 없이 이루어집니다.
이 가이드에서는 심도 있게 다룰 것입니다. Azure AI Foundry Memory가 정확히 무엇인지, 내부적으로 3단계 파이프라인(three-phase pipeline)이 어떻게 작동하는지, 사용 사례에 맞는 적절한 메모리 유형을 선택하는 방법, Memory Store를 프로비저닝(provision)하는 방법, 그리고 Python의 Foundry Agent Framework를 사용하여 완전히 기능하는 호스팅된 메모리 에이전트를 구축하는 방법을 배우게 됩니다. 이 가이드를 마칠 때쯤이면, 실제로 기억할 수 있는 AI 어시스턴트를 출시하는 데 필요한 모든 것을 갖추게 될 것입니다.
[IMG: Side-by-side comparison diagram: Left side shows "Without Memory" — user repeats preferences every session with blank-slate agent; Right side shows "With Azure AI Foundry Memory" — agent greets user by name, recalls dietary restrictions and past topics, picks up mid-conversation seamlessly]
Azure AI Foundry Memory란 무엇인가?
그 핵심은 Azure AI Foundry Memory가 Azure AI Foundry 플랫폼 내에서 제공되는 관리형 서비스(managed service)로서, AI 에이전트에게 대화 세션 전반에 걸친 장기적이고 지속적인 메모리를 제공한다는 점입니다. 본질적으로 수명이 짧고 세션이 끝나면 폐기되는 LLM(Large Language Model)의 컨텍스트 윈도우(context window)에만 의존하는 대신, Memory Service는 추출된 사실과 대화 요약을 영구적으로 지속되며 향후 대화 시 의미론적(semantically)으로 검색할 수 있는 내구성 있는 Memory Store에 저장합니다.
여기서 단기 기억(short-term memory)과 장기 기억(long-term memory)의 구분은 매우 근본적입니다. **단기 기억(Short-term memory)**은 모델이 현재 컨텍스트 윈도우(context window) 내에서 '보고 있는' 것, 즉 진행 중인 대화, 시스템 프롬프트(system prompt), 검색된 모든 문서 등을 의미합니다. 대부분의 프로덕션 에이전트(production agents)는 오직 이것에만 의존합니다. 반면, **장기 기억(Long-term memory)**은 대화를 넘어 지속되는 요소로, 시간이 흐르며 축적되어 에이전트가 사용자에 대해 진정으로 잘 알고 있는 것처럼 느끼게 만드는 사실, 선호도, 요약 정보 등을 의미합니다.
Azure AI Foundry Memory는 이 장기 기억 계층을 제공합니다. 이는 컨텍스트 윈도우를 대체하는 것이 아니라, 컨텍스트 윈도우에 정보를 공급하는 역할을 합니다. 새로운 세션이 시작될 때마다 Memory Service는 저장된 관련 정보를 표면화하여 모델의 컨텍스트에 주입하며, 이를 통해 과거 대화에서 학습한 내용과 에이전트가 지금 당장 알아야 할 내용을 매끄럽게 연결합니다.
3단계 메모리 파이프라인 (The Three-Phase Memory Pipeline)
가공되지 않은 대화로부터 검색된 컨텍스트에 이르기까지, 메모리의 전체 생애 주기(lifecycle)는 세 가지 뚜렷한 단계를 거쳐 흐릅니다.
[IMG: 3단계 메모리 파이프라인을 보여주는 아키텍처 다이어그램 — 1단계: 추출(raw conversation → 식별된 사실/선호도), 2단계: 통합(중복 병합, 충돌 해결, 중복 제거), 3단계: 검색(의미론적 검색 → 모델에 관련 컨텍스트 주입) — 수평 타임라인을 따라 왼쪽에서 오른쪽으로 흐르는 화살표와 함께, 각 단계가 서로 다른 색상의 상자에 표시됨]
1단계: 추출 (Extraction). 대화가 진행됨에 따라 Memory Service는 대화를 분석하고 기억할 가치가 있는 사실들을 식별합니다. 예를 들어 사용자의 이름, 지나가는 말로 언급된 식단 제한 사항, 제품 선호도 또는 향후 세션에서 유용할 수 있는 기타 세부 정보 등이 이에 해당합니다. 이 추출 과정은 LLM(Large Language Model) 기반으로 이루어지므로, 단순한 키워드 매칭(keyword matching)이 아닌 문맥과 뉘앙스를 이해하며 수행됩니다.
2단계: 통합 (Consolidation). 추출된 가공되지 않은 사실(Raw extracted facts)은 깨끗한 상태인 경우가 드뭅니다. 사용자가 한 세션에서는 "저는 채식주의자입니다"라고 말하고, 다른 세션에서는 "고기나 생선은 먹지 않습니다"라고 말할 수 있습니다. 통합(Consolidation) 단계는 새로운 추출 내용을 기존 메모리와 병합하고, 중복된 항목을 제거하며, 충돌을 해결합니다. 만약 사용자가 이전에 시애틀에 산다고 말했는데 지금 오스틴으로 이사한다고 언급한다면, 통합 단계는 두 사실이 동시에 저장되는 대신 이전 사실이 교체되도록 보장합니다. 이것이 지능적으로 성장하는 메모리 시스템과 단순히 노이즈를 축적하는 시스템을 구분 짓는 차이점입니다.
3단계: 검색 (Retrieval). 새로운 세션이 시작될 때(또는 세션 중간에 관련이 있을 때), 메모리 서비스(Memory Service)는 해당 사용자의 범위 내에 저장된 메모리를 대상으로 의미론적 검색 (semantic search)을 수행하며, 에이전트의 시스템 컨텍스트 (system context)에 주입하기 위해 문맥적으로 가장 관련성이 높은 사실들을 반환합니다. 모델은 저장된 모든 메모리의 덤프를 받는 것이 아니라, 현재 대화에 중요한 정확한 하위 집합(subset)만을 전달받습니다.
이 파이프라인은 메모리 검색 도구 (Memory Search Tool) 액세스 패턴을 사용할 때 대부분 자동으로 실행되므로, 최소한의 코드 변경만으로 기존 에이전트에 지속 가능한 메모리를 추가하는 것이 매우 간단합니다.
메모리 유형 심층 분석 (Memory Types Deep Dive)
Azure AI Foundry Memory는 서로 다른 정보 범주를 위해 설계된 두 가지 별개의 메모리 유형을 제공합니다. 적절한 유형을 선택하거나 두 가지를 모두 결합하는 것이 효과적이고 거버넌스가 잘 갖춰진 메모리 시스템을 구축하는 핵심입니다.
사용자 프로필 메모리 (User Profile Memory)
사용자 프로필 메모리 (User Profile Memory)는 개인에 대한 정적이고 지속적인 사실을 위해 설계되었습니다. 여기에는 이름, 식단 제한 사항, 언어 선호도, 접근성 요구 사항, 알려진 제품 구성 및 빈번하게 변경될 가능성이 낮고 모든 대화 주제에 폭넓게 적용될 수 있는 유사한 속성들이 포함됩니다.
User Profile Memory (사용자 프로필 메모리)의 결정적인 특징은 세션 시작 시 단 한 번 호출된다는 점입니다. 잠재적으로 관련이 있을 수 있는 메모리가 존재할 때마다 매번 시맨틱 검색 (semantic search)을 수행하는 대신, 서비스는 사용자 프로필 전체를 사전에 검색하여 안정적인 토대로서 시스템 컨텍스트 (system context)에 주입합니다. 이는 매우 효율적이며 적절한 방식인데, 사용자 프로필 정보는 거의 항상 관련성이 있기 때문입니다. 예를 들어, 사용자가 글루텐 알레르기가 있다는 사실을 알고 있는 에이전트는 대화 주제가 무엇이든 상관없이 이를 고려해야 합니다.
Memory Store (메모리 스토어)를 생성할 때 user_profile_details 파라미터를 사용하여 User Profile Memory를 구성합니다. 이는 추출 모델 (extraction model)에 어떤 종류의 사실을 캡처해야 하는지, 그리고 무엇보다 중요한 점은 무엇을 제외해야 하는지를 설명하는 자연어 지침입니다:
user_profile_details=(
"Avoid irrelevant or sensitive data, such as age, financials, precise location, and credentials"
),
이러한 거버넌스 (governance) 지침은 필수적입니다. 명시적인 가이드가 없다면, 추출 모델은 사용자가 원하지 않거나 저장하도록 허용되지 않은 개인 민감 정보를 캡처할 수 있습니다. user_profile_details에 항상 명확한 제외 기준을 정의하십시오.
Chat Summary Memory (채팅 요약 메모리)
Chat Summary Memory는 다른 접근 방식을 취합니다. 개별적인 원자적 사실 (atomic facts)을 추출하는 대신, 대화 내용에 대해 주제별로 정제된 요약을 생성하는 지능형 압축 계층 (compression layer) 역할을 합니다. 40개의 메시지로 이루어진 대화 내용을 그대로 저장하는 대신, Chat Summary Memory는 무엇이 논의되었는지, 어떤 결정이 내려졌는지, 어떤 질문이 미결 상태로 남아 있는지와 같은 핵심적인 흐름을 포착하는 간결한 서사를 생성합니다.
User Profile Memory와 달리, Chat Summary Memory는 시맨틱 검색 (semantic search)을 통해 문맥에 따라 (contextually) 검색됩니다. 모든 대화 요약이 향후의 모든 세션에 관련이 있는 것은 아닙니다. 예를 들어, 사용자가 결제에 대해 물을 때 기술 지원 요약은 아마도 관련이 없을 것입니다. 시맨틱 검색 계층은 주제와 관련된 요약만이 나타나도록 보장하여 컨텍스트 윈도우 (context window)가 집중된 상태를 유지하도록 합니다.
MemoryStoreDefaultOptions에서 chat_summary_enabled=True로 설정함으로써 채팅 요약 메모리 (Chat Summary Memory)를 활성화할 수 있습니다. 우리가 구축할 샘플에서는 데모가 사용자 프로필 메모리 (user profile memory)에 집중될 수 있도록 이 기능을 비활성화했지만, 다양한 대화 주제를 다루는 프로덕션 에이전트 (production agents)의 경우 두 가지 유형을 모두 활성화하는 것이 일반적으로 올바른 선택입니다.
| 메모리 유형 | 저장 내용 | 검색 시점 | 설정 파라미터 | 최적의 용도 |
|---|---|---|---|---|
| 사용자 프로필 메모리 (User Profile Memory) | 정적 사실: 이름, 선호도, 제한 사항 | 세션 시작 시 1회 | user_profile_details (문자열 지침) | 개인 비서, 지원 봇, 쇼핑 에이전트 |
| 채팅 요약 메모리 (Chat Summary Memory) | 주제별 대화 요약 | 시맨틱 검색 (semantic search)을 통한 문맥적 검색 | chat_summary_enabled=True | 다중 주제 에이전트, 장기 프로젝트, 연구 도구 |
이 두 가지 메모리 유형은 상호 보완적입니다. 사용자 프로필 메모리는 에이전트에게 대화 상대가 누구인지에 대한 안정적이고 항상 사용 가능한 정보를 제공합니다. 채팅 요약 메모리는 관련 문맥 내에서 과거 대화의 흐름을 회상할 수 있는 능력을 부여합니다. 이들이 결합되어 포괄적인 장기 메모리 (long-term memory) 기반을 형성합니다.
메모리 아키텍처: 실제 작동 방식
Azure AI Foundry 메모리의 아키텍처 구성 요소를 이해하면 격리성 (isolation), 확장성 (scalability) 및 운영 특성에 대해 논리적으로 판단하는 데 도움이 됩니다.
메모리 스토어 (The Memory Store)
메모리 스토어는 최상위 리소스로, 모든 메모리를 보유하는 내구성이 있는 저장 컨테이너입니다. 애플리케이션 또는 사용 사례당 하나의 메모리 스토어를 생성합니다. 스토어는 Azure AI Foundry 프로젝트와 연결되며, 작동을 위해 두 가지 모델 배포 (model deployments)가 필요합니다:
- 채팅 모델 (chat model) (추출 및 통합에 사용, 예:
gpt-4.1-mini) - 임베딩 모델 (embedding model) (시맨틱 검색에 사용, 예:
text-embedding-3-small)
두 가지 모두 Foundry 프로젝트 내에서 사용 가능해야 합니다. Memory Store는 단순한 데이터베이스가 아닙니다. 이는 LLM 기반의 추출 (extraction)을 오케스트레이션하고, 통합 (consolidation) 로직을 실행하며, 시맨틱 검색 (semantic search)을 위한 벡터 임베딩 (vector embeddings)을 유지하고, 범위 기반 격리 (scope-based isolation)를 처리하는 지능형 서비스 계층이며, 이 모든 과정이 사용자를 위해 관리됩니다.
범위 (Scopes) 및 격리 (Isolation)
단일 Memory Store 내에서 메모리는 범위 (scope) 별로 구성됩니다. 범위는 한 메모리 세트를 다른 세트로부터 격리하는 논리적 네임스페이스 (namespace)입니다. 사실상 거의 모든 다중 사용자 시나리오에서 각 사용자는 자신만의 범위를 갖게 되며, 이를 통해 한 사용자의 메모리가 다른 사용자의 세션에는 완전히 보이지 않도록 보장합니다.
[IMG:1]
범위는 문자열 식별자이며, 플랫폼은 런타임 (runtime) 시 동적 해상 (dynamic resolution)을 지원합니다. 특정 범위 내에서 Memory Store는 해당 논리적 엔티티 (entity)에 대한 모든 추출된 메모리와 요약본을 유지합니다. 스토어당 최대 100개의 범위를 가질 수 있으며, 범위당 최대 10,000개의 메모리를 가질 수 있습니다.
LLM 기반 통합 (LLM-Powered Consolidation)
통합 (consolidation) 단계는 Azure AI Foundry Memory를 단순히 "데이터베이스에 사실을 추가하는" 방식과 차별화하는 핵심 요소이므로 특별한 주의를 기울여야 합니다. 각 대화 턴 (conversation turn, 또는 세션)이 끝난 후, 추출 모델 (extraction model)이 새로운 사실을 식별하면, 통합 모델 (consolidation model)이 해당 범위의 기존 저장된 메모리와 이를 비교합니다.
통합은 세 가지 작업을 수행합니다:
- 병합 (Merge) — 관련된 사실들을 하나의 더 풍부한 기록으로 결합
- 중복 제거 (Deduplication) — 스토어에 이미 표현된 새로운 사실을 폐기
- 충돌 해결 (Conflict Resolution) — 기존 메모리와 모순되는 사실을 업데이트하거나 교체
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기