14장 — 지식 검색

대규모 언어 모델은 사람이 쓴 것 같은 텍스트를 생성하는 데 상당한 역량을 보입니다. 그러나 그 지식 기반은 보통 학습에 사용된 데이터에 한정되어 있어, 실시간 정보나 특정 기업 데이터, 고도로 전문화된 세부 정보에는 접근하기 어렵습니다. 지식 검색, 즉 검색 증강 생성(Retrieval Augmented Generation, RAG) 은 이 한계를 해결합니다.

에이전트에게 이 점이 중요한 이유가 명확합니다.

고정된 학습 데이터를 넘어, 실시간으로 확인 가능한 데이터에 근거해 행동하고 응답할 수 있기 때문이다. 이 역량 덕분에 에이전트는 최신 사내 정책을 확인해 특정 질문에 답하거나, 주문 전에 현재 재고를 조회하는 등 복잡한 작업을 정확하게 수행할 수 있다. 외부 지식을 통합하면 에이전트는 단순한 대화 상대를 넘어, 의미 있는 업무를 실제로 수행하는 효과적인 데이터 기반 도구가 된다.

패턴 개요

사전 학습된 내부 지식에만 의존하는 대신, RAG를 통해 LLM은 마치 사람이 책을 찾아보거나 인터넷을 검색하듯 정보를 “조회” 할 수 있습니다.

질의 → 외부 지식 기반에서 의미 기반 검색 → 관련 청크 추출
    → 원래 프롬프트에 덧붙여 강화된 프롬프트 생성 → LLM → 응답

중요한 것은 이 검색이 단순한 키워드 일치가 아니라, 사용자의 의도와 단어 이면의 의미를 이해하는 의미 기반 검색이라는 점입니다.

RAG 프레임워크의 이점은 넷입니다.

  • 최신 정보 접근 — 고정된 학습 데이터의 한계 극복
  • 환각 감소 — 응답을 검증 가능한 데이터에 근거하게 함
  • 사내 전문 지식 활용 — 사내 문서나 위키에 담긴 지식
  • 출처 표시 — 정보의 정확한 출처를 밝혀 신뢰성과 검증 가능성을 높임

핵심 개념 네 가지

임베딩

텍스트를 수치로 표현한 벡터입니다. 의미가 비슷한 단어나 구는 벡터 공간에서 가까운 임베딩을 갖습니다.

"cat"    → (2, 3)
"kitten" → (2.1, 3.1)   ← 매우 가깝다
"car"    → (8, 1)       ← 훨씬 멀다

실제 임베딩은 수백에서 수천 차원에 이르는 고차원 공간에 존재하며, 덕분에 언어를 매우 세밀하게 이해할 수 있습니다.

텍스트 유사도와 의미 거리

텍스트 유사도는 단어 겹침 정도를 보는 어휘적 유사도(lexical similarity) 일 수도 있고, 의미 기반의 더 깊은 수준일 수도 있습니다. “프랑스의 수도는 어디야?”와 “어느 도시가 프랑스의 수도야?”는 표현이 다르지만 같은 질문입니다. 좋은 모델이라면 공통 단어가 몇 개뿐이더라도 높은 유사도 점수를 부여해야 합니다.

의미 거리는 의미 유사도의 반대 개념으로, 유사도가 높으면 거리가 낮습니다. 책의 예시가 인상적입니다.

“a furry feline companion”과 “a domestic cat”은 관사 “a” 외에는 공통 단어가 없다. 그러나 의미 유사도를 이해하는 모델이라면 두 표현이 같은 대상을 가리킨다는 것을 인식하고, 유사도가 매우 높다고 판단한다.

(옮긴이) 각자 “복슬복슬한 고양잇과 반려 동물”과 “집고양이”로 번역된다.

문서 청킹

50쪽짜리 사용자 매뉴얼을 하나의 텍스트 블록으로 취급하는 대신, 섹션·문단·문장 단위로 나눕니다. “문제 해결” 섹션은 “설치 가이드”와 별도의 청크가 되고, 사용자가 특정 문제를 물으면 매뉴얼 전체가 아니라 가장 관련성 높은 문제 해결 청크만 검색됩니다.

검색 기법으로는 임베딩과 의미 거리를 쓰는 벡터 검색과, 좀 더 오래되었지만 여전히 유용한 BM25(의미를 파악하지 않고 용어 빈도에 기반해 청크 순위를 매기는 키워드 기반 알고리즘)가 있고, 두 방식의 장점을 살리는 하이브리드 검색이 흔히 사용됩니다.

벡터 데이터베이스

이 절을 요약하는 한 문장이 좋습니다.

다른 기법이 단어를 찾는다면, 벡터 데이터베이스는 의미를 찾는다.

키워드 기반 검색은 질의에 포함된 정확한 단어가 든 문서를 찾는 데는 뛰어나지만, “furry feline companion”이 “cat”을 뜻한다는 사실을 알아차리지 못합니다. 벡터 데이터베이스는 텍스트를 수치 벡터로 저장하므로 키워드 겹침이 아닌 개념적 의미에 기반해 결과를 찾고, HNSW(Hierarchical Navigable Small World) 같은 최적화된 알고리즘으로 수백만 개의 벡터를 빠르게 탐색합니다.

유형 예시
관리형 Pinecone, Weaviate
오픈소스 Chroma DB, Milvus, Qdrant
기존 DB에 벡터 검색 추가 Redis, Elasticsearch, Postgres(pgvector 확장)
핵심 검색 라이브러리 Meta AI의 FAISS, Google Research의 ScaNN

RAG의 과제

이 장이 정직한 지점입니다.

주요 문제는 질의에 답하는 데 필요한 정보가 하나의 청크에 모여 있지 않고, 한 문서의 여러 부분이나 심지어 여러 문서에 흩어져 있을 때 발생한다.

이 경우 검색기가 필요한 맥락을 모두 수집하지 못해 불완전하거나 부정확한 답변이 만들어질 수 있습니다. 나머지 과제도 구체적입니다.

  • 시스템의 효과는 청킹과 검색 과정의 품질에 크게 좌우되는데, 관련 없는 청크가 검색되면 잡음이 유입되어 LLM을 혼란스럽게 만들 수 있다.
  • 서로 모순될 수 있는 여러 출처의 정보를 효과적으로 종합하는 일도 중요한 과제다.
  • 전체 지식 기반을 벡터 DB나 그래프 DB 같은 특수 데이터베이스에 미리 처리하여 저장해야 하는데, 이것 자체가 상당한 작업이다. 사내 위키처럼 계속 변하는 소스는 주기적으로 갱신해야 한다.
  • 이 전체 과정은 지연 시간과 운영 비용을 늘리고, 최종 프롬프트에 사용되는 토큰 수도 증가시킨다.

그래프 RAG

그래프 RAG는 단순한 벡터 데이터베이스 대신 지식 그래프를 활용하는 고급 형태입니다. 구조화된 지식 기반 안에서 데이터 엔티티(노드)와 그 사이의 명시적 관계(엣지)를 따라가며 복잡한 질의에 답합니다.

핵심 장점은 여러 문서에 흩어진 정보를 종합해 답변을 만들어 낼 수 있다는 것인데, 이는 전통적 RAG가 흔히 실패하는 영역이다.

활용 사례로는 기업과 시장 이벤트 간 관계를 분석하는 복잡한 금융 분석이나 유전자와 질병 간 관계를 발견하는 과학 연구가 있습니다.

단점도 분명합니다. 고품질 지식 그래프를 구축하고 유지하려면 상당한 복잡성, 비용, 전문성이 필요하고, 더 단순한 벡터 검색 시스템보다 유연성이 떨어지고 지연 시간도 길어질 수 있습니다. 시스템의 효과는 전적으로 기반 그래프 구조의 품질과 완전성에 달려 있습니다.

요약하면, 표준 RAG의 속도와 단순함보다 깊이 있는 통찰과 정보 간 연결 관계가 더 중요한 상황에서 진가를 발휘한다.

에이전틱 RAG — 네 가지 시나리오

에이전틱 RAG는 추론과 의사결정 계층을 도입해 정보 추출의 신뢰성을 크게 높입니다. 단순히 검색하고 증강하는 데 그치지 않고, “에이전트”가 지식을 걸러 내고 다듬는 핵심 관문 역할을 맡습니다. 처음 검색된 데이터를 수동적으로 받아들이지 않고, 데이터의 품질과 관련성, 완전성을 능동적으로 검증합니다.

① 리플렉션과 출처 검증

사용자가 “우리 회사의 원격 근무 정책은 어떻게 되나요?”라고 물었을 때, 표준 RAG라면 2020년 블로그 글과 2025년 공식 정책 문서를 함께 가져올 수 있습니다. 그러나 에이전트는 문서의 메타데이터를 분석해 2025년 정책이 가장 최신이고 권위 있는 출처임을 파악하고, 오래된 블로그 글을 걸러낸 뒤 올바른 맥락만을 전달합니다.

② 충돌하는 정보 조정

“프로젝트 알파의 1분기 예산은 얼마였나요?”라는 질문에 두 문서가 검색되었는데, 초기 제안서에는 €50,000, 확정된 재무 보고서에는 €65,000 으로 기재되어 있습니다. 에이전틱 RAG는 이 모순을 식별하고 재무 보고서를 더 신뢰할 수 있는 출처로 우선시한 뒤 검증된 수치를 제공합니다.

③ 다단계 추론

“우리 제품의 기능과 가격을 경쟁사 X와 비교해 주세요”라는 질문을 자사 제품의 기능, 자사 가격, 경쟁사 X의 기능, 경쟁사 X의 가격 네 개의 하위 질의로 분해해 개별 검색한 뒤, 이를 구조화된 비교 맥락으로 종합합니다.

④ 지식 공백 파악과 외부 도구 활용

“어제 출시한 우리 신제품에 대한 시장의 즉각적 반응은 어땠나요?”라는 질문에 주 단위로 갱신되는 내부 지식 기반에서는 관련 정보를 찾지 못합니다. 이 공백을 인식한 에이전트는 실시간 웹 검색 API 같은 도구를 활성화해 최신 뉴스 기사와 소셜 미디어 반응을 찾아냅니다.

에이전틱 RAG의 과제

가장 큰 단점은 복잡성과 비용이 크게 늘어난다는 점이다. 에이전트의 의사결정 로직과 도구 연동을 설계하고 구현하고 유지하려면 상당한 엔지니어링 노력이 필요하며, 컴퓨팅 비용도 증가한다. 이러한 복잡성은 지연 시간 증가로도 이어질 수 있는데, 에이전트의 리플렉션·도구 사용·다단계 추론 과정이 표준적인 직접 검색보다 시간이 더 걸리기 때문이다.

나아가 에이전트 자체가 새로운 오류 원인이 될 수 있다. 추론 과정에 결함이 있으면 무의미한 반복 루프에 빠지거나, 작업을 잘못 해석하거나, 관련 정보를 부적절하게 버려서 최종 응답의 품질을 오히려 떨어뜨릴 수 있다.

문제를 풀려고 넣은 계층이 새로운 실패 지점이 된다는 지적이 12장의 예외 처리와 이어집니다.

실제 적용과 활용 사례

사례 내용
엔터프라이즈 검색과 질의응답 HR 정책, 기술 매뉴얼, 제품 사양서 같은 내부 문서를 활용해 직원 문의에 응답
고객 지원과 상담 데스크 제품 매뉴얼·FAQ·지원 티켓 정보에 접근해 정확하고 일관된 응답 제공. 반복적인 문제에 사람이 직접 개입할 필요를 줄인다
개인화 콘텐츠 추천 단순 키워드 매칭을 넘어 사용자의 선호나 이전 상호작용과 의미적으로 관련된 콘텐츠를 식별
뉴스와 시사 요약 실시간 뉴스 피드와 연동해 최신 기사를 검색하고 요약 생성

구현 예제

① 구글 ADK — 검색 도구

RAG는 외부 정보에 접근하는 과정이므로, 구글 검색 도구는 LLM의 지식을 증강하는 내장 검색 메커니즘의 대표적 예입니다.

from google.adk.tools import google_search
from google.adk.agents import Agent

search_agent = Agent(
    name="research_assistant",
    model="gemini-2.0-flash-exp",
    instruction="You help users research topics. When asked, use the Google Search tool",
    tools=[google_search]
)

② 구글 ADK — Vertex AI RAG

from google.adk.memory import VertexAiRagMemoryService

RAG_CORPUS_RESOURCE_NAME = "projects/your-gcp-project-id/locations/us-central1/ragCorpora/your-corpus-id"

# RAG 서비스가 반환할 관련 문서 청크의 수를 제어한다.
SIMILARITY_TOP_K = 5

# 검색 결과에 허용되는 최대 의미 거리를 결정한다.
# 이 값보다 거리가 큰 결과는 필터링될 수 있다.
VECTOR_DISTANCE_THRESHOLD = 0.7

memory_service = VertexAiRagMemoryService(
    rag_corpus=RAG_CORPUS_RESOURCE_NAME,
    similarity_top_k=SIMILARITY_TOP_K,
    vector_distance_threshold=VECTOR_DISTANCE_THRESHOLD
)

두 매개변수의 역할이 명확합니다. SIMILARITY_TOP_K는 검색할 상위 유사 결과 수를 정의하고, VECTOR_DISTANCE_THRESHOLD는 검색 결과의 의미 거리 상한값을 설정합니다.

③ LangChain + LangGraph

# --- 1. 데이터 준비(전처리) ---
loader = TextLoader('./state_of_the_union.txt')
documents = loader.load()

# 문서 청킹
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = text_splitter.split_documents(documents)

# 청크를 임베딩하여 Weaviate에 저장
client = weaviate.Client(embedded_options=EmbeddedOptions())
vectorstore = Weaviate.from_documents(
    client=client, documents=chunks,
    embedding=OpenAIEmbeddings(), by_text=False
)
retriever = vectorstore.as_retriever()
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)

# --- 2. LangGraph용 상태 정의 ---
class RAGGraphState(TypedDict):
    question: str
    documents: List[Document]
    generation: str

# --- 3. 노드(함수) 정의 ---
def retrieve_documents_node(state: RAGGraphState) -> RAGGraphState:
    """사용자의 질문을 기반으로 문서를 검색한다."""
    question = state["question"]
    documents = retriever.invoke(question)
    return {"documents": documents, "question": question, "generation": ""}

def generate_response_node(state: RAGGraphState) -> RAGGraphState:
    """검색된 문서를 바탕으로 LLM을 사용하여 응답을 생성한다."""
    question = state["question"]
    documents = state["documents"]

    template = """You are an assistant for question-answering tasks.
Use the following pieces of retrieved context to answer the question.
If you don't know the answer, just say that you don't know.
Use three sentences maximum and keep the answer concise.
Question: {question}
Context: {context}
Answer:
"""
    prompt = ChatPromptTemplate.from_template(template)
    context = "\n\n".join([doc.page_content for doc in documents])

    rag_chain = prompt | llm | StrOutputParser()
    generation = rag_chain.invoke({"context": context, "question": question})
    return {"question": question, "documents": documents, "generation": generation}

# --- 4. LangGraph 그래프 구축 ---
workflow = StateGraph(RAGGraphState)
workflow.add_node("retrieve", retrieve_documents_node)
workflow.add_node("generate", generate_response_node)
workflow.set_entry_point("retrieve")
workflow.add_edge("retrieve", "generate")
workflow.add_edge("generate", END)
app = workflow.compile()

“모르면 모른다고 말하라”“최대 세 문장으로 간결하게” 라는 프롬프트 지시가 눈에 띕니다. 환각을 억제하고 출력을 통제하는 장치입니다.

정리

지식 검색이란 무엇인가

LLM은 인상적인 텍스트 생성 능력을 갖고 있지만 근본적으로 학습 데이터에 의해 제한됩니다. 이 지식은 고정되어 있어 실시간 정보나 비공개 데이터, 도메인에 특화된 데이터를 포함하지 않습니다. 따라서 응답이 오래되었거나 부정확할 수 있고, 전문 작업에 필요한 구체적인 맥락이 부족할 수 있습니다.

왜 사용하는가?

RAG 패턴은 LLM을 외부 지식 소스에 연결하는 표준화된 해법입니다. 질의가 수신되면 시스템이 먼저 지정된 지식 기반에서 관련 정보 조각을 검색하고, 이 조각이 원래 프롬프트에 추가되어 시의적절하고 구체적인 맥락을 더합니다. 이 과정을 통해 LLM은 내부 지식만으로 추론하는 시스템에서, 펼쳐 놓은 자료를 참고하며 답하는 시스템으로 바뀝니다.

언제 사용해야 하는가?

LLM의 원래 학습 데이터에 포함되지 않은 구체적이고 최신이며 비공개인 정보를 바탕으로 질문에 답하거나 콘텐츠를 생성해야 할 때 이 패턴을 사용한다. 내부 문서 질의응답 시스템, 고객 지원 봇, 인용이 포함된 검증 가능한 사실 기반 응답이 필요한 애플리케이션을 구축할 때 적합하다.

핵심 정리

  • 지식 검색은 LLM이 외부의 최신 정보와 특정 정보에 접근할 수 있게 하여 그 역량을 확장한다.
  • 이 과정은 검색(지식 기반에서 관련 조각 탐색)과 증강(이 조각을 프롬프트에 추가)으로 이루어진다.
  • RAG는 오래된 학습 데이터의 한계를 극복하고, 환각을 줄이며, 도메인 특화 지식을 통합할 수 있게 한다.
  • 응답이 검색된 출처에 근거하므로 출처를 제시할 수 있는 답변이 가능해진다.
  • 그래프 RAG는 지식 그래프로 정보 간 관계를 파악해 여러 출처의 데이터를 종합해야 하는 복잡한 질문에도 답할 수 있다.
  • 에이전틱 RAG는 단순한 정보 검색을 넘어 지능형 에이전트가 외부 지식을 능동적으로 추론하고 검증하며 개선한다.

마치며

RAG는 LLM이 고정된 지식에 머무른다는 핵심 한계를 외부의 최신 데이터 소스와 연결해 해결합니다. 응답을 검증 가능한 데이터에 근거하게 하여 사실 오류를 크게 줄이고, 비공개 정보를 활용할 수 있게 하며, 출처 표시를 통해 신뢰를 높입니다.

에이전틱 RAG는 검색된 지식을 능동적으로 검증·조정·종합하는 추론 계층을 도입해 신뢰성을 더욱 높이고, 그래프 RAG는 지식 그래프로 명시적인 데이터 관계를 탐색합니다. 이러한 고급 방식은 복잡성과 지연 시간이 늘어나지만, 최종 응답의 깊이와 신뢰성을 크게 높여 줍니다.

결국 RAG는 LLM을, 내부 지식만으로 대화하는 시스템에서 외부 지식을 펼쳐 놓고 추론하는 강력한 도구로 바꿔 놓는다.

참고 문헌