LangChain으로 사내 문서 검색 시스템 구축하기
배경
사내 문서가 Confluence, Notion, Google Docs에 분산되어 있어 필요한 정보를 찾기 어렵다는 피드백이 계속 들어왔다. 키워드 검색으로는 한계가 있어서 GPT-4와 임베딩을 활용한 검색 시스템을 만들기로 했다.
아키텍처
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Pinecone
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 문서 청크 분할
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
chunks = text_splitter.split_documents(documents)
# 벡터 DB에 저장
embeddings = OpenAIEmbeddings()
vectorstore = Pinecone.from_documents(
chunks,
embeddings,
index_name="company-docs"
)
문서를 1000자 단위로 나누고 200자씩 겹치게 했다. 컨텍스트가 끊기는 문제를 방지하기 위해서다.
검색 쿼리 처리
from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(model_name="gpt-4", temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=vectorstore.as_retriever(search_kwargs={"k": 3}),
return_source_documents=True
)
result = qa_chain({"query": "휴가 신청 프로세스는?"})
상위 3개 문서를 가져와서 GPT-4에게 답변을 생성하게 했다. return_source_documents로 출처도 함께 표시했다.
마주친 문제들
1. 임베딩 비용 초기에 모든 문서를 매번 임베딩했더니 API 비용이 급증했다. 문서별로 해시를 저장해서 변경된 것만 재처리하도록 수정했다.
2. 한글 청킹 문제 RecursiveCharacterTextSplitter가 한글 문장 중간을 자르는 경우가 있었다. 직접 kss(Korean Sentence Splitter)를 사용해 문장 단위로 먼저 나눈 후 청크로 묶는 방식으로 개선했다.
3. 답변 정확도 GPT-3.5-turbo를 쓰니 검색된 문서 내용을 무시하고 할루시네이션이 발생했다. GPT-4로 변경하고 프롬프트에 "문서에 없으면 모른다고 답하라"를 추가했다.
결과
베타 테스터 20명 대상으로 2주간 운영한 결과, 평균 검색 만족도가 3.2/5에서 4.1/5로 올랐다. 특히 "이런 경우 어떻게 하나요?" 같은 자연어 질문에 강점을 보였다.
다음 단계로는 Confluence API 연동을 자동화하고, 메타데이터 필터링(부서별, 날짜별) 기능을 추가할 예정이다.