Skip to content

Repository files navigation

챗봇의 정석 BackEnd

소개 관련 링크
챗봇의 정석의 고객과 소통하는 백엔드 서버 원격 저장소입니다.
FastAPI를 기반으로 로그인·페르소나 관리, LLM서버 응답 파싱 등의 REST API를 제공합니다.
/api/chat/ws WebSocket 엔드포인트를 통해 실시간 채팅을 처리하고, LLM 서버·MCP 서버와 연동하여 카드 추천,
FAQ/용어 검색 등 도메인 툴 호출 결과를 클라이언트에 전달
합니다.
PostgreSQL 기반으로 채팅 로그 및 QnA 데이터를 관리하며, Docker·Jenkins·ALB+EC2 환경에서 운영될 수 있도록 설계되었습니다.
🔗챗봇의 정석
🔗FrontEnd
🔗LLM서버
🔗MCP서버
🔗DB서버

🧾 API 명세

토글을 열어 사용가능한 HTTP 및 WebSocket 엔드포인트의 요약 정보를 확인하세요.

Health (/api/health)

Health

엔드포인트 메서드 설명 요청 성공 응답 주요 오류
/api/health GET 애플리케이션 상태 점검 요청 본문/파라미터 없음 200 OK
{"status": "ok"}
없음

Chat (/api/chat)

Chat (/api/chat)

엔드포인트 메서드 설명 요청 성공 응답 주요 오류
/api/chat/feedback POST 챗봇 응답(툴 호출 포함)에 대한 유용성 피드백 저장 JSON Body (FeedbackRequest)
{ "message_id": "<uuid>", "is_helpful": true|false|null }
(message_id는 사용자의 프롬프트 메시지 ID)
200 OK
{ "status": "success", "message_id": "<uuid>", "feedback_received": true|false|null }
500: DB 오류

Login (/api/login)

Login (/api/login)

엔드포인트 메서드 설명 요청 성공 응답 주요 오류
/api/login/ POST WebSocket 세션과 페르소나를 매핑하고 MCP 추천 툴 호출 JSON Body (LoginRequest)
{ "session_id": "<uuid>", "persona_id": int }
200 OK (본문 없음). 성공 시 내부적으로 MCP consumption_recommend 툴 호출 후 WebSocket으로 카드/추천 응답 전송 422: 잘못된/누락된 session_id
404: ConnectionManager에 세션 없음
502: MCP 호출 실패
500: DB 또는 기타 서버 오류
/api/login/personas GET 페르소나 목록 (로그인 화면 용) 조회 없음 200 OK
{"personas": [...]} (/chat/personas와 동일)
500: DB/서버 오류
/api/login/persona_id POST 주어진 세션에 연결된 페르소나 확인 JSON Body (PersonaRequest)
{ "session_id": "<uuid>" }
200 OK
{ "persona_id": int|null }
422: 잘못된 세션 ID 형식
404: 세션 미존재

QnA (/api/qna)

QnA (/api/qna)

엔드포인트 메서드 설명 요청 성공 응답 주요 오류
/api/qna/faq GET 조회수가 높은 FAQ 상위 K건 조회 및 캐시 Query Param top_k (기본 3) 200 OK
[ { "faq_id": int, "question": str, "answer": str, "views": int }, ... ]
500: DB/서버 오류
/api/qna/terms GET 조회수가 높은 금융 용어 상위 K건 조회 및 캐시 Query Param top_k (기본 6) 200 OK
[ { "term_id": int, "term": str, "definition": str }, ... ]
500: DB/서버 오류

참고: faq_cacheterms_cache/api/qna 엔드포인트 호출 시 메모리에 저장되며, 이후 /api/chat/ws에서 FAQ·용어 질문과 정확히 일치하는 입력이 들어오면 DB 호출 대신 캐시된 답변을 즉시 반환합니다.


WebSocket (/api/chat/ws)

WebSocket (/api/chat/ws)

항목 내용
URL /api/chat/ws
핸드셰이크 클라이언트가 연결하면 서버가 임의의 session_id를 생성하고 {"session_id": "<uuid>"} JSON을 즉시 전송. 이후 REST /api/login/을 통해 세션과 사용자 페르소나 ID를 매핑해야 개인 소비데이터 기반 카드 추천 기능 사용 가능
클라이언트 → 서버 메시지 JSON 문자열이어야 하며 최소 message_id(UUID), message(str)가 필요. JSON 형식 오류 시 서버가 {"error": "Invalid JSON format"} 전송 후 다음 메시지를 대기
서버 → 클라이언트 기본 응답 { "sender": "bot", "timestamp": "<ISO8601>", "message_id": "<uuid>", "login_required": false, "message": "<answer>", "card_list": [...?], "related_questions": [...?], "tool_name": "..." } (card_list, related_questions, tool_name은 툴 호출 시에만 존재)
동작 흐름 1) 사용자 메시지를 DB Chat 테이블에 저장 → 2) FAQ/용어 캐시 히트 여부 확인 → 3) 미스일 경우 MCP Router (LLMSERVER_URL/llm/mcp-router/dispatch) 호출 → 4) 응답을 WebSocket으로 전송하고 ChatbotResponse에 툴 메타데이터 저장
에러 처리 LLM 호출 실패 시 "message"에 에러 설명을 포함한 봇 응답 전송. 기타 예외 발생 시 {"error": "Internal Server Error: ... "} 메시지가 내려가며 연결이 종료될 수 있음. 클라이언트가 연결 해제하면 WebSocketDisconnect를 기록하고 매핑을 제거

⚒️ 기술 스택

  • FastAPI, SQLModel/SQLAlchemy, asyncpg

  • uvicorn + Docker + Jenkins

  • ALB + EC2

📁 프로젝트 구조

.
├── Dockerfile                     # 컨테이너 이미지를 만들기 위한 Docker 빌드 설정
├── Jenkinsfile                    # Jenkins CI/CD 파이프라인 설정
├── api                            # FastAPI 라우터 및 엔드포인트 정의
│   ├── router.py                  # 공통 APIRouter 설정 및 라우터 등록
│   └── routes                     # 개별 기능별 라우트 모듈
│       ├── chat.py                # 채팅 관련 REST API 엔드포인트
│       ├── health.py              # 헬스체크 엔드포인트
│       ├── login.py               # 로그인/세션 관련 엔드포인트
│       ├── qna.py                 # QnA 관련 엔드포인트
│       └── ws.py                  # WebSocket 채팅 엔드포인트
├── core                           # 핵심 설정 및 앱 초기화 코드
│   ├── config.py                  # 환경변수, 설정값 로딩 및 Config 객체
│   ├── db.py                      # DB 세션/엔진 설정
│   └── setup.py                   # 앱 구동 시 초기 설정/의존성 등록
├── crud                           # DB CRUD (데이터베이스 접근 로직)
│   ├── chat.py                    # 채팅 기록/세션 관련 CRUD 함수
│   ├── persona.py                 # 페르소나 관련 CRUD 함수
│   ├── qna.py                     # QnA 데이터 관련 CRUD 함수
│   └── session.py                 # 사용자 세션/토큰 관련 CRUD 함수
├── data                           # 애플리케이션이 사용하는 정적 데이터
│   └── personas.json              # 사용자 페르소나 정보 시딩 목적 JSON 데이터
├── docker-scripts                 # Docker 빌드/실행 자동화 스크립트
│   ├── build.sh                   # Docker 이미지 빌드 스크립트
│   └── run.sh                     # Docker 컨테이너 실행 스크립트
├── main.py                        # FastAPI 앱 엔트리포인트 (uvicorn 실행 대상)
├── models.py                      # ORM 모델 정의
├── requirements.in                # 의존성 원본 목록 (pip-compile 입력용)
├── requirements.txt               # 고정된 의존성 버전 목록 (배포/빌드용)
├── schemas                        # 요청·응답/도메인 스키마
│   ├── chat.py                    # 채팅 관련 요청/응답 스키마
│   ├── login.py                   # 로그인/인증 관련 스키마
│   └── persona.py                 # 페르소나 관련 스키마
└── tests                          # 테스트 코드
    ├── conftest.py                # pytest 공통 설정 및 fixture 정의
    ├── data                       # 테스트용 샘플 데이터
    │   ├── chat_history.json      # 채팅 이력 테스트 데이터
    │   └── personas.json          # 페르소나 테스트 데이터
    ├── test_dummy_chat_api.py     # 단위 테스트 (더미/기본 채팅 API 테스트)
    └── test_integration_chat_api.py # 통합 테스트 (실제 API 플로우 테스트)

⚙️ 환경 변수 & 서버 실행

  • 환경 변수 (.env)

    FRONTEND_HOST=http://127.0.0.1:4173  # CORS 허용 도메인/포트
    LLMSERVER_URL=http://127.0.0.1:8000  # LLM 서버 주소
    DATABASE_URL=postgresql+asyncpg://<USER>:<PASSWORD>@<PG_URL>/ChatDB     # 채팅 로그 DB
    FAQ_DATABASE_URL=postgresql+asyncpg://<USER>:<PASSWORD>@<PG_URL>/card_qna_db # QnA DB
    HTTPX_TIMEOUT=300.0                  # LLM 응답 제한 시간 설정
    ENVIRONMENT=development              # 개발/운영 환경 설정
    MCP_SERVER_URL=http://127.0.0.1:8011 # MCP 서버 주소
  • 서버 실행

    docker build -t chatbot-backend . # Docker 이미지 빌드
    # Docker 컨테이너 실행
    docker run -d -p 8001:8001 --env-file .env --name chatbot-backend chatbot-backend
    • 브라우저에서 http://127.0.0.1:8001/docs 로 OpenAPI 문서를 확인할 수 있습니다.
  • 서버 실행 (Docker 미사용)

    • python-3.12.12
    python -m venv .venv            # 가상환경 생성
    source .venv/bin/activate       # 가상환경 활성화 (Windows: .venv\Scripts\activate)
    pip install -r requirements.txt # 의존성 설치
    uvicorn main:app --host 0.0.0.0 --port 8001 # 서버 실행

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages