LangChain + Pinecone으로 문서 검색 시스템 구축하기
배경
사내 Confluence에 쌓인 기술 문서가 3000개를 넘어서면서 검색이 어려워졌다. 키워드 기반 검색으로는 원하는 내용을 찾기 힘들고, 신입 개발자들이 온보딩 과정에서 반복적인 질문을 하는 상황이 잦았다.
RAG(Retrieval-Augmented Generation) 방식을 적용해 문서 검색 시스템을 만들기로 했다.
기술 스택 선택
- LangChain: 문서 로딩, 청킹, 임베딩 파이프라인 구성
- Pinecone: 벡터 DB (관리형 서비스로 운영 부담 적음)
- OpenAI API: text-embedding-ada-002, gpt-3.5-turbo
구현 과정
1. 문서 임베딩
from langchain.document_loaders import ConfluenceLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Pinecone
import pinecone
# Confluence 문서 로드
loader = ConfluenceLoader(
url="https://company.atlassian.net/wiki",
username=os.getenv("CONFLUENCE_USER"),
api_key=os.getenv("CONFLUENCE_API_KEY")
)
documents = loader.load()
# 청킹 (1000자 단위, 200자 오버랩)
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
splits = text_splitter.split_documents(documents)
# Pinecone 인덱스 생성 및 업로드
pinecone.init(api_key=os.getenv("PINECONE_API_KEY"))
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-3.5-turbo", temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever(search_kwargs={"k": 3}),
return_source_documents=True
)
result = qa_chain({"query": "배포 프로세스가 어떻게 되나요?"})
print(result["result"])
결과 및 개선점
초기 테스트에서 정확도는 약 75% 정도였다. 청크 사이즈를 조정하고 메타데이터(작성일, 작성자, 태그)를 필터링 조건으로 추가하니 체감 품질이 올라갔다.
비용은 월 $150 정도 발생했다. 임베딩 비용이 초기에만 들고, 이후엔 질의 시 검색 + GPT 호출 비용만 든다.
다음은 프롬프트 엔지니어링을 통해 hallucination을 줄이고, 답변 불가능한 질문에 대한 처리를 개선할 예정이다.