이번 구현은 FastAPI를 활용한 카드 상담 챗봇 서버이다.
추천 → 비교 → 선택 → 질의응답 → 답변 간단화라는 흐름을 한 시스템 안에 담아내는 것이 목표였다.
사용자는 원하는 카드 조건을 입력한다. 예를 들어:
이렇게 입력하면 서버는 FAISS 기반 RAG Retriever를 통해 적합한 카드들을 찾아 추천해주고, 동시에 비교 분석을 제공한다.
그 다음 사용자가 마음에 드는 카드를 선택하면, 선택된 카드의 약관 원문을 바탕으로 질의응답이 가능해진다.
또한 답변이 복잡하게 느껴질 경우, GPT 모델을 활용해 “이 답변을 쉽게 설명해줘”라는 기능도 제공한다.
즉, 이 프로젝트는 단순 REST API 서버를 넘어 실제 상담 챗봇에 가까운 기능을 담고 있다.
FastAPI 서버는 크게 네 가지 파트로 구성되어 있다.
1) 환경 설정 및 초기화
2) 정적 파일 및 기본 엔드포인트
3) 추천/선택/질의응답 API
4) 후처리 기능
▶ 이런 구조를 통해 서버는 단순한 API 서버를 넘어 대화형 상담 시스템의 백엔드 역할을 수행한다.
▶ 즉, /recommend는 챗봇의 첫 단계인 “추천 + 비교” 역할을 맡는다.
@app.post("/recommend")
def recommend(user_input: str = Form(...), card_type: Literal["all","credit","check"]="all", top_k: int = Form(5)):
r = get_retriever()
items, _ = r.find_similar_cards(user_input, card_type, top_k)
comparison = generator.generate_comparison(items, top_k=top_k)
return JSONResponse({"items": items, "summary_text": "", "comparison": comparison})
▶ 이 과정 덕분에 사용자는 추천 → 선택 → 후속 질의응답 흐름을 이어갈 수 있다.
@app.post("/select")
def select(card_name: str = Form(...), card_type: Literal["credit","check"]="credit", keyword: str = Form("")):
selected_card = {...}
save_selected_card(selected_card)
return JSONResponse({"ok": True, "selected": selected_card})
▶ 이 API는 챗봇의 핵심인 문서 기반 질의응답(RAG) 기능을 담당한다.
@app.post("/rag")
def rag(question: str = Form(...), mode: Literal["detailed","simple"]="detailed"):
engine = FAISSRAGRetriever()
resp = engine.query(card_name=selected_card["card_name"], question=question, explain_easy=(mode=="simple"))
return JSONResponse({...})
▶ 이 기능은 원문이 너무 딱딱하거나 법적 용어가 많을 때, 사용자가 쉽게 이해할 수 있도록 돕는다.
@app.post("/simplify")
def simplify(text: str = Form(...)):
msg = [{"role":"system","content":"아래 글을 사용자가 쉽게 이해하도록 재작성해."},{"role":"user","content":text}]
res = client.chat.completions.create(model="gpt-4o", messages=msg)
return {"simplified": res.choices[0].message.content.strip()}
HTML은 채팅 UI를 제공하며, JavaScript를 통해 FastAPI 서버와 통신한다.
1) 입력 폼
2) 추천 결과 표시
3) 질의응답 인터페이스
uvicorn main:app --reload
--reload 옵션 덕분에 코드 수정 시 서버가 자동으로 재시작되어 개발 효율이 높다.
브라우저에서
http://127.0.0.1:8000/
로 들어가면 챗봇 화면이 나타난다.
1) 추천 요청
“병원 관련 카드 추천해줘” 입력
→ 서버가 관련 카드 K개 추천 + 비교 분석 결과 출력
2) 카드 선택
추천된 카드 중 하나를 클릭
→ “🎯 ‘OO카드’를 선택했어요. 이제 질문해보세요” 메시지 출력
3) 질문하기
“이 카드의 주요 약관은 뭐야?” 입력
→ RAG 기반 답변 + 출처 표시
4) 답변 간단화
답변 아래 “💡 이 답변을 쉽게 설명해줘” 버튼 클릭
→ GPT가 간단히 풀어쓴 설명 제공
이런 흐름을 통해 실제 상담과 유사한 경험을 얻을 수 있다.
💭 My Thoughts
이번 구현을 통해 FastAPI의 장점을 많이 체감했다.
- 구현 속도: 라우팅, 폼 처리, JSON 응답이 매우 직관적이었다.
- 데이터 검증: Pydantic을 쓰지 않아도 Form 파라미터로 손쉽게 처리 가능했는데, 덕분에 API 설계가 단순해졌다.
- 프론트 연동: fetch API와 FastAPI가 잘 맞아떨어져, 프론트-백 간 연결이 깔끔했다.
- 확장성: "추천 → 선택 → RAG 질의응답 → 답변 간단화"라는 파이프라인을 하나의 서버에 자연스럽게 녹여낼 수 있었다.