LLM과 저지연(Low Latency)을 활용한 추천 시스템 구축
요약
LLM을 활용한 추천 시스템 구축 시 발생하는 지연 시간 문제를 해결하기 위한 2단계 아키텍처(검색 및 재순위화)를 소개합니다. 모델 크기 선택, 구조화된 출력 활용, 프롬프트 길이 관리 등 프로덕션 환경에서 성능을 최적화하는 실무적인 방법론을 다룹니다.
핵심 포인트
- 검색(Retrieval)과 재순위화(Reranking)로 이어지는 2단계 파이프라인 구축
- 모델 크기와 추론 품질 사이의 최적의 균형점(Sweet spot) 탐색
- JSON 모드 등 구조화된 출력을 통한 파싱 효율성 증대
- 프롬프트 길이에 따른 비용 및 지연 시간 관리 전략
추천 시스템은 협업 필터링(Collaborative Filtering)과 투타워 임베딩(Two-tower Embeddings)을 넘어 LLM 기반의 랭킹(Ranking) 및 생성(Generation) 단계로 나아가고 있습니다. 장점은 더 풍부한 문맥 이해(Context Understanding)가 가능하다는 것이지만, 프로덕션(Production) 환경에서의 제약 사항은 언제나 지연 시간(Latency)입니다. 사용자가 피드를 새로고침할 때, 매 밀리초(ms)가 중요합니다. 이 글에서는 지연 시간을 낮게 유지하는 실용적인 2단계 아키텍처(Two-stage Architecture)를 개괄하고, 추론 제공업체(Inference Provider)의 가격 모델이 전송할 수 있는 문맥(Context)의 양에 어떻게 직접적인 영향을 미치는지 설명합니다.
아키텍처: 검색(Retrieve), 그 다음 재순위화(Rerank)
전체 카탈로그를 스캔하는 단일 모놀리식(Monolithic) LLM 호출은 고정 가격 모델 하에서도 너무 느리고 비용이 많이 듭니다. 표준 패턴은 여전히 2단계 파이프라인(Two-stage Pipeline)입니다.
- 검색 (Retrieval): 임베딩 모델(Embedding Model)을 사용하여 사용자 이력과 후보 아이템을 인코딩한 다음, 벡터 유사도(Vector Similarity)를 통해 상위 K개(Top-K)를 추출합니다.
- 재순위화 (Reranking): 검색된 하위 집합을 구조화된 프롬프트(Structured Prompt)와 함께 LLM에 입력합니다. 모델은 순위가 매겨진 목록을 반환하거나 짧은 설명을 생성합니다.
이를 통해 LLM 프롬프트 크기를 작은 후보 집합으로 제한할 수 있으며, 생성 지연 시간(Generation Latency)을 예측 가능한 수준으로 유지할 수 있습니다. 무거운 작업은 임베딩 단계에서 이루어지며, 이는 매우 쉽게 병렬화(Parallelizable) 및 캐싱(Cacheable)이 가능합니다.
프로덕션에서의 지연 시간 조절 요소
기본적인 캐싱(Caching) 외에도, 세 가지 결정 사항이 p99를 결정합니다.
- 모델 크기 대 품질 (Model size versus quality). 70B 파라미터 모델은 7B 모델보다 더 나은 추론 (Reasoning) 능력을 보여주지만, TTFT (Time to First Token, 첫 토큰 생성 시간)는 더 높습니다. 랭킹 (Ranking) 작업의 경우, 강력한 32B 또는 70B 모델이 종종 최적의 지점 (Sweet spot)이 됩니다. Oxlo.ai는 Llama 3.3 70B 및 Qwen 3 32B를 콜드 스타트 (Cold start) 없이 호스팅하므로, 유휴 시간 이후 첫 번째 요청에서 워밍업 페널티 (Warmup penalty)를 지불할 필요가 없습니다.
- 구조화된 출력 (Structured output).
response_format={"type": "json_object"}를 통해 모델이 JSON을 출력하도록 강제하면, 클라이언트 측의 정규 표현식 (Regex) 파싱이 필요하지 않으며 후속 턴 (Follow-up turns)을 줄일 수 있습니다. - 프롬프트 길이 (Prompt length). 추천 프롬프트는 사용자 세션 기록 (User session history), 제품 속성 (Product attributes), 리뷰 요약 (Review summaries)을 포함할 때 빠르게 팽창합니다. 토큰 기반 제공업체 (Token-based providers)에서는 긴 프롬프트가 비용을 선형적으로 증가시킵니다. Oxlo.ai에서는 요청 기반 가격 책정 (Request-based pricing)을 사용하므로, 단일 요청에 얼마나 많은 컨텍스트 (Context)를 채워 넣든 비용이 일정하게 유지됩니다.
최소 구현 (A Minimal Implementation)
다음 Python 스니펫은 Oxlo.ai를 가리키는 OpenAI SDK를 사용합니다. 임베딩 모델 (Embedding model)을 사용하여 사용자 기록과 후보 아이템을 임베딩하고, 코사인 유사도 (Cosine similarity)를 통해 상위 후보를 검색한 다음, 채팅 모델 (Chat model)에 이를 재순위화 (Rerank)하도록 요청합니다.
import os
import json
import numpy as np
...
response_format 플래그에 주목하십시오. Oxlo.ai는 채팅 모델 전반에서 JSON 모드를 지원하므로, 추가적인 파싱 로직 없이도 구조화된 출력을 강제할 수 있습니다.
가격 모델이 컨텍스트 예산(Context Budget)을 결정하는 이유
모델이 최근 클릭, 체류 시간 (Dwell time), 제품 사양 (Product specs), 심지어 가공되지 않은 리뷰 텍스트와 같은 더 많은 신호 (Signals)를 볼 때 추천 품질이 향상됩니다. Together AI, Fireworks AI, OpenRouter, Replicate 또는 Anyscale와 같은 토큰 기반 제공업체에서는 이러한 컨텍스트를 모든 요청에 집어넣으면 청구 금액이 배로 늘어납니다. 결국 팀들은 비용을 절감하기 위해 사용자 기록을 잘라내거나 메타데이터 (Metadata)를 제거하게 되며, 이는 추천 품질에 직접적인 악영향을 미칩니다.
Oxlo.ai는 요청당 고정 가격제 (flat per-request pricing)를 사용합니다. 200-토큰 프롬프트를 보내든 20,000-토큰 프롬프트를 보내든 API 호출 한 번의 비용은 동일합니다. 긴 컨텍스트 (Long-context) 추천 워크로드의 경우, 이는 토큰 기반 과금 방식보다 10~100배 더 저렴할 수 있습니다. 이러한 가격 구조는 엔지니어링 의사결정을 변화시킵니다. 비용에 대한 갑작스러운 부담 없이 전체 사용자 세션, 상세한 아이템 설명, 심지어 멀티턴 대화 컨텍스트 (multi-turn conversational context)까지 단일 요청에 포함하여 보낼 수 있습니다.
만약 정말로 극단적인 컨텍스트가 필요하다면, Oxlo.ai의 DeepSeek V4 Flash는 1M 토큰을 지원하며 효율적인 MoE 추론 (MoE inference)을 제공하므로, 대규모로 검색된 세트 위에서 한 번에 랭킹 (ranking)을 매기는 데 유용합니다. 대부분의 프로덕션 파이프라인 (production pipelines)에서는 Llama 3.3 70B 또는 Kimi K2.6이 추론 품질과 처리량 (throughput) 사이의 최적의 균형을 제공합니다.
프로덕션을 위한 벤치마킹 (Benchmarking)
지연 시간 (Latency)은 TTFT (Time To First Token) 그 이상입니다. 요청 직렬화 (request serialization)부터 파싱된 JSON (parsed JSON)까지의 엔드 투 엔드 실제 시간 (end-to-end wall time)을 측정하세요. 캐시 미스 (cache misses)와 임베딩 팬아웃 (embedding fan-out)을 포함하는 부하 테스트 (load tests)를 실행하십시오. Oxlo.ai는 인기 있는 모델에 대해 콜드 스타트 (cold starts)가 없으므로, 유휴 기간 이후에도 p99 지연 시간이 일정하게 유지되어야 하며, 이는 트래픽이 급증하는 추천 시스템에 매우 중요합니다.
먼저 무료 티어 (free tier)를 사용하여 귀하의 SLA (Service Level Agreement) 대비 지연 시간의 기준선 (baseline)을 설정하십시오. Oxlo.ai는 7일간의 전체 액세스 체험판을 포함하여 16개 이상의 모델에 대해 하루 60회의 요청을 제공하며, 이는 실제 데이터로 2단계 파이프라인 (two-stage pipeline)을 프로파일링하기에 충분합니다. 규모를 확장할 경우, Pro 및 Premium 플랜은 각각 하루 1,000회 및 5,000회의 요청을 제공하며, Premium 플랜에는 우선순위 큐잉 (priority queueing)이 적용됩니다. 현재 플랜에 대한 자세한 내용은 https://oxlo.ai/pricing을 참조하십시오.
결론
LLM 기반 추천 시스템 (LLM-powered recommenders)은 문제를 다음과 같이 제한할 때 프로덕션 환경에 적용할 준비가 됩니다: 대규모 임베딩 (embed at scale), 소규모 후보군 검색 (retrieve a small candidate set), 그리고 구조화된 생성 (structured generation)을 통한 재순위화 (rerank). 남은 변수는 추론 경제성 (inference economics)입니다. Oxlo.ai의 요청당 고정 가격제 (Flat per-request pricing)는 풍부한 컨텍스트 (rich context) 사용에 따른 페널티를 제거하여, 토큰 예산 (token budget)에 맞추기 위해 사용자 이력이나 아이템 메타데이터 (item metadata)를 축소하지 않고도 더 나은 추천을 출시할 수 있게 해줍니다. 만약 토큰 기반 제공업체에서 마이그레이션하는 경우, OpenAI SDK 호환성 덕분에 코드 변경은 단 하나의 base_url 교체만으로 충분합니다. 클라이언트를 https://api.oxlo.ai/v1로 지정하고 귀하의 지연 시간 (latency) 지표에서 그 차이를 직접 테스트해 보십시오.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기