이 글에서는 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 개발 및 성능 최적화
'Data Engineering > Data Infra & Process' 카테고리의 다른 글
[18편] pgvector 기반 AI 검색 시스템의 확장 및 운영 전략 (0) | 2025.03.16 |
---|---|
[17편] 대규모 벡터 데이터 최적화 및 비용 절감 전략 (0) | 2025.03.16 |
[15편] AI 모델을 활용한 벡터 데이터 분석 (0) | 2025.03.07 |
[14편] 실시간 스트리밍 데이터와 pgvector 연동 (0) | 2025.03.07 |
[13편] 운영 자동화 (Airflow & Kubernetes) (0) | 2025.03.07 |