📂 backend/services/rag_pipeline.py
from retriever.vectordb import search_documents
from generator.prompt_builder import build_prompt
from generator.llm_inference import generate_answer
def rag_pipeline(query: str, top_k: int = 5) -> str:
"""
1. 사용자 질문으로 관련 문서를 검색
2. 검색된 문서와 함께 프롬프트 구성
3. 프롬프트로부터 답변 생성
"""
# 1. 검색
context_docs = search_documents(query, top_k=top_k)
# 2. 프롬프트 조립
prompt = build_prompt(query, context_docs)
# 3. 모델 추론
output = generate_answer(prompt)
return output
- 📂 backend/api/ask.py
(새 파일!)
from fastapi import APIRouter
from pydantic import BaseModel
from services.rag_pipeline import rag_pipeline
router = APIRouter()
# 요청 스키마
class AskRequest(BaseModel):
query: str
top_k: int = 5
# 응답 스키마
class AskResponse(BaseModel):
output: str
@router.post("/ask", response_model=AskResponse)
async def ask(request: AskRequest):
output = rag_pipeline(request.query, top_k=request.top_k)
return {"output": output}
- ✨ 설명
파트 | 설명 |
---|---|
rag_pipeline() | 검색 → 프롬프트 → 생성 모두 처리하는 함수 |
/api/ask | 사용자는 질문만 던지면 된다 (query ) |
- 📂 backend/api/main.py
에 마지막 라우터 추가
from api.ask import router as ask_router
app.include_router(ask_router, prefix="/api")
- ✅ 최종 플로우
POST /api/ask
➔ search_documents()
➔ build_prompt()
➔ generate_answer()
➔ 답변 리턴
(완전 통합 완성형 RAG 파이프라인!)
- 📋 ToDo 체크
✅ RAG 파이프라인 구축
✅ FastAPI /ask
엔드포인트 추가
✅ end-to-end 서비스 완성
- 🚀 테스트 방법
터미널에서 서버 실행 후:
curl -X POST http://localhost:8000/api/ask \
-H "Content-Type: application/json" \
-d '{"query": "중개업자가 사무소를 옮겼을 때 해야 하는 일은?"}'
응답 예시:
{
"output": "중개업자가 사무소를 이전한 경우, 지체 없이 신고하고 간판을 철거해야 합니다."
}
- 🎯 여기까지 요약
단계 | 상태 |
---|---|
Retrieval | 완성 |
Generation | 완성 |
RAG 파이프라인 | 완성 |
API (/search , /generate , /ask ) | 모두 완성 |
- ✍️ 다음 스텝 (선택사항)
✅ Next.js 프론트 연동 (API 호출하는 UI 만들기)
✅ RAG Retrieval 품질 개선 (reranking 추가)
✅ FastAPI Production 준비 (gunicorn, uvicorn worker, etc)