LangChain 검색·검증

LangChain 검색·검증 (Retrieval)

LLM은 강력하지만 두 가지 한계가 있어요. 유한한 컨텍스트(전체 말뭉치를 한 번에 넣을 수 없음)와 고정된 지식(학습 데이터가 특정 시점에 멈춰 있음)이 바로 그것이에요. 검색(Retrieval)은 질의 시점에 관련된 외부 지식을 가져와서 이 문제를 해결해 줘요. 이것이 바로 **RAG(Retrieval-Augmented Generation)**의 기초예요.

검색 파이프라인은 컴포넌트가 모듈식이라, 로더(loader)나 스플리터, 임베딩, 벡터 스토어를 앱 로직을 다시 쓰지 않고도 교체할 수 있어요.

출처: LangChain Retrieval 공식 문서

지식 베이스 구축하기

**지식 베이스(knowledge base)**는 검색 중에 사용되는 문서나 구조화 데이터의 저장소예요. 커스텀 지식 베이스가 필요하다면 LangChain의 문서 로더(document loaders)와 벡터 스토어(vector stores)로 직접 만들 수 있어요.

이미 SQL 데이터베이스, 문서 DB, CRM 같은 지식 베이스가 있다면 재구축할 필요는 없어요. Agentic RAG에서는 그걸 에이전트의 **도구(tool)**로 연결하거나, 검색 결과를 LLM 컨텍스트로 공급하는 방식(2-Step RAG)을 쓰면 돼요.

RAG 아키텍처

RAG는 시스템 요구사항에 따라 여러 방식으로 구현할 수 있어요.

아키텍처 설명 제어 유연성 지연 예시
2-Step RAG 생성 전에 항상 검색. 단순하고 예측 가능 높음 낮음 빠름 FAQ, 문서 봇
Agentic RAG LLM 에이전트가 추론 중 '언제·어떻게' 검색할지 결정 낮음 높음 변동 여러 도구를 쓰는 연구 어시스턴트
Hybrid 두 방식의 특징을 검증 단계와 결합 중간 중간 변동 품질 검증이 필요한 도메인 Q&A

2-Step RAG

검색 단계가 항상 생성 단계보다 먼저 실행되는 구조예요. 단순하고 예측 가능해서, 관련 문서 검색이 답 생성의 명확한 전제 조건인 애플리케이션에 적합해요.

Agentic RAG

RAG와 에이전트 기반 추론을 결합한 방식이에요. 문서를 미리 검색하는 대신, LLM로 구동되는 에이전트가 단계별로 추론하면서 상호작용 중 '언제', '어떻게' 검색할지를 스스로 정해요. 에이전트가 RAG 동작을 하게 하려면 외부 지식을 가져올 수 있는 도구(문서 로더, 웹 API, DB 쿼리 등)가 하나 이상 있으면 충분해요.

import requests
from langchain.tools import tool
from langchain.chat_models import init_chat_model
from langchain.agents import create_agent

@tool
def fetch_url(url: str) -> str:
    """Fetch text content from a URL"""
    response = requests.get(url, timeout=10.0)
    response.raise_for_status()
    return response.text

agent = create_agent(
    model="claude-sonnet-4-6",
    tools=[fetch_url],  # 검색용 도구
    system_prompt="Use fetch_url when you need to fetch information from a web-page; quote relevant snippets.",
)

Hybrid RAG

2-Step과 Agentic RAG의 특징을 합치고, 쿼리 전처리, 검색 검증, 생성 후 검사 같은 중간 단계를 추가한 방식이에요. 쿼리 향상(질의 재작성·변형·확장), 검색 검증(관련 문서가 충분한지 평가 후 필요시 재검색), 답변 검증(정확성·완전성 확인 후 재생성) 같은 컴포넌트를 포함해요.

검색 파이프라인 빌딩 블록

  • 문서 로더 (Document loaders): Google Drive, Slack, Notion 등 외부 소스에서 데이터를 가져와 표준화된 Document 객체로 반환
  • 텍스트 스플리터 (Text splitters): 큰 문서를 개별 검색 가능한 작은 청크로 분할
  • 임베딩 모델 (Embedding models): 텍스트를 숫자 벡터로 변환해 유사한 의미끼리 가까이 위치
  • 벡터 스토어 (Vector stores): 임베딩 저장·검색 전용 데이터베이스
  • 리트리버 (Retrievers): 구조화되지 않은 쿼리에 대해 문서를 반환하는 인터페이스

더 알아보기