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