토이 프로젝트 3 | Fast API를 활용한 OpenAI 챗봇 개발 (RDB 파트)
💡 AI 챗봇 프로젝트 정리 – FastAPI와 함께한 나의 RDB 파트 개발기
최근 우리 팀에서는 쇼핑몰 서비스에 AI 챗봇을 연동하는 프로젝트를 진행하고 있다.
사용자가 자연어로 질문하면, 챗봇이 의도를 파악하고, RAG 방식으로 RDB에서 데이터를 조회해 LLM에 전달하여 자연스러운 응답을 생성하는 구조다.
🧠 프로젝트 흐름
사용자 질문 → 의도 분류 → RDB 쿼리 수행 → LLM 응답 구성 → 사용자에게 자연어 응답
- FastAPI: 비동기 API 서버
- MySQL: 쇼핑몰 서비스의 주요 데이터 저장
- databases + aiomysql: 비동기 DB 연결
- LangChain / GPT 기반 LLM: 응답 생성
- Spring Boot: 로그인 인증 및 JWT 토큰 발급
🔧 내가 맡은 역할
나는 팀에서 RDB 파트를 담당했다.
사용자 질문에 맞는 데이터를 MySQL에서 조회할 수 있도록 쿼리 작성부터
FastAPI 비동기 API로 노출하고,
LLM이 사용할 수 있도록 응답을 자연어 형태로 변환하는 작업을 진행했다.
세팅을 위해 설치한 주요 패키지 및 도구
📁 가상환경
- Python 가상환경 사용
.venv
디렉토리로 관리
python -m venv .venv
source .venv/bin/activate # macOS/Linux
🚀 FastAPI 및 서버 실행 관련
pip install fastapi
pip install "uvicorn[standard]"
fastapi: 비동기 웹 프레임워크
uvicorn: ASGI 기반 서버 실행
🐬 비동기 MySQL 연동용
pip install databases
pip install aiomysql
databases: 비동기 ORM 스타일 DB 인터페이스
aiomysql: MySQL 비동기 드라이버
🔐 인증 및 보안 관련
pip install python-dotenv
pip install cryptography
python-dotenv: .env 환경변수 파일 불러오기
cryptography: sha256_password, caching_sha2_password 대응용 (MySQL 로그인 보안)
🧾 기타
pip install pymysql
pymysql: MySQL 드라이버 (databases 내부 의존성)
📌 내가 구현한 주요 엔드포인트
API | 설명 |
---|---|
GET /products/ |
키워드/카테고리 기반 상품 목록 조회 |
GET /products/llm-response |
LLM 응답용 상품 정보 포맷 반환 |
GET /stock |
상품 이름 기반 매장별 재고 조회 |
GET /orders |
회원 주문 목록 조회 |
GET /orders/llm-response |
LLM 응답용 주문 목록 요약 |
GET /orders/items/llm |
order_code 기반 상세 주문 조회 |
POST /refunds/by-order-code |
환불 요청 (결제 금액 초과 방지 포함) |
GET /refunds |
환불 요청 내역 조회 (LLM 응답 포함) |
GET /store-info |
지역 기반 매장 목록 조회 |
GET /store-info/llm-response |
LLM 응답용 매장 정보 요약 |
GET /deliveries |
배송 현황 목록 조회 |
GET /deliveries/llm-response |
배송 현황 LLM 요약 응답 |
📁 개발 중 포인트
- 쿼리 작성 시
CommonCode
테이블을 조인하여 상태값을 사람이 이해할 수 있는 한글명으로 변환 - 모든 API는
Depends(get_current_user_id)
로 로그인 인증 필요 order_code
→order_id
변환 로직도 별도 API로 처리- LLM 응답은 리스트를 사람이 읽기 쉬운 문장으로 구성하는
format_*_for_llm()
함수로 생성
🧪 예시 응답 (LLM 용)
```json
{
"message": "총 3건의 주문이 있습니다:\n1. 주문번호: 20250415... 총액 25,000원 → 결제 금액 20,000원\n결제 방식: 카드 / 상태: 결제 완료"
}
📝 배운 점
쿼리 동적 처리 (:param IS NULL OR 컬럼 = :param) 를 통해 유연한 필터링 구현
FastAPI에서 비동기 DB 핸들링 (await database.fetch_all())
실제 운영 시스템에서 사용하는 테이블 구조를 분석하고, LLM 응답까지 고려한 API 설계
👉 이 프로젝트는 실제 서비스에서 AI 챗봇이 어떤 식으로 정보를 조회하고 응답을 생성하는지 백엔드 레벨에서 경험해볼 수 있는 좋은 기회였다.
또한, 단순히 데이터를 조회하는 것에서 나아가 "사람이 이해할 수 있는 문장"으로 바꾸는 흐름을 직접 만들어봤다는 점이 의미 있었다.