LangChain과 Pinecone으로 사내 문서 검색 시스템 구축
배경
사내 Confluence에 쌓인 기술 문서가 500개를 넘어가면서 필요한 정보를 찾기 어려워졌다. 키워드 검색만으로는 비슷한 내용을 다룬 문서를 놓치는 경우가 많았고, 신입 개발자들이 온보딩 과정에서 어려움을 겪었다.
GPT-4 API가 공개된 시점에 맞춰 임베딩 기반 검색 시스템을 도입하기로 했다.
구현 방식
1. 문서 임베딩
Confluence API로 마크다운을 추출하고 OpenAI의 text-embedding-ada-002 모델로 벡터화했다.
from langchain.embeddings import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
chunks = text_splitter.split_documents(documents)
embeddings = OpenAIEmbeddings()
2. 벡터 저장소
Pinecone을 선택했다. 관리형 서비스라 운영 부담이 적고, 무료 티어로 시작할 수 있었다.
from langchain.vectorstores import Pinecone
import pinecone
pinecone.init(api_key=PINECONE_API_KEY, environment="us-west1-gcp")
index_name = "internal-docs"
vectorstore = Pinecone.from_documents(
chunks, embeddings, index_name=index_name
)
3. 질의응답 체인
LangChain의 RetrievalQA 체인을 사용해 관련 문서를 찾고 GPT-4로 답변을 생성했다.
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,
chain_type="stuff",
retriever=vectorstore.as_retriever(search_kwargs={"k": 3})
)
result = qa_chain.run("배포 프로세스는 어떻게 되나요?")
결과
- 검색 정확도가 체감상 크게 개선되었다
- "이거 어디 문서에 있었는데"라는 질문이 줄었다
- GPT-4 API 비용이 월 $150 정도 나왔는데 충분히 가치 있다고 판단했다
개선 과제
- 청크 사이즈 튜닝 필요 (현재 1000자가 최적인지 검증 안 됨)
- 문서 메타데이터(작성자, 날짜) 활용
- 답변에 출처 문서 링크 자동 첨부