LangChain으로 사내 문서 검색 시스템 구축하기

문제 상황

사내 Notion과 Confluence에 흩어진 기술 문서가 300개를 넘어서면서 검색이 비효율적이었다. 키워드 검색으로는 맥락을 이해한 결과를 얻기 어려웠고, 신입 개발자들이 온보딩 문서를 찾는 데 시간을 많이 소비했다.

기술 스택 선정

  • LangChain: 문서 로딩, 청킹, 체인 구성을 위한 프레임워크
  • OpenAI Embeddings: text-embedding-ada-002 모델 사용
  • Pinecone: 벡터 DB (초기에는 FAISS도 고려했으나 프로덕션 운영 편의성 고려)
  • GPT-3.5-turbo: 최종 답변 생성

구현 과정

from langchain.document_loaders import NotionDirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Pinecone
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI

# 문서 로딩 및 청킹
loader = NotionDirectoryLoader("./notion_export")
documents = loader.load()

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200
)
texts = text_splitter.split_documents(documents)

# 임베딩 및 벡터 저장
embeddings = OpenAIEmbeddings()
vectorstore = Pinecone.from_documents(
    texts, embeddings, index_name="internal-docs"
)

# QA 체인 구성
qa = RetrievalQA.from_chain_type(
    llm=OpenAI(temperature=0),
    chain_type="stuff",
    retriever=vectorstore.as_retriever(search_kwargs={"k": 3})
)

성능 개선

초기에는 chunk_size를 500으로 설정했더니 맥락이 끊겨서 답변 품질이 낮았다. 1000으로 늘리고 overlap을 200으로 설정하니 개선되었다.

메타데이터(작성자, 날짜, 문서 타입)를 함께 저장해서 필터링 검색도 가능하게 했다.

retriever = vectorstore.as_retriever(
    search_kwargs={
        "k": 3,
        "filter": {"doc_type": "onboarding"}
    }
)

결과

  • 평균 검색 시간: 5분 → 30초
  • 신입 온보딩 질문 대응 시간 70% 감소
  • 월 OpenAI API 비용: 약 $50 (임베딩 + GPT-3.5)

아직 hallucination 문제가 가끔 발생하는데, 답변에 출처 문서 링크를 함께 표시해서 사용자가 검증할 수 있도록 했다. 내년에는 문서 자동 업데이트 파이프라인을 구축할 예정이다.

LangChain으로 사내 문서 검색 시스템 구축하기