Data Engineering/Data Infra & Process

[16편] pgvector + LangChain을 활용한 AI 챗봇 구축

ygtoken 2025. 3. 16. 17:44
728x90

 

이 글에서는 LangChain과 pgvector를 활용하여 RAG(Retrieval-Augmented Generation) 기반 AI 챗봇을 구축하는 방법을 다룹니다.

특히, 문서를 벡터화하여 pgvector에 저장하고, AI 챗봇이 문서를 검색하여 답변을 생성하는 시스템을 구현하는 과정을 정리합니다.

 

LangChain + pgvector를 활용한 AI 챗봇 구축

RAG 기반 문서 검색을 통해 더욱 정밀한 AI 답변 생성

FastAPI를 활용한 AI 챗봇 API 개발 및 최적화

 


🚀 1. RAG(Retrieval-Augmented Generation) 기반 AI 챗봇이란?

 

RAG는 AI가 단순히 답변을 생성하는 것이 아니라, 먼저 벡터 검색을 수행하여 관련 문서를 찾은 후 답변을 생성하는 방식입니다.

 

기존 AI 모델과 RAG 기반 챗봇 비교

 

방식설명장점

기존 AI 모델 AI가 학습된 데이터만으로 답변 생성 최신 정보 반영이 어려움
RAG 기반 챗봇 AI가 검색된 문서를 활용하여 답변 생성 최신 정보 반영 가능, 신뢰도 높은 답변 생성

 

RAG 기반 AI 챗봇 아키텍처

[사용자 질문] → [문서 벡터 검색 (`pgvector`)] → [AI가 검색된 문서를 기반으로 답변 생성] → [최종 응답 출력]

 

 


🚀 2. 문서 벡터화 및 pgvector 저장

 

LangChain을 활용하여 텍스트 문서를 벡터로 변환한 후 pgvector에 저장하는 과정입니다.

 

📌 필요한 Python 패키지 설치

pip install langchain openai psycopg2

 

📌 Python 코드: 문서를 벡터로 변환 후 pgvector에 저장

from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores.pgvector import PGVector
from langchain.document_loaders import TextLoader

# OpenAI API 키 설정
OPENAI_API_KEY = "your-openai-api-key"
embeddings = OpenAIEmbeddings(openai_api_key=OPENAI_API_KEY)

# PostgreSQL `pgvector` 연결 정보
PGVECTOR_CONFIG = {
    "connection_string": "postgresql://postgres:postgresql@localhost:5432/ragdb"
}

# 문서 로드 및 벡터화
loader = TextLoader("example.txt")
documents = loader.load()

# `pgvector`에 벡터 저장
vectorstore = PGVector.from_documents(documents, embeddings, connection_string=PGVECTOR_CONFIG["connection_string"])

print("Documents successfully stored in pgvector!")

이제 pgvector에 문서 벡터가 저장되었습니다.

 


🚀 3. AI 챗봇 검색 & 답변 생성

 

🔹 1️⃣ LangChain을 활용한 벡터 검색

 

📌 Python 코드: 사용자 질문을 벡터로 변환 후 pgvector에서 검색

from langchain.chains import RetrievalQA
from langchain.llms import OpenAI

# `pgvector`에서 유사한 문서 검색
retriever = vectorstore.as_retriever(search_type="similarity", search_kwargs={"k": 3})

# LangChain QA 시스템 설정
qa = RetrievalQA.from_chain_type(llm=OpenAI(openai_api_key=OPENAI_API_KEY), retriever=retriever)

# 질문 입력
query = "What is PostgreSQL?"
response = qa.run(query)
print(response)

AI 챗봇이 pgvector에서 검색된 문서를 활용하여 답변 생성

 


🔹 2️⃣ FastAPI 기반 AI 챗봇 API 구축

 

이제 FastAPI를 활용하여 AI 챗봇을 API 형태로 배포합니다.

 

📌 Python 코드: FastAPI 기반 챗봇 API (chatbot_api.py)

from fastapi import FastAPI, Query
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI

app = FastAPI()

# `pgvector`에서 문서 검색 기능 설정
retriever = vectorstore.as_retriever(search_type="similarity", search_kwargs={"k": 3})
qa = RetrievalQA.from_chain_type(llm=OpenAI(openai_api_key=OPENAI_API_KEY), retriever=retriever)

@app.get("/chat/")
def chat(query: str = Query(..., description="User input query")):
    response = qa.run(query)
    return {"response": response}

 

📌 FastAPI 실행

uvicorn chatbot_api:app --host 0.0.0.0 --port 8000 --reload

이제 http://localhost:8000/chat/?query=What is PostgreSQL?를 호출하면 AI 챗봇이 응답

 


🚀 4. 성능 최적화를 위한 벡터 검색 튜닝

 

🔹 1️⃣ pgvector 인덱스 최적화

 

벡터 검색 속도를 향상시키기 위해 HNSW 인덱스를 적용할 수 있습니다.

 

📌 HNSW 인덱스 생성

CREATE INDEX embeddings_hnsw ON embeddings USING hnsw (embedding vector_l2_ops);

HNSW를 활용하면 벡터 검색 속도가 10배 이상 향상됨

 


🔹 2️⃣ AI 답변 생성 속도 개선

 

✅ OpenAI API 응답 속도를 줄이기 위해 GPT-3.5 대신 GPT-4 Turbo를 활용

쿼리 캐싱(Query Caching) 을 적용하여 동일한 질문이 반복될 경우 빠르게 응답

 

📌 쿼리 캐싱 적용

from cachetools import LRUCache

cache = LRUCache(maxsize=100)

@app.get("/chat/")
def chat(query: str = Query(..., description="User input query")):
    if query in cache:
        return {"response": cache[query]}
    
    response = qa.run(query)
    cache[query] = response
    return {"response": response}

쿼리 캐싱을 적용하면 동일한 질문의 응답 속도가 향상됨

 


📌 5. 최종 정리

 

LangChain + pgvector를 활용한 AI 챗봇 구축

RAG 기반 문서 검색을 통해 더욱 정밀한 AI 답변 생성

FastAPI를 활용한 AI 챗봇 API 개발 및 성능 최적화

728x90