LangChain과 Pinecone으로 사내 문서 검색 시스템 구축
배경
사내 Confluence와 Notion에 흩어진 문서들을 효과적으로 검색할 방법이 필요했다. 키워드 기반 검색은 한계가 명확했고, GPT-4가 공개된 후 임베딩 기반 검색을 고려하게 되었다.
아키텍처
기본적인 RAG(Retrieval-Augmented Generation) 패턴을 따랐다.
- 문서를 청크 단위로 분할 (500 토큰)
- OpenAI
text-embedding-ada-002로 임베딩 생성 - Pinecone에 벡터 저장
- 쿼리 시 유사도 검색 후 GPT-4에 컨텍스트로 전달
구현
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Pinecone
from langchain.text_splitter import RecursiveCharacterTextSplitter
import pinecone
pinecone.init(api_key=PINECONE_API_KEY, environment="us-west1-gcp")
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50
)
chunks = text_splitter.split_documents(documents)
embeddings = OpenAIEmbeddings()
vectorstore = Pinecone.from_documents(chunks, embeddings, index_name="docs")
검색 시에는 간단하게 similarity search를 수행했다.
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
qa = RetrievalQA.from_chain_type(
llm=OpenAI(model="gpt-4"),
retriever=vectorstore.as_retriever(search_kwargs={"k": 3})
)
result = qa.run("배포 프로세스가 어떻게 되나요?")
이슈
청크 크기 선정이 까다로웠다. 너무 작으면 맥락이 끊기고, 크면 관련 없는 내용이 섞였다. 여러 테스트 끝에 500 토큰, 오버랩 50 토큰이 적당했다.
Pinecone 무료 티어는 1M 벡터까지인데, 문서가 많아지면 비용 고려가 필요할 것 같다.
소감
LangChain이 추상화를 잘 해놔서 빠르게 프로토타입을 만들 수 있었다. 다만 프로덕션에선 더 세밀한 튜닝이 필요할 듯하다.