LangChain으로 사내 문서 검색 시스템 구축하기
배경
팀 내부 문서가 Confluence, Notion, Wiki 등에 분산되어 있어 필요한 정보를 찾기 어렵다는 불만이 계속 나왔다. GPT-4 API가 공개된 이후 RAG(Retrieval-Augmented Generation) 방식으로 문서 검색 시스템을 만들어보기로 했다.
기술 스택
- LangChain: 문서 로딩, 청크 분할, 체인 구성
- OpenAI API: text-embedding-ada-002, GPT-4
- Pinecone: 벡터 DB
- Python FastAPI: API 서버
구현 과정
1. 문서 임베딩
from langchain.document_loaders import ConfluenceLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Pinecone
# 문서 로드
loader = ConfluenceLoader(
url="https://company.atlassian.net/wiki",
username=username,
api_key=api_key
)
documents = loader.load()
# 청크 분할 (토큰 제한 고려)
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
splits = text_splitter.split_documents(documents)
# 벡터 저장
embeddings = OpenAIEmbeddings()
vectorstore = Pinecone.from_documents(splits, embeddings, index_name="docs")
2. 검색 체인 구성
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": "배포 프로세스는?"})
문제와 해결
청크 크기 조정
초기에 chunk_size를 500으로 설정했더니 문맥이 끊겨 답변 품질이 낮았다. 1000으로 늘리고 overlap을 200으로 설정하니 개선됐다.
비용 관리
GPT-4 API 비용이 생각보다 높아서 임베딩만 배치로 처리하고, 실시간 검색은 캐싱을 적용했다. 자주 묻는 질문은 Redis에 24시간 캐싱한다.
결과
슬랙 봇으로 연동해서 팀원들이 자연어로 문서를 검색할 수 있게 됐다. 정확도는 약 70% 정도로, 완벽하진 않지만 문서 찾는 시간은 확실히 줄었다.
다음 단계로는 파인튜닝과 프롬프트 엔지니어링으로 정확도를 높여볼 계획이다.