사용자가 패스트 패션(Fast Fashion)을 싫어한다는 사실을 잊지 않는 쇼핑 어시스턴트를 만든 이유
요약
사용자의 선호도와 결정을 기억하는 지속 가능한 쇼핑 에이전트인 EcoWorthyAI를 소개합니다. Hindsight를 통한 에이전트 메모리 구현과 Cascadeflow를 활용한 런타임 비용 제어 기술을 다룹니다.
핵심 포인트
- Hindsight를 사용하여 사용자의 결정과 추론을 저장하는 지속적 메모리 구현
- Cascadeflow를 통해 세션별 API 비용을 제어하고 모델 라우팅 최적화
- 단순 답변을 넘어 사용자의 가치관(예: 패스트 패션 지양)을 반영하는 에이전트 구축
사용자가 패스트 패션(Fast Fashion)을 싫어한다는 사실을 잊지 않는 쇼핑 어시스턴트를 만들었습니다
저는 모든 대화를 마치 처음 만난 것처럼 취급하는 수십 개의 "AI 쇼핑 어시스턴트"를 사용해 보았습니다. 제품에 대해 물어보면 일반적인 답변을 듣고, 탭을 닫고, 내일 다시 물어보면 똑같은 일반적인 답변을 듣습니다. 그중 어떤 것도 점점 ".더 좋아지지는" 않습니다. 그저 반복할 뿐입니다.
저는 에이전트가 사용자가 말한 내용을 실제로 기억한다면 어떤 일이 벌어질지, 그리고 모든 질문에 대해 매번 전체 비용을 지불하는 것을 멈췄을 때 API 비용은 어떻게 변할지 확인하고 싶었습니다. 그것이 바로 EcoWorthyAI입니다. 이는 지속적인 에이전트 메모리(Agent Memory)를 위해 Hindsight를 사용하고, 런타임 비용 제어(Runtime Cost Control)를 위해 cascadeflow를 기반으로 구축된 지속 가능한 쇼핑 어시스턴트입니다.
기능
사용자가 제품을 설명하면, EcoWorthyAI는 소재, 공급망(Supply Chain), 인증(Certifications) 등 해당 제품의 지속 가능성을 평가하고 권장 사항을 제공합니다. 지금까지는 혁명적인 것은 없습니다. 흥미로운 부분은 단일 질문 내에서의 동작이 아니라, ".세션(Session)" 전체에 걸쳐 어떤 일이 일어나는가 하는 점입니다.
다음은 테스트 중 발생한 실제 대화 내용입니다:
상호작용 1 — 새로운 세션, 사용자 demo_123이 제품에 대해 질문함:
사용자: "Aura Cotton Tee에 대해 알려줄 수 있나요?"
[Hindsight: Recall] user_demo_123의 컨텍스트를 검색 중...
-> 우선순위 및 최근 결정 사항을 검색함.
[Cascadeflow: Routing] 쿼리가 중간(MODERATE) 복잡도로 감지됨.
[Cascadeflow: Audit] 모델: llama-3.1-8b-instant | 비용: $0.000006 | 지연 시간(Latency): 522ms
ECOWORTHY AI 응답:
Aura Cotton Tee는 100% 유기농 면(Organic Cotton)으로 제작된 지속 가능한 의류 선택지입니다.
[Hindsight: Retain] user_demo_123의 메모리를 저장 중...
괜찮고, 일반적이며, 정확합니다. 아직은 아무것도 학습되지 않았습니다.
상호작용 2 — 동일한 세션 내에서, 사용자가 선호도와 결정을 자발적으로 제공합니다:
사용자: "사실, 8달러짜리 TrendVibe 폴리에스터 티셔츠도 봤어요. 하지만 저는 패스트 패션 (Fast Fashion)을 피하고 유기농 소재를 선호하기 때문에, TrendVibe는 건너뛸게요."
[Hindsight: Retain] user_demo_123의 메모리를 저장 중...
-> 기록된 결정: 패스트 패션 및 합성 소재로 인해 TrendVibe 폴리에스터 티셔츠 거부
이 순간이 바로 중요한 지점입니다. 에이전트는 단순히 질문에 답한 것이 아니라, 이 특정 사용자와 연결된 _결정 (decision)_과 그 뒤에 숨겨진 _추론 (reasoning)_을 유지했습니다.
시간을 뒤로 돌려, 완전히 다른 제품에 대한 나중의 상호작용을 보겠습니다. 질문에는 패스트 패션에 대한 언급이 전혀 없습니다:
사용자: "SwiftRuns의 Velocity 스니커즈 가격은 40.00달러입니다."
[Cascadeflow: Budget] 경고: 세션 예산에 근접함. 남은 금액: $0.000140
[Cascadeflow: Routing] 쿼리가 높은 (HARD) 복잡도로 감지됨.
[Cascadeflow: Routing] 예산 문제로 에스컬레이션 (Escalation) 차단됨. 저렴한 모델로 폴백 (fallback) 강제 실행. Cascade는 2개 이상의 모델이 필요하지만 1개만 확보됨. Cascade 비활성화.
[Cascadeflow: Audit] 모델: llama-3.1-8b-instant | 비용: $0.000050 | 지연 시간 (Latency): 520ms
ECOWORTHY AI 응답:
SwiftRuns의 Velocity 스니커즈 가격은 40.00달러입니다. 하지만 주의해 주세요: SwiftRuns는 패스트 패션 (Fast Fashion) 판매업체입니다. 이 스니커즈는 합성 가죽과 버진 플라스틱 (virgin plastics)으로 만들어졌으며, 재활용 가능 등급이 0입니다. 귀하께서 패스트 패션을 피한다고 말씀하셨기 때문에, 더 저렴함에도 불구하고 이 판매업체에 주의 표시를 합니다.
[Hindsight: Retain] user_demo_123의 메모리를 저장 중...
이 메시지에서 에이전트에게 패스트 패션에 대해 말해준 사람은 아무도 없습니다. 에이전트는 몇 차례 전의 결정에서 해당 제약 조건을 끌어와서, 요청받지 않았음에도 완전히 새로운 제품에 이를 적용했습니다. 이것이 바로 단 한 번의 상호작용을 통해 보여주는 지속성 있는 메모리 (persistent memory)의 핵심 가치입니다. 중간에 일어난 일 때문에 다섯 번째 질문이 첫 번째 질문과는 실질적으로 다른 답변을 받게 되는 것입니다.
나머지 절반: 모든 질문에 전체 비용을 지불하지 않는 법
위에서 언급한 모든 호출은 모델에 도달하기 전 cascadeflow의 라우팅 계층(routing layer)을 거쳤습니다. 로직은 간단하지만 그 보상은 결코 간단하지 않습니다. 쿼리의 복잡성(complexity)을 분류하여, 쉬운 질문(예: "이것은 무엇으로 만들어졌나요?")은 작고 저렴한 모델로 보내고, 질문이 진정으로 강력한 모델을 필요로 할 때—여러 제품의 라이프사이클 비교, 트레이드오프 분석(tradeoff analysis), 혹은 실질적인 추론 깊이(reasoning depth)가 필요한 경우—에만 더 강력한 모델로 에스컬레이션(escalate)하는 것입니다.
제가 예상하지 못했던 점은 예산 집행(budget enforcement)이 압박 속에서도 얼마나 잘 버텨내느냐였습니다. 위의 실행 과정에서, 세션이 비용 상한선(cost ceiling)에 도달하려는 찰나에 HARD-복잡도 쿼리가 들어왔습니다. 이는 정확히 더 강력한 모델로 에스컬레이션되어야 하는 종류의 쿼리였습니다. 하지만 cascadeflow는 예산을 초과하거나 충돌하는 대신, 에스컬레이션을 차단하고 저렴한 모델로의 폴백(fallback)을 강제했으며, 그 '이유'를 기록했습니다:
[Cascadeflow: Routing] 예산으로 인해 에스컬레이션이 차단되었습니다. 저렴한 모델로의 폴백을 강제합니다. Cascade에는 2개 이상의 모델이 필요하지만 1개만 확보되었습니다. Cascade를 비활성화합니다.
이 문장은 감사 추적(audit trail)이 제 역할을 수행하고 있음을 보여줍니다. 어떤 모델을 사용할지, 왜, 어떤 비용으로, 어떤 지연 시간(latency)으로 사용할지와 같은 모든 결정 사항이 최종 답변뿐만 아니라 로그로 기록됩니다. 만약 여러분이 실제 운영 환경(production)과 유사한 환경에서 에이전트(agent)를 실행하려 한다면, 이 로그는 "AI가 무언가를 했다"와 "AI가 무엇을 왜 했는지 정확히 설명할 수 있다" 사이의 차이를 만들어냅니다.
성찰: 이력을 프로필로 전환하기
가공되지 않은 상호작용 이력(Raw interaction history)은 사용자를 이해하는 것과 같지 않습니다. 10번의 상호작용이 끝나면, EcoWorthyAI는 세션에 대해 성찰 단계(reflection pass)를 실행합니다:
[Hindsight: Reflect] user_demo_123에 대한 성찰 루프(reflection loop) 실행 중...
→ 과거 10회의 상호작용 분석 중...
→ 성찰 완료. 정제된 선호도 프로필(distilled preference profile) 생성됨.
업데이트된 정제된 선호도 프로필:
사용자는 원자재의 출처와 공급망 윤리에 대해 매우 의식적임.
사용자는 패스트 패션(Fast Fashion)을 적극적으로 보이콧하며, 유기농 및 인증된 소재를 우선시함. 추천 전략: 인증 정보, 소재의 원산지 및 장기적인 내구성을 강조할 것. 패스트 패션 또는 열악한 노동 관행과 연결된 제품은 플래그(Flag)를 표시할 것.
매번 10개의 가공되지 않은 상호작용을 다시 읽는 대신, 향후 세션에서는 이 압축된 프로필을 직접 호출할 수 있습니다. 이는 검색 비용이 더 저렴하며, 단순한 기록물 투척(transcript dump)이 아닌 진정으로 유용한 요약본이 됩니다.
내가 다르게 했을 점
만약 이 프로젝트를 계속 구축했다면 바꾸었을 몇 가지 사항입니다:
-
초기에 FastEmbed가 설치되어 있지 않았으며, 검색(retrieval) 단계가 조용히 더 느린 경로로 대체되었습니다. 데모 중간에 발견하기보다는 의존성(dependencies)을 명시적으로 고정하는 것(
pip install fastembed)이 가치 있는 일입니다. -
예산 제한으로 인한 에스컬레이션(escalation)에는 로그 라인뿐만 아니라 사용자에게 보여지는 신호가 필요합니다. 현재는 어려운(HARD) 쿼리가 조용히 저렴한 모델로 다운그레이드됩니다. 이는 비용 제어를 위한 올바른 동작이지만, 실제 제품이라면 "예산에 근접했기 때문에 현재 더 빠르고 저렴한 모델을 사용 중입니다"와 같은 메시지를 노출하여 사용자에게 보이지 않는 상태로 두지 말아야 합니다.
-
성찰 빈도(매 10회 상호작용마다)는 추측에 불과합니다. 사용자의 선호도가 실제로 변화하는 빈도와 다시 요약하는 데 드는 비용 사이의 균형을 맞추어 이를 조정하고 싶습니다.
-
메모리에는 만료(expiry) 또는 재정의(override) 경로가 필요합니다. 6개월 전 거절된 제품이 반드시 영원히 동일한 비중을 가져야 하는 것은 아닙니다. 선호도는 변하며, 회상 계층(recall layer)은 사용자가 과거의 결정을 명시적으로 덮어쓸 수 있도록 허용해야 합니다.
-
라우팅 복잡도 분류기(routing complexity classifier)가 많은 일을 수행하고 있으며, 저는 대규모 환경에서 이 분류기의 오탐률(false-positive rate)을 확인하고 싶습니다. 진정으로 어려운 쿼리를 저렴한 모델로 조용히 보내는 것은, 감사 로그(audit log)를 확인하지 않는 한 놓치기 쉬운 방식으로 답변 품질을 저하시키기 때문입니다.
왜 특별히 이 조합인가
메모리(Memory)와 비용 제어(cost control)는 서로 다른 문제를 해결하지만, 이들은 상호 보완적으로 작용합니다. Hindsight의 에이전트 메모리(agent memory)는 에이전트를 다시 찾을 가치가 있게 만드는 핵심 요소이며, 사용하면 사용할수록 더욱 유용해집니다. Cascadeflow의 라우팅(routing)은 이를 실제로 실행 가능하도록 지속 가능하게 만듭니다. 즉,
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기