SK네트웍스 Family AI캠프 16기

[플레이데이터 SK네트웍스 Family AI캠프 16기] 17주차 회고

minorii 2025. 10. 21. 15:23

일주일 동안 한 일과 느낀 점

10월 14일~10월 20일 동안 팀 프로젝트 **「노인 복지 정책 RAG 챗봇 시스템」**의 백엔드/AI 파이프라인을 최종 통합하고, 문서화 및 기술서 작성 작업을 마무리했다.
이번 주는 단순한 코드 구현을 넘어, RAG 기반 챗봇 시스템을 운영 가능한 수준으로 완성하면서 ‘AI 서비스로서의 제품화’ 감각을 실제로 익힌 시기였다.

프로젝트 전체를 Django로 구성하고 LangChain, ChromaDB, GPT-4o-mini를 연결하며, 데이터 로드·벡터화·리랭킹·응답 생성 등 RAG 파이프라인 전 과정을 직접 구축했다.
이 과정에서 AI가 단순히 답변을 생성하는 것이 아니라, 문서 기반 정확성·출처 근거·개인화된 정보 제공으로 확장되는 기술적 구조를 실감했다.


📌 10월 14일 — RAG 파이프라인 구현 및 검증

🎓 LangChain + ChromaDB + GPT-4o-mini 통합

  • simple_rag_service.py를 중심으로 RAG의 핵심 흐름을 설계했다.
  • Intent 분석 → Query 확장 → Vector 검색 → Hybrid 리랭킹 → Answer 생성의 5단계 구조로 구성해 응답의 품질을 높였다.
  • Hybrid Re-ranking은 Semantic(70%) + TF-IDF(30%) 가중치 조합으로, 의미 기반과 어휘 기반 유사도를 절충했다.

📍느낀 점: RAG의 “Retrieval-Augmented Generation”이 단순한 검색이 아니라 **데이터의 재맥락화(Contextualization)**라는 걸 직접 체감했다.


📌 10월 15일 — 사용자 및 관리자 기능 완성

🎓 Django 인증·피드백·북마크·세션 평가

  • 이메일 회원가입과 카카오 OAuth 로그인까지 통합해 사용자 접근성을 높였다.
  • 각 챗봇 응답에 대한 별점 평가(1~5점), 세션 단위 만족도 평가(0.5 단위), 의견 코멘트 기능을 추가했다.
  • 피드백 데이터를 기반으로 관리자 페이지에서 평균 별점·평가 분포·세션 로그를 시각화할 수 있게 했다.

📍느낀 점: 기능 자체보다 중요한 것은 **데이터 기반 개선 루프(feedback loop)**였다. 사용자의 피드백이 곧 모델 개선의 출발점이 된다는 인사이트를 얻었다.


📌 10월 17일 — 문서 임베딩 및 벡터 데이터베이스 구축

🎓 복지 정책 데이터 로딩 자동화

  • load_welfare_documents.py 명령어를 통해 전국 17개 지역 복지 정책 PDF/HWP 파일을 자동 파싱하고 임베딩했다.
  • PyMuPDF, pdfplumber, PyPDF2, Tesseract OCR을 4단계 추출 파이프라인으로 구성하여 이미지 기반 문서까지 처리 가능하게 했다.
  • ChromaDB에 약 **30,494개 문서 임베딩 (1536차원 벡터)**를 저장, 검색 속도 및 유사도 최적화를 병행했다.

📍느낀 점: 데이터 품질이 모델 성능을 결정한다는 걸 실감했다. “좋은 임베딩은 결국 잘 정제된 문서로부터 시작된다.”


📌 10월 18일 — 시스템 문서화 및 아키텍처 정리

🎓 README 및 기술 문서 작성

  • 백엔드 구조, API 명세, ERD, 환경변수, RAG 처리 흐름을 5-Layer Architecture 기반으로 문서화했다.
  • 사용자/관리자 페이지, Django 명령어, API 요청 예시까지 모두 표준화하여 프로젝트의 재현성을 확보했다.

📍느낀 점: 기술 문서화는 단순한 정리가 아니라 프로젝트의 유지보수성을 높이는 개발의 마지막 단계라는 걸 깨달았다.


📌 10월 19일 — 통합 테스트 및 트러블슈팅

🎓 운영 환경 점검 및 문제 해결

  • 302 리다이렉트, ChromaDB 비어 있음, API 키 불일치 등 배포 시 자주 발생하는 문제를 정리하고 해결법을 문서에 포함했다.
  • python manage.py runserver로 로컬 테스트 후, 로그인→질의→출처 확인→피드백→북마크까지 전 과정 정상 동작 확인.

📍느낀 점: 개발 후반의 대부분은 “에러를 없애는 일”이 아니라 “시스템이 스스로 복원 가능한 구조를 만드는 일”이었다.


성과 및 지표

  • Django 기반 RAG 챗봇 백엔드 완성 및 운영 문서화
  • 전국 17개 지역 복지 정책 약 3만 건 벡터화 및 검색 엔진 구축
  • 사용자 피드백 시스템, 관리자 대시보드, OAuth 로그인까지 서비스화
  • 기술문서/README/ERD/API 명세 등 실무 수준 문서 완성

아쉬웠던 점 & 개선 포인트

  • 모델 개선 루프 부재: 사용자 피드백을 임베딩 재학습이나 RAG 튜닝에 반영하는 파이프라인 미구현
  • 검색 효율성: Top-K 조정 및 Hybrid 가중치 최적화 자동화 미비
  • 배포 자동화: Gunicorn/Nginx, Docker 기반 CI/CD 파이프라인 구축이 향후 과제

마무리

이번 주는 “AI 모델을 활용한 실제 서비스 구축”을 완성 단계까지 끌어올린 시기였다.
단순한 GPT 응답이 아니라, 문서 검색·정확한 출처·사용자 맞춤화·피드백 수집까지 하나의 완결된 AI 제품 형태로 구현했다는 점에서 큰 의미가 있었다.

  • 성능 최적화: 임베딩 캐싱, 벡터 검색 병렬화, Rerank 자동 튜닝
  • 운영 안정화: Docker Compose, Nginx/Gunicorn 설정 및 배포 자동화
  • 데이터 확장: 복지 정책 외 다른 행정/의료/돌봄 데이터로 확장하여 도메인 범위 확대

✅프로젝트 세부 내용

🤖 노인 복지 정책 RAG 챗봇 시스템

RAG(Retrieval-Augmented Generation) 기술을 활용한 지능형 노인 복지 정책 안내 챗봇


 

📋 목차


🎯 프로젝트 소개

노인 복지 챗봇은 RAG(Retrieval-Augmented Generation) 기술을 활용하여 노인과 그 가족들이 복지 정책 정보를 쉽게 찾고 이해할 수 있도록 돕는 지능형 챗봇 시스템입니다.

개발 배경

  • 복잡한 노인 복지 정책 정보를 쉽게 접근할 수 있도록 지원
  • 지역별로 분산된 복지 정책 정보를 통합 제공
  • AI 기반 자연어 대화를 통한 직관적인 정보 검색

핵심 가치

  • 🔍 정확성: 공공 복지 정책 문서 기반 정확한 정보 제공
  • 🤖 편의성: GPT-4o-mini 기반 자연스러운 한국어 대화
  • 📚 맞춤형: 사용자 지역 및 프로필 기반 맞춤 정보 제공
  •  개선: 사용자 피드백 기반 지속적인 서비스 개선

✨ 주요 기능

1. 지능형 RAG 챗봇

일반 사용자 챗봇

  • 자연어 대화: GPT-4o-mini 기반 자연스러운 한국어 질의응답
  • 맥락 이해: 대화 히스토리를 활용한 문맥 기반 응답
  • 정확한 정보: ChromaDB 벡터 검색을 통한 관련 문서 기반 답변
  • 출처 제공: 답변의 근거가 된 문서 출처 표시 (최대 5개)
  • 세션 관리: 여러 대화 세션 생성 및 관리

관리자 검증 챗봇

  • 디버그 정보: RAG 파라미터 실시간 조정 및 성능 테스트
  • 성능 분석: 검색 결과, 리랭킹 점수 등 상세 정보 제공

2. 사용자 관리

회원 인증

  • 일반 회원가입: 이메일 기반 회원가입
  • 카카오 로그인: OAuth 2.0 기반 소셜 로그인
  • 프로필 관리: 나이, 성별, 지역, 장애여부 등 상세 프로필

맞춤형 서비스

  • 지역 기반 검색: 사용자 거주 지역 복지 정책 우선 제공
  • 개인화 추천: Quick Start 기능으로 프로필 맞춤 정책 추천
  • 북마크: 유용한 답변 저장 및 재확인

3. 피드백 시스템

  • 메시지 평가: 각 AI 답변에 대한 별점 평가 (1-5점)
  • 세션 평가: 전체 대화 세션에 대한 만족도 평가 (0.5점 단위)
  • 댓글 작성: 평가와 함께 상세 의견 남기기
  • 분석 대시보드: 관리자용 피드백 통계 및 분석

4. 복지 정책 검색

  • 지역별 검색: 17개 시도별 복지 정책 필터링
  • 카테고리별 분류: 기초연금, 장기요양, 주거지원 등
  • 상세 정보: 신청 자격, 지원 내용, 신청 방법 안내
  • FAQ: 자주 묻는 질문 모음

5. 관리자 기능

  • 대시보드: 사용자 통계, 채팅 로그, 피드백 분석
  • 사용자 관리: 회원 목록, 관리자 권한 부여
  • 채팅 로그: 전체 대화 기록 조회 및 분석
  • 피드백 분석: 평균 별점, 평가 분포, 개선 필요 항목

🛠️ 기술 스택

Backend Framework

  • Django 4.2.25: Python 웹 프레임워크
  • SQLite: 사용자 데이터, 채팅 기록 저장
  • Gunicorn: WSGI HTTP 서버

AI/ML Stack

  • OpenAI GPT-4o-mini: 대형 언어 모델 (답변 생성)
  • OpenAI text-embedding-3-small: 임베딩 모델 (1536차원)
  • LangChain 0.3: RAG 파이프라인 프레임워크
  • ChromaDB 0.4: 벡터 데이터베이스 (30,494개 문서)
  • scikit-learn: TF-IDF 기반 하이브리드 리랭킹

RAG Pipeline Components

Query → Intent Analysis → Query Expansion → Multi-Query
→ Vector Search (ChromaDB) → Hybrid Re-ranking (70% Semantic + 30% TF-IDF)
→ Policy Extraction → Answer Synthesis (GPT-4o-mini) → Response
 

Frontend

  • Bootstrap 5.1.3: 반응형 UI 프레임워크
  • Bootstrap Icons: 아이콘 라이브러리
  • Vanilla JavaScript: AJAX 기반 비동기 통신

Document Processing

  • PyMuPDF (fitz): PDF 텍스트 추출 (1차)
  • pdfplumber: PDF 텍스트 추출 (2차)
  • PyPDF2: PDF 텍스트 추출 (3차)
  • Tesseract OCR: 이미지 기반 PDF OCR (4차)
  • olefile: HWP 문서 처리

DevOps & Deployment

  • Git & GitHub: 버전 관리
  • python-dotenv: 환경변수 관리
  • Whitenoise: 정적 파일 서빙
  • Docker & Docker Compose: 컨테이너화 (선택사항)

🏗️ 시스템 아키텍처

5-Layer Architecture

┌─────────────────────────────────────────────────────────────────┐
│                    Layer 1: User Interface                       │
│  - Web Browser (Bootstrap 5 + Vanilla JS)                       │
│  - AJAX 기반 비동기 통신                                          │
└────────────────────────────┬────────────────────────────────────┘
                             │
┌────────────────────────────▼────────────────────────────────────┐
│                    Layer 2: Django Framework                     │
│  - URL Routing (urls.py)                                        │
│  - View Layer (views.py, feedback_views.py)                     │
│  - Authentication (@login_required)                             │
│  - Session Management                                           │
└────────────────────────────┬────────────────────────────────────┘
                             │
┌────────────────────────────▼────────────────────────────────────┐
│                 Layer 3: Business Logic                          │
│  - SimpleRAGService (simple_rag_service.py)                     │
│  - Advanced RAG Pipeline:                                       │
│    1. Intent Analysis                                           │
│    2. Query Expansion (동의어, 유사어)                           │
│    3. Multi-Query Generation                                    │
│    4. Vector Search (ChromaDB)                                  │
│    5. Hybrid Re-ranking (Semantic 70% + TF-IDF 30%)             │
│    6. Policy Extraction                                         │
│    7. Answer Synthesis (GPT-4o-mini)                            │
└────────────────────────────┬────────────────────────────────────┘
                             │
┌────────────────────────────▼────────────────────────────────────┐
│                    Layer 4: Data Layer                           │
│  ┌─────────────────────┐         ┌────────────────────────┐    │
│  │   SQLite Database   │         │   ChromaDB (Vector)    │    │
│  ├─────────────────────┤         ├────────────────────────┤    │
│  │ • auth_user         │         │ • Collection:          │    │
│  │ • userprofile       │         │   elderly_welfare_docs │    │
│  │ • kakaouser         │         │ • Documents: 30,494    │    │
│  │ • chatsession       │         │ • Embedding: 1536-dim  │    │
│  │ • chatmessage       │         │ • Distance: Cosine     │    │
│  │ • bookmark          │         │                        │    │
│  │ • userfeedback      │         │                        │    │
│  │ • sessionrating     │         │                        │    │
│  └─────────────────────┘         └────────────────────────┘    │
└────────────────────────────┬────────────────────────────────────┘
                             │
┌────────────────────────────▼────────────────────────────────────┐
│               Layer 5: External APIs & Data Source               │
│  ┌──────────────────┐    ┌─────────────────┐   ┌─────────────┐ │
│  │  OpenAI API      │    │  Kakao OAuth    │   │ PDF/HWP     │ │
│  ├──────────────────┤    ├─────────────────┤   │ Documents   │ │
│  │ • GPT-4o-mini    │    │ • Authorization │   │ (17 Regions)│ │
│  │ • Embeddings     │    │ • User Info     │   │             │ │
│  │   (3-small)      │    │ • Logout        │   │             │ │
│  └──────────────────┘    └─────────────────┘   └─────────────┘ │
└─────────────────────────────────────────────────────────────────┘
 

Database ERD

주요 테이블:

  • auth_user: Django 기본 사용자
  • chatbot_web_userprofile: 사용자 프로필 (1:1 with auth_user)
  • chatbot_web_kakaouser: 카카오 로그인 정보 (1:1 with auth_user)
  • chatbot_web_chatsession: 채팅 세션 (1:N with auth_user)
  • chatbot_web_chatmessage: 채팅 메시지 (1:N with chatsession)
  • chatbot_web_bookmark: 북마크 (1:N with auth_user)
  • chatbot_web_userfeedback: 메시지 피드백 (1:N with chatmessage)
  • chatbot_web_sessionrating: 세션 평가 (1:1 with chatsession)

RAG 처리 흐름

사용자 질의
    │
    ▼
[1] Intent Analysis (인사말/관련성 검사)
    │
    ├─ 인사말 → 환영 메시지 반환
    ├─ 비관련 질문 → 안내 메시지 반환
    │
    ▼
[2] Query Expansion (쿼리 확장)
    - 동의어, 유사어 추가
    - "노인" → "어르신, 고령자, 노령층"
    │
    ▼
[3] Multi-Query Generation (다중 쿼리 생성)
    - 다양한 각도로 질문 재구성
    │
    ▼
[4] Vector Search (ChromaDB)
    - 코사인 유사도 기반 검색
    - Top-K 문서 검색 (기본 5개)
    │
    ▼
[5] Hybrid Re-ranking
    - Semantic Score (Vector): 70%
    - Lexical Score (TF-IDF): 30%
    - 최종 순위 재조정
    │
    ▼
[6] Policy Information Extraction
    - 지역, 정책명, 신청자격 등 구조화
    │
    ▼
[7] Answer Synthesis (GPT-4o-mini)
    - 검색된 문서 + 사용자 질의
    - 자연스러운 한국어 답변 생성
    │
    ▼
[8] Response with Sources
    - 답변 + 출처 문서 5개
    - DB 저장 (ChatMessage)
 

🚀 빠른 시작

필요 조건

  • Python: 3.12 이상
  • OpenAI API Key: GPT-4o-mini 및 text-embedding-3-small 사용
  • 서버 사양: 최소 4GB RAM, 20GB 저장공간

로컬 개발 환경 설치

1. 저장소 클론

git clone https://github.com/SKNETWORKS-FAMILY-AICAMP/SKN16-4th-4Team.git
cd SKN16-4th-4Team
 

2. 가상환경 생성 및 활성화

Windows:

python -m venv venv
venv\Scripts\activate
 

Mac/Linux:

python -m venv venv
source venv/bin/activate
 

3. 의존성 설치

pip install -r requirements.txt
 

4. 환경변수 설정

# .env.example 파일을 .env로 복사
cp .env.example .env

# .env 파일 수정
nano .env  # 또는 메모장으로 열기
 

필수 설정 항목:

# Django 설정
SECRET_KEY=your-random-secret-key-here
DEBUG=True
ALLOWED_HOSTS=localhost,127.0.0.1

# OpenAI API
OPENAI_API_KEY=sk-your-openai-api-key-here
OPENAI_MODEL=gpt-4o-mini

# 임베딩 설정
EMBEDDING_MODEL=text-embedding-3-small
EMBEDDING_PROVIDER=openai

# ChromaDB 설정
CHROMA_PERSIST_DIR=./chromadb_storage

# 데이터 경로
DATA_DIRECTORY=./data
 

SECRET_KEY 생성 방법:

python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
 

5. 데이터베이스 마이그레이션

python manage.py migrate
 

6. 정적 파일 수집

python manage.py collectstatic --noinput
 

7. 복지 문서 로드 (ChromaDB 벡터 DB 생성)

# 처음 실행 시 (약 10-15분 소요)
python manage.py load_welfare_documents

# 기존 데이터 삭제 후 재로드
python manage.py load_welfare_documents --clear
 

참고: data/ 폴더에 지역별 PDF/HWP 문서가 있어야 합니다.

8. 슈퍼유저 생성

python manage.py createsuperuser
 
  • Username: admin
  • Email: (선택사항)
  • Password: 원하는 비밀번호 입력

9. 개발 서버 실행

python manage.py runserver
 

10. 브라우저에서 접속


📂 프로젝트 구조

SKN16-4th-4Team/
├── .env                        # 환경변수 (git에서 제외)
├── .env.example                # 환경변수 템플릿
├── .gitignore                  # Git ignore 설정
├── README.md                   # 프로젝트 문서 (이 파일)
├── requirements.txt            # Python 의존성
├── manage.py                   # Django 관리 스크립트
│
├── 노인복지_RAG_챗봇_구현_기술문서.md    # 상세 기술 문서
├── database_schema.dbml        # 데이터베이스 ERD (DBML)
├── API_명세서.md                # API 상세 명세
│
├── config/                     # Django 프로젝트 설정
│   ├── settings.py             # 메인 설정 파일
│   ├── urls.py                 # 루트 URL 라우팅
│   ├── wsgi.py                 # WSGI 설정
│   └── asgi.py                 # ASGI 설정
│
├── apps/                       # Django 앱
│   └── chatbot_web/            # 메인 챗봇 앱
│       ├── models.py           # 데이터 모델
│       │   ├── UserProfile    # 사용자 프로필
│       │   ├── KakaoUser      # 카카오 로그인 정보
│       │   ├── ChatSession    # 채팅 세션
│       │   ├── ChatMessage    # 채팅 메시지
│       │   ├── Bookmark       # 북마크
│       │   ├── UserFeedback   # 메시지 피드백
│       │   └── SessionRating  # 세션 평가
│       │
│       ├── views.py            # 메인 뷰
│       │   ├── home           # 홈페이지
│       │   ├── chat_view      # 챗봇 페이지
│       │   ├── chat_api_message  # 챗봇 API
│       │   ├── profile_view   # 프로필 페이지
│       │   ├── bookmark_*     # 북마크 기능
│       │   ├── admin_*        # 관리자 기능
│       │   └── kakao_*        # 카카오 로그인
│       │
│       ├── feedback_views.py  # 피드백 시스템
│       │   ├── feedback_submit      # 메시지 평가
│       │   ├── session_rating_submit # 세션 평가
│       │   └── feedback_analytics   # 피드백 분석
│       │
│       ├── urls.py             # URL 라우팅
│       ├── admin.py            # Django 관리자 설정
│       ├── apps.py             # 앱 설정
│       │
│       ├── simple_rag_service.py  # RAG 서비스 (핵심)
│       │   └── SimpleRAGService
│       │       ├── _initialize_embeddings()
│       │       ├── _load_vectorstore()
│       │       ├── retrieve_documents()
│       │       └── generate_answer()
│       │
│       ├── management/
│       │   └── commands/
│       │       └── load_welfare_documents.py  # 문서 로드 명령어
│       │
│       └── migrations/         # 데이터베이스 마이그레이션
│
├── templates/                  # HTML 템플릿
│   ├── base.html               # 베이스 템플릿
│   └── chatbot_web/
│       ├── home.html           # 홈페이지
│       ├── chat.html           # 일반 챗봇
│       ├── profile.html        # 프로필 관리
│       ├── profile_edit.html   # 프로필 수정
│       ├── bookmark_list.html  # 북마크 목록
│       ├── quick_start.html    # 맞춤형 추천 (신규)
│       ├── quick_start_simple.html  # 간편 추천 (기존 사용자)
│       ├── policy_list.html    # 정책 목록
│       ├── faq.html            # FAQ
│       ├── admin_dashboard.html     # 관리자 대시보드
│       ├── user_management.html     # 사용자 관리
│       ├── chat_logs.html      # 채팅 로그
│       ├── feedback_analytics.html  # 피드백 분석
│       ├── login.html          # 로그인
│       ├── register.html       # 회원가입
│       └── validation/
│           └── chat.html       # 관리자 검증용 챗봇
│
├── static/                     # 정적 파일
│   ├── photos/                 # 이미지
│   │   └── artificial-intelligence_9325602.png
│   └── (collectstatic 실행 후 생성)
│
├── data/                       # 복지 정책 문서
│   └── 복지로/
│       ├── 전국/               # 전국 단위 정책
│       ├── 서울/               # 서울 정책
│       ├── 부산/               # 부산 정책
│       ├── 대구/
│       ├── 인천/
│       ├── 광주/
│       ├── 대전/
│       ├── 울산/
│       ├── 세종/
│       ├── 경기/
│       ├── 강원/
│       ├── 충북/
│       ├── 충남/
│       ├── 전북/
│       ├── 전남/
│       ├── 경북/
│       └── 경남/
│
├── chromadb_storage/           # ChromaDB 벡터 데이터베이스
│   ├── chroma.sqlite3          # ChromaDB 메타데이터
│   └── [collection_id]/        # 벡터 데이터
│
├── db.sqlite3                  # SQLite 데이터베이스
├── logs/                       # 로그 파일
└── cache/                      # 캐시 파일
 

⚙️ 환경 설정

환경변수 설명 (.env)

# ================================================================================================
# Django Settings
# ================================================================================================
SECRET_KEY=your-random-secret-key-here
DEBUG=True
ALLOWED_HOSTS=localhost,127.0.0.1

# ================================================================================================
# Database Settings (SQLite for local development)
# ================================================================================================
# PostgreSQL은 프로덕션 환경에서 사용
# POSTGRES_DB=elderly_rag_db
# POSTGRES_USER=postgres
# POSTGRES_PASSWORD=your-password
# POSTGRES_HOST=localhost
# POSTGRES_PORT=5432

# ================================================================================================
# OpenAI Settings
# ================================================================================================
OPENAI_API_KEY=sk-your-openai-api-key-here
OPENAI_MODEL=gpt-4o-mini
OPENAI_TEMPERATURE=0.7
OPENAI_MAX_TOKENS=2000

# ================================================================================================
# Embedding Settings
# ================================================================================================
EMBEDDING_MODEL=text-embedding-3-small
EMBEDDING_PROVIDER=openai

OPENAI_EMB_MODEL=text-embedding-3-small

# ================================================================================================
# ChromaDB Settings
# ================================================================================================
CHROMA_HOST=localhost
CHROMA_PORT=8000
CHROMA_PERSIST_DIR=./chromadb_storage

# Disable Chroma telemetry
CHROMA_TELEMETRY=false
CHROMA_TELEMETRY_ENABLED=false
CHROMA_ANONYMIZED_TELEMETRY=false

# ================================================================================================
# Directory Settings
# ================================================================================================
DATA_DIRECTORY=./data
RAG_CACHE_DIR=./cache

# ================================================================================================
# RAG Settings
# ================================================================================================
LOAD_DOCUMENTS=false
CHUNK_SIZE=1000
CHUNK_OVERLAP=200
TOP_K_RESULTS=5
HYBRID_RERANK_WEIGHT=0.7
BY_REGION=true
BATCH_SIZE=50

# ================================================================================================
# Django Server Settings
# ================================================================================================
SERVER_IP=127.0.0.1
DJANGO_PORT=8000
 

Django Settings 주요 설정

파일: config/settings.py

# 인증 설정
LOGIN_URL = '/login/'  # 로그인 페이지 URL
LOGIN_REDIRECT_URL = '/'  # 로그인 후 리다이렉트
LOGOUT_REDIRECT_URL = '/'  # 로그아웃 후 리다이렉트

# 정적 파일 설정
STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR / 'staticfiles'
STATICFILES_DIRS = [BASE_DIR / 'static']

# 미디어 파일 설정
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'

# 데이터베이스 (SQLite)
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}
 

💻 사용 방법

웹 인터페이스

사용자 페이지

페이지URL설명

/ 메인 페이지
회원가입 /register/ 일반 회원가입
로그인 /login/ 로그인 페이지
카카오 로그인 /kakao/login/ 카카오 소셜 로그인
챗봇 /chat/ 일반 사용자 챗봇
프로필 /profile/ 프로필 조회
프로필 수정 /profile/edit/ 프로필 수정
북마크 /bookmarks/ 저장한 북마크 목록
정책 목록 /policies/ 복지 정책 검색
맞춤형 추천 /quick-start/ 프로필 기반 정책 추천
FAQ /faq/ 자주 묻는 질문

관리자 페이지 (로그인 필요)

페이지URL설명

관리자 대시보드 /admin-dashboard/ 통계 및 분석
검증용 챗봇 /validation/chat/ RAG 디버깅용 챗봇
사용자 관리 /user-management/ 회원 관리
채팅 로그 /chat-logs/ 전체 대화 기록
피드백 분석 /feedback/analytics/ 사용자 피드백 통계
Django Admin /admin/ Django 관리자 페이지

Django 명령어

데이터베이스 관리

# 마이그레이션 파일 생성
python manage.py makemigrations

# 마이그레이션 적용
python manage.py migrate

# 데이터베이스 초기화 (주의: 모든 데이터 삭제)
python manage.py flush
 

사용자 관리

# 슈퍼유저 생성
python manage.py createsuperuser

# 사용자 비밀번호 변경
python manage.py changepassword <username>
 

정적 파일

# 정적 파일 수집
python manage.py collectstatic

# 정적 파일 재수집 (기존 파일 삭제)
python manage.py collectstatic --clear --noinput
 

ChromaDB 관리

# 복지 문서 로드 (처음 실행)
python manage.py load_welfare_documents

# 기존 ChromaDB 삭제 후 재로드
python manage.py load_welfare_documents --clear

# ChromaDB 상태 확인
python manage.py shell
>>> from chromadb import PersistentClient
>>> client = PersistentClient(path='./chromadb_storage')
>>> collection = client.get_collection('elderly_welfare_docs')
>>> print(f"문서 개수: {collection.count()}")
 

개발 서버

# 개발 서버 실행 (기본 포트 8000)
python manage.py runserver

# 특정 포트로 실행
python manage.py runserver 8080

# 외부 접속 허용
python manage.py runserver 0.0.0.0:8000
 

Django Shell

# Django Shell 실행
python manage.py shell

# 예: RAG 서비스 테스트
>>> from apps.chatbot_web.simple_rag_service import get_rag_service
>>> rag = get_rag_service()
>>> result = rag.generate_answer('기초연금은 누가 받을 수 있나요?', user_region='서울')
>>> print(result['answer'])
>>> print(f"검색된 문서: {result['retrieved_count']}개")
 

챗봇 사용 가이드

1. 일반 챗봇 사용

  1. /chat/ 접속
  2. 질문 입력창에 질문 작성
  3. "전송" 버튼 클릭 또는 Enter 키
  4. AI 답변 확인 (출처 문서 5개 함께 표시)
  5. 답변 평가 (별점 1-5)
  6. 북마크 저장 (필요 시)

예시 질문:

  • "기초연금은 누가 받을 수 있나요?"
  • "노인 장기요양보험 신청 방법을 알려주세요"
  • "서울에 사는 70세 노인이 받을 수 있는 복지 혜택은?"
  • "독거노인을 위한 지원 정책이 있나요?"

2. 관리자 검증 챗봇 사용

  1. 관리자 계정으로 로그인
  2. /validation/chat/ 접속
  3. RAG 설정 조정 (선택사항)
    • Top-K: 검색할 문서 개수
    • Temperature: 답변 창의성
    • Rerank Weight: 재순위화 가중치
  4. 질문 입력
  5. 상세 디버그 정보 확인
    • 검색된 문서 상세
    • 유사도 점수
    • 리랭킹 점수

📡 API 문서

전체 API 명세는 API_명세서.md 파일을 참조.

주요 API 엔드포인트

1. 채팅 메시지 API

엔드포인트: POST /chat/api/message/

설명: 사용자 질문을 받아 RAG 처리 후 AI 답변 반환

인증: 로그인 필요 (@login_required)

요청:

{
  "session_id": "abc123-def456-...",
  "message": "기초연금은 누가 받을 수 있나요?"
}
 

응답:

{
  "response": "기초연금은 만 65세 이상 어르신 중 소득인정액이 선정기준액 이하인 분들이 받으실 수 있습니다...",
  "sources": [
    {
      "index": 1,
      "content": "기초연금 지급 대상은...",
      "region": "전국",
      "source": "전국_기초연금_안내.pdf"
    },
    ...
  ],
  "retrieved_count": 5
}
 

JavaScript 예제:

fetch('/chat/api/message/', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'X-CSRFToken': getCookie('csrftoken')
    },
    body: JSON.stringify({
        session_id: SESSION_ID,
        message: question
    })
})
.then(response => response.json())
.then(data => {
    console.log('AI 답변:', data.response);
    console.log('출처 문서:', data.sources);
});
 

2. 북마크 저장 API

엔드포인트: POST /bookmark/save/

요청:

{
  "question": "기초연금 신청 방법",
  "answer": "기초연금은 주민센터에서...",
  "chatbot_type": "regular"
}
 

응답:

{
  "success": true,
  "bookmark_id": 42,
  "message": "북마크가 저장되었습니다."
}
 

3. 메시지 피드백 API

엔드포인트: POST /feedback/submit/

요청:

{
  "message_id": 1234,
  "rating": 4,
  "comment": "답변이 정확하고 도움이 되었습니다."
}
 

응답:

{
  "success": true,
  "message": "피드백이 제출되었습니다."
}
 

4. 세션 평가 API

엔드포인트: POST /session/rating/submit/

요청:

{
  "session_id": "abc123...",
  "rating": 4.5,
  "comment": "유용한 대화였습니다"
}
 

5. 카카오 로그인 API

흐름:

1. GET /kakao/login/
   → 카카오 OAuth 페이지로 리다이렉트

2. GET /kakao/callback/?code={authorization_code}
   → 토큰 발급 → 사용자 정보 조회 → 로그인 처리

3. GET /kakao/logout/
   → 카카오 로그아웃 → Django 로그아웃
 

외부 API 사용

OpenAI Embeddings API

# text-embedding-3-small 모델 사용
embeddings = OpenAIEmbeddings(
    model='text-embedding-3-small',
    openai_api_key=os.getenv('OPENAI_API_KEY')
)

# 1536차원 벡터 반환
vector = embeddings.embed_query("기초연금")
 

OpenAI Chat Completions API

# gpt-4o-mini 모델 사용
llm = ChatOpenAI(
    model='gpt-4o-mini',
    temperature=0.7,
    max_tokens=2000,
    openai_api_key=os.getenv('OPENAI_API_KEY')
)

response = llm.invoke([
    {"role": "system", "content": "당신은 노인 복지 정책 전문가입니다."},
    {"role": "user", "content": "기초연금에 대해 설명해주세요."}
])
 

🔧 문제 해결

일반적인 문제

1. 챗봇이 응답하지 않음 (302 리다이렉트 에러)

증상: 메시지 전송 후 아무 반응 없음, 네트워크 탭에서 302 에러

원인: Django LOGIN_URL 설정 문제

해결 방법:

config/settings.py 파일 끝에 추가:

# Authentication Settings
LOGIN_URL = '/login/'
LOGIN_REDIRECT_URL = '/'
LOGOUT_REDIRECT_URL = '/'
 

서버 재시작:

python manage.py runserver
 

2. ChromaDB가 비어있음

증상: "관련된 복지 정책 정보를 찾을 수 없습니다" 메시지

확인 방법:

python manage.py shell
>>> from chromadb import PersistentClient
>>> client = PersistentClient(path='./chromadb_storage')
>>> collection = client.get_collection('elderly_welfare_docs')
>>> print(collection.count())
 

해결 방법:

# 문서 로드 (10-15분 소요)
python manage.py load_welfare_documents
 

3. OpenAI API 오류

증상: "OpenAI API 키가 유효하지 않습니다"

확인:

# .env 파일 확인
cat .env | grep OPENAI_API_KEY

# 또는 Python에서 확인
python -c "import os; from dotenv import load_dotenv; load_dotenv(); print(os.getenv('OPENAI_API_KEY'))"
 

해결:

  1. .env 파일에서 OPENAI_API_KEY 값 확인
  2. OpenAI Platform에서 API 키 확인
  3. 서버 재시작

4. 정적 파일 로드 실패

증상: CSS, 이미지가 표시되지 않음

해결:

# 정적 파일 재수집
python manage.py collectstatic --clear --noinput

# DEBUG=True 설정 확인 (.env 파일)
DEBUG=True
 

5. 데이터베이스 마이그레이션 오류

증상: no such table 오류

해결:

# 마이그레이션 파일 생성
python manage.py makemigrations

# 마이그레이션 적용
python manage.py migrate

# 마이그레이션 상태 확인
python manage.py showmigrations
 

6. 카카오 로그인 오류

증상: 카카오 로그인 후 오류 발생

확인 사항:

  1. Kakao Developers에서 앱 설정 확인
  2. Redirect URI 확인: http://127.0.0.1:8000/kakao/callback/
  3. 환경변수 확인:
KAKAO_REST_API_KEY=your-kakao-rest-api-key
KAKAO_REDIRECT_URI=http://127.0.0.1:8000/kakao/callback/
 

브라우저 개발자 도구 활용

1. 콘솔 에러 확인

F12 → Console 탭
- JavaScript 에러 확인
- AJAX 요청/응답 확인
 

2. 네트워크 요청 확인

F12 → Network 탭
- /chat/api/message/ 요청 찾기
- Status Code 확인 (200: 정상, 400/500: 에러)
- Response 탭에서 응답 내용 확인
 

3. 세션 정보 확인

// 콘솔에서 실행
console.log("Session ID:", SESSION_ID);
console.log("CSRF Token:", getCookie('csrftoken'));
 

 

📄 문서

프로젝트 관련 상세 문서:


👥 팀원

SKN16-4th-4Team - 김혜린, 문승현, 박태규, 양지우, 이경은, 황하영


SKN 16기 4차프로젝트 깃허브

 

GitHub - SKNETWORKS-FAMILY-AICAMP/SKN16-4th-4Team: SKN 16기 4차 단위프로젝트

SKN 16기 4차 단위프로젝트. Contribute to SKNETWORKS-FAMILY-AICAMP/SKN16-4th-4Team development by creating an account on GitHub.

github.com