LangChain으로 사내 문서 검색 시스템 구축하기
배경
사내 Confluence에 축적된 기술 문서가 많아지면서 필요한 정보를 찾기 어려워졌다. GPT-4가 나온 지 반년이 지났고, RAG(Retrieval-Augmented Generation) 패턴이 실용적이라는 판단이 들어 직접 구축해보기로 했다.
아키텍처
기본적인 RAG 파이프라인을 구성했다:
- Confluence API로 문서 수집
- LangChain으로 청크 분할 (RecursiveCharacterTextSplitter)
- OpenAI Embeddings로 벡터화
- Pinecone에 저장
- 질문 시 유사도 검색 후 GPT-4로 답변 생성
구현
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Pinecone
import pinecone
# 문서 청킹
splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
chunks = splitter.split_documents(documents)
# 벡터 저장
pinecone.init(api_key=PINECONE_KEY, environment="us-west1-gcp")
embeddings = OpenAIEmbeddings()
vectorstore = Pinecone.from_documents(
chunks, embeddings, index_name="company-docs"
)
검색 시에는 RetrievalQA를 사용했다:
from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI
qa_chain = RetrievalQA.from_chain_type(
llm=ChatOpenAI(model="gpt-4", temperature=0),
retriever=vectorstore.as_retriever(search_kwargs={"k": 4}),
return_source_documents=True
)
result = qa_chain({"query": "배포 프로세스가 어떻게 되나요?"})
개선 포인트
chunk_size를 1000으로 설정했는데, 코드 블록이 많은 문서는 잘리는 경우가 있었다. 문서 타입별로 다른 전략이 필요할 것 같다.
Pinecone 비용이 부담되면 FAISS로 전환하는 것도 고려 중이다. 문서 업데이트 주기가 길어서 로컬 벡터 DB로도 충분할 수 있다.
소감
LangChain의 추상화가 잘 되어 있어 빠르게 프로토타입을 만들 수 있었다. 다만 프로덕션에선 더 세밀한 제어가 필요할 것 같아 일부 로직은 직접 구현하는 방향을 검토 중이다.