LangChain으로 사내 문서 검색 시스템 구축하기

배경

사내 Confluence에 축적된 기술 문서가 많아지면서 필요한 정보를 찾기 어려워졌다. GPT-4가 나온 지 반년이 지났고, RAG(Retrieval-Augmented Generation) 패턴이 실용적이라는 판단이 들어 직접 구축해보기로 했다.

아키텍처

기본적인 RAG 파이프라인을 구성했다:

  1. Confluence API로 문서 수집
  2. LangChain으로 청크 분할 (RecursiveCharacterTextSplitter)
  3. OpenAI Embeddings로 벡터화
  4. Pinecone에 저장
  5. 질문 시 유사도 검색 후 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의 추상화가 잘 되어 있어 빠르게 프로토타입을 만들 수 있었다. 다만 프로덕션에선 더 세밀한 제어가 필요할 것 같아 일부 로직은 직접 구현하는 방향을 검토 중이다.

LangChain으로 사내 문서 검색 시스템 구축하기