티스토리 뷰
FastAPI 기반 로컬 LLM + RAG 챗봇 만들기 – LangChain 및 RAG 개념과 활용
octo54 2025. 2. 26. 13:30FastAPI 기반 로컬 LLM + RAG 챗봇 만들기 – LangChain 및 RAG 개념과 활용
1.2.3 LangChain 및 RAG 개념 소개
이번 글에서는 **LangChain과 RAG(Retrieval-Augmented Generation)**의 개념을 살펴보고, 이를 활용하여 LLM의 응답 정확도를 향상시키는 방법을 알아봅니다.
1. LangChain이란?
🔹 LangChain 개요
LangChain은 LLM 애플리케이션을 쉽게 개발할 수 있도록 지원하는 오픈소스 프레임워크입니다.
주요 역할은 LLM과 데이터베이스, 외부 API, 문서 저장소 등을 연동하여 보다 정교한 AI 애플리케이션을 구축하는 것입니다.
✅ LangChain의 핵심 기능
- LLM과 외부 데이터 연동 (RAG 구현)
- LLM 응답 최적화 및 프롬프트 관리
- 메모리 지원 (이전 대화 상태 유지 가능)
- LLM 기반 에이전트 및 워크플로우 구축
✅ LangChain이 필요한 이유
기본적으로 LLM은 사전 학습된 지식만을 기반으로 응답을 생성합니다.
하지만, 최신 데이터나 사용자 지정 문서 기반 응답을 생성하려면 LangChain을 활용하여 LLM이 실시간으로 외부 데이터를 검색(RAG)하고 반영할 수 있도록 해야 합니다.
2. PostgreSQL + LangChain + pgvector 설정
1️⃣ 필요한 패키지 설치
pip install langchain langchain-community transformers sentence-transformers chromadb pgvector psycopg2-binary
2️⃣ PostgreSQL 연결 설정 (with 구문 사용)
from langchain_community.embeddings import HuggingFaceEmbeddings
import psycopg2
# PostgreSQL 연결 정보
DB_CONFIG = {
"dbname": "rag_db",
"user": "admin",
"password": "password",
"host": "localhost",
"port": "5432"
}
# 벡터 저장을 위한 테이블 생성 (with 구문 사용)
with psycopg2.connect(**DB_CONFIG) as conn:
with conn.cursor() as cur:
cur.execute("""
CREATE TABLE IF NOT EXISTS documents (
id SERIAL PRIMARY KEY,
content TEXT,
embedding VECTOR(768) -- 한국어 임베딩 모델 사용 (768차원)
);
""")
conn.commit()
3. 문서 데이터 저장 (임베딩 포함)
# Hugging Face 한국어 임베딩 모델 사용
embeddings = HuggingFaceEmbeddings(
model_name="jhgan/ko-sroberta-multitask",
encode_kwargs={'normalize_embeddings': True}
)
# 새로운 문서 데이터
documents = [
"FastAPI는 Python 기반의 고성능 웹 프레임워크입니다.",
"LangChain은 LLM 애플리케이션 개발을 지원하는 오픈소스 라이브러리입니다.",
"pgvector는 PostgreSQL에서 벡터 검색을 수행할 수 있도록 지원하는 확장 모듈입니다."
]
# 문서를 벡터로 변환 후 저장
with psycopg2.connect(**DB_CONFIG) as conn:
with conn.cursor() as cur:
for text in documents:
vector = embeddings.embed_query(text)
cur.execute("INSERT INTO documents (content, embedding) VALUES (%s, %s)", (text, vector))
conn.commit()
✅ Hugging Face의 jhgan/ko-sroberta-multitask 모델을 사용하여 문서를 벡터화하고 PostgreSQL에 저장합니다.
✅ with 구문을 사용하여 PostgreSQL 연결을 자동 정리합니다.
4. 문서 검색 기능 (PGVector + Document 객체 변환)
오류 발생 및 원인 분석
TypeError: PGVector.from_documents() missing 2 required positional arguments: 'documents' and 'embedding'
🔥 오류 원인
- PGVector.from_documents()에 전달된 documents 리스트가 문자열 리스트(list[str]) 형태여서, LangChain에서 요구하는 Document 객체 형식이 아님.
- PGVector.from_documents()는 documents 리스트에서 .page_content 속성을 사용하려고 하지만, str 객체에는 해당 속성이 없어 AttributeError가 발생.
✅ 해결 방법
- documents 리스트의 각 요소를 Document 객체로 변환하여 PGVector.from_documents()에 전달해야 함.
수정된 문서 검색 코드
from langchain_community.vectorstores import PGVector
from langchain.schema import Document
# PostgreSQL 연결 문자열
CONNECTION_STRING = "postgresql://admin:password@localhost:5432/rag_db"
# 데이터베이스에서 문서 로드
def get_documents():
with psycopg2.connect(**DB_CONFIG) as conn:
with conn.cursor() as cur:
cur.execute("SELECT content FROM documents")
return [Document(page_content=row[0]) for row in cur.fetchall()] # ✅ `Document` 객체로 변환
# 문서를 Document 객체로 변환
documents = get_documents()
# 벡터 저장소 생성
vectorstore = PGVector.from_documents(
documents=documents,
embedding=embeddings,
connection_string=CONNECTION_STRING,
collection_name="documents"
)
# 검색 실행
query = "FastAPI란 무엇인가?"
results = vectorstore.similarity_search(query)
# 검색 결과 출력
for doc in results:
print("검색된 문서:", doc.page_content)
✅ 문서를 Document 객체로 변환하여 .page_content 속성을 추가했습니다.
✅ 이제 PGVector.from_documents()가 documents 리스트를 올바르게 처리할 수 있습니다.
5. FastAPI를 활용한 API 구현
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class QueryRequest(BaseModel):
query: str
@app.post("/search/")
async def search_documents(request: QueryRequest):
results = vectorstore.similarity_search(request.query)
return {"results": [doc.page_content for doc in results]}
# FastAPI 실행
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000, reload=True)
✅ API를 통해 사용자가 질문을 입력하면 PostgreSQL + pgvector에서 가장 유사한 문서를 찾아 반환합니다.
✅ FastAPI와 LangChain을 결합하여 RAG 기반 검색 기능을 쉽게 구현할 수 있습니다.
6. API 테스트
1️⃣ FastAPI 서버 실행
uvicorn main:app --host 0.0.0.0 --port 8000 --reload
2️⃣ 검색 API 호출
curl -X POST "http://localhost:8000/search/" -H "Content-Type: application/json" -d '{"query": "FastAPI는 어떤 웹 프레임워크인가?"}'
➡️ 가장 유사한 문서가 반환됨
7. 결론 – FastAPI + LangChain + RAG 적용 방향
💡 FastAPI와 LangChain을 활용하여 LLM 기반 RAG 시스템을 구축하면 다음과 같은 이점이 있습니다.
1️⃣ 데이터 유출 없이 기업 내부 문서를 활용하는 AI 챗봇 구축 가능
2️⃣ 최신 정보와 실시간 검색이 필요한 AI 서비스 구현 가능
3️⃣ PostgreSQL + pgvector를 활용하여 성능 최적화 가능
📌 다음 글에서는 FastAPI를 활용하여 LLM 기반 RAG 챗봇을 구축하는 방법을 다룹니다! 🚀
'project > 로컬 LLM + RAG 기반 AI 채팅봇 만들기' 카테고리의 다른 글
🚀 FastAPI 기반 로컬 LLM + RAG 챗봇 만들기 – Ollama 및 LLaMA3 모델 설정 (0) | 2025.02.26 |
---|---|
🚀 FastAPI 기반 로컬 LLM + RAG 챗봇 만들기 – Python 및 필수 라이브러리 설치 (0) | 2025.02.26 |
FastAPI 기반 로컬 LLM + RAG 챗봇 만들기 – Ollama를 활용한 로컬 LLM 개념 및 활용 (0) | 2025.02.26 |
FastAPI 기반 로컬 LLM + RAG 챗봇 만들기 – 주요 기술 스택 소개 (0) | 2025.02.26 |
FastAPI 기반 로컬 LLM과 RAG를 활용한 챗봇 - 프로젝트 개요 (1) | 2025.02.25 |
- Total
- Today
- Yesterday
- Ktor
- Next.js
- Page
- 관리자
- REACT
- Docker
- PostgreSQL
- nextJS
- 프론트엔드
- til
- 개발블로그
- Python
- rag
- github
- 리액트
- nodejs
- 백엔드개발
- LangChain
- Webpack
- fastapi
- AI챗봇
- Project
- llm
- babel
- 웹개발
- 챗봇개발
- 로컬LLM
- 페이지
- 백엔드
- kotlin
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |