DOCS/journey/troubleshooting/250914_로빙_검색_API_구현_현황.md
Claude-51124 22557e7132 docs: 오래된 트러블슈팅 아카이브 및 구조 정리
- 7-8월 초기 구축 문서 12개를 _archive/troubleshooting/2025_07-08_initial_setup/로 이동
- book/300_architecture/390_human_in_the_loop_intent_learning.md를 journey/research/intent_classification/로 이동 (개발 여정 문서)
- 빈 폴더 제거 (journey/assets/*)
2025-11-17 14:06:05 +09:00

3.2 KiB

로빙 검색 API 구현 현황

작성일: 2025-09-14 작성자: happybell80
관련 서비스: skill-rag (HTTP 외부 스킬)
핵심 기술: Multi-provider Search API, Query Routing, Caching, RAG

1. 검색 프로바이더 계층 구조

1.1 기본 드라이버: Tavily

  • 검색과 본문 추출 통합 제공
  • 월 1,000회 무료
  • RAG 파이프라인 단순화

1.2 보조 프로바이더

  • Brave Search API: 자체 인덱스, 월 2,000회 무료
  • Serper.dev: Google SERP, 2,500회 무료
  • DuckDuckGo IA: 즉답형 무료 무제한
  • Exa API: 심층 분석용 (유료)
  • SearxNG: 자체 호스팅 폴백

2. 의도 분석 현황 & 라우팅

현재 intent_analyzer.py는 LLM으로 명령어 변환(/news, /digest)만 수행, 미사용 상태. 검색 의도 추가: LLM 프롬프트에 "검색 요청은 /search로" 또는 직접 패턴 매칭.

# 예시 라우팅 (의도별 외부 호출)
def route_by_pattern(query):
    if "뉴스" in query: return 'news_api'
    if "언제" in query: return 'duckduckgo'  # 즉답
    return 'tavily'  # 기본 검색

3. 구현 아키텍처

사용자 → rb8001 → (HTTP) skill-rag
                 ↓
           [Query Router]
                 ↓
           [Provider Manager]
           /    |    |    \
      Tavily Brave Serper DuckDuckGo
                 ↓
           [Result Merger]
                 ↓
           [Redis Cache]

4. 캐싱 전략

쿼리 타입 TTL 근거
즉답형 24시간 변하지 않는 사실
일반 6시간 적당한 최신성
뉴스 30분 실시간성 중요
네비게이셔널 12시간 URL 변경 드물음

5. 비용 최적화

월간 쿼터 배분 (70-20-10)

  • Tavily: 700회 (기본)
  • Brave: 200회 (다양성)
  • Serper/Exa: 100회 (특수 목적)

예상 월 비용: $0.05

6. 구현 위치: skill-rag (외부 서비스)

rb8001 내부 구현 대신 외부 RAG 스킬(HTTP)로 분리

  • 웹 검색 + 파일 RAG 통합 처리 (HTTP 인터페이스)
  • Phase 1: Tavily + DuckDuckGo 웹 검색
  • Phase 2: ChromaDB 파일 검색 통합
  • Phase 3: 트래픽 증가 시 스케일아웃 (수평 확장)

7. 핵심 차별점

  • 다층 프로바이더로 안정성 확보
  • 쿼리 타입별 최적 API 자동 선택
  • 무료 한도 최대 활용으로 비용 최소화
  • 캐싱으로 중복 검색 방지

8. 현재 구현 상태

사용 중인 검색 엔진: Tavily API

  • Google이 아닌 Tavily 검색 서비스 사용
  • API 키: 환경변수로 설정됨 (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)
  • 엔드포인트: https://api.tavily.com/search

작동 방식

  1. 사용자 검색 요청 → DecisionEngine이 의도 파악
  2. CommandHandler → SkillCommands.handle_search() 호출
  3. Tavily API로 웹 검색 (최대 5개 결과)
  4. 검색 결과를 LLM에 전달하여 한국어 요약 생성
  5. 사용자에게 구조화된 답변 제공

설정

  • search_depth: "basic" (빠른 검색)
  • max_results: 5개
  • include_answer: true (AI 답변 포함)
  • include_raw_content: false (원문 제외)

문제점

  • Slack ID 사용자는 작동 ✓
  • UUID 사용자는 실패 ✗ (DecisionEngine 검증 오류)