
FastAPI, React, Hindsight를 활용한 딜 인텔리전스 에이전트(Deal Intelligence Agent) 구축하기
요약
FastAPI, React, Hindsight를 사용하여 지속적인 메모리 계층을 가진 딜 인텔리전스 에이전트를 구축하는 방법을 설명합니다. LLM의 단기 기억 문제를 해결하기 위해 도메인 이벤트를 기반으로 한 시맨틱 검색 메모리 시스템을 설계합니다.
핵심 포인트
- Hindsight SDK를 활용한 계층형 메모리 시스템 구축
- 도메인 이벤트를 통한 지속적이고 쿼리 가능한 메모리 관리
- FastAPI와 React를 이용한 에이전트 아키텍처 구현
- 임베딩 시 태그를 활용한 정밀한 컨텍스트 검색 최적화
제가 작업해 온 모든 LLM(대규모 언어 모델)은 동일한 근본적인 결함을 가지고 있습니다. 바로 요청이 끝나는 순간 모든 것을 잊어버린다는 점입니다.
단순한 상식 답변을 하는 챗봇에게는 문제가 되지 않습니다.
하지만 3번 전의 통화에서 나온 반대 의견, 지난 분기에 언급된 경쟁사, 그리고 CTO가 실제 의사 결정권자라는 사실 등을 기억해야 하는 영업 인텔리전스 에이전트(Sales Intelligence Agent)에게는 이는 실행 불가능한 수준의 결함입니다.
이것이 바로 우리가 딜 인텔리전스 에이전트(Deal Intelligence Agent)를 구축할 때 해결하고자 했던 격차입니다. 즉, 영업 팀에게 파이프라인 전반에 걸쳐 지속적이고 쿼리 가능한(queryable) 메모리 계층을 제공하는 FastAPI + React 시스템입니다.
⚙️ 아키텍처 개요
우리는 메모리가 일급 시민(first-class citizen)으로서 기능하는 계층형 시스템으로 에이전트를 설계했습니다:
FastAPI 백엔드 → REST + 스트리밍 엔드포인트(streaming endpoints)
MemoryService → 시맨틱 검색(semantic retrieval)을 위해 Hindsight SDK를 래핑(wrap)
LLMService → 컨텍스트가 주입된 Groq Llama 3.3 70B 컴플리션(completions)
DealService → 메모리 + LLM 로직 오케스트레이션(orchestration)
React 프론트엔드 → 채팅, 딜 상세 정보, 경쟁사 레이더, 리스크 히트맵, 매출 예측
Twilio + SMTP → SMS, 음성 통화, 개인화된 후속 이메일
SMS, 이메일, 브리핑과 같은 모든 아웃바운드(outbound) 작업은 메모리 이벤트로서 Hindsight에 다시 기록됩니다. 에이전트의 컨텍스트는 모든 상호작용과 함께 성장합니다.
📝 메모리가 기록되는 방식
메모리 기록은 부수 효과(side effect)가 아닌 도메인 이벤트(domain event)로 취급됩니다.
python
async def store_memory(
self,
deal_id: str,
...
텍스트 임베딩(Embedding) 시 [OBJECTION], [COMPETITOR], [STAKEHOLDER]를 앞에 붙여 컨텍스트를 인지하는 검색(retrieval)이 가능하게 합니다.
비동기 래퍼(asyncio.to_thread)를 사용하여 FastAPI의 이벤트 루프(event loop)가 차단되는 것을 방지합니다.
🔍 메모리가 읽히는 방식
검색은 딜 ID(deal ID)별로 범위가 지정되어 정밀도를 보장합니다.
python
@app.post("/api/chat")
async def chat(msg: ChatMessage):
memories = []
...
에이전트는 의미론적 검색 (Semantic Search)을 실행하여 가장 관련성이 높은 상위 10개의 항목을 반환하고, 이를 프롬프트 (Prompt)에 주입합니다.
응답은 일반적인 조언에서 딜 인텔리전스 (Deal-aware) 전략으로 변화합니다.
📊 컨텍스트 주입 (Context Injection) 예시
text
[MEMORY CONTEXT]
1. [OBJECTION][2024-11-03] 가격이 현재 벤더보다 40% 높음
2. [COMPETITOR][2024-11-03] Salesforce가 기존 업체로 언급됨
...
메모리 쓰기 (Memory writes)를 로그 (Logs)가 아닌 도메인 이벤트 (Domain events)로 취급하세요.
적절한 식별자 (Identity)를 통해 메모리의 범위를 지정하세요 (deal_id가 가장 효과적이었습니다).
의미론적 검색 (Semantic retrieval)이 무차별적인 컨텍스트 채우기 (Brute-force context stuffing)보다 뛰어납니다.
비동기 래퍼 (Async wrappers)는 동시성 버그 (Concurrency bugs)를 방지합니다.
우아한 성능 저하 (Graceful degradation)는 온보딩 (Onboarding)을 더 원활하게 만듭니다.
🎯 결론
LLM은 상태가 없는 (Stateless) 특성을 갖지만, 에이전트가 반드시 그럴 필요는 없습니다.
Hindsight를 사용하면, 몇 번의 적절한 store_memory 및 get_relevant_memories 호출만으로 "일반적인 챗봇"과 "딜 인텔리전스 에이전트" 사이의 간극을 메울 수 있습니다.
모델은 그대로 멍청하게 유지됩니다.
아키텍처가 모델을 똑똑해 보이게 만듭니다.
👉 Repo: https://github.com/chaitanya07-ai/deal-intelligence-agent
👉 Live Demo: https://deal-intelligence-agent-1.onrender.com
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기