✅ 일주일 동안 한 일과 느낀 점
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(Retrieval-Augmented Generation) 기술을 활용한 지능형 노인 복지 정책 안내 챗봇
노인 복지 챗봇은 RAG(Retrieval-Augmented Generation) 기술을 활용하여 노인과 그 가족들이 복지 정책 정보를 쉽게 찾고 이해할 수 있도록 돕는 지능형 챗봇 시스템입니다.
- 복잡한 노인 복지 정책 정보를 쉽게 접근할 수 있도록 지원
- 지역별로 분산된 복지 정책 정보를 통합 제공
- AI 기반 자연어 대화를 통한 직관적인 정보 검색
- 🔍 정확성: 공공 복지 정책 문서 기반 정확한 정보 제공
- 🤖 편의성: GPT-4o-mini 기반 자연스러운 한국어 대화
- 📚 맞춤형: 사용자 지역 및 프로필 기반 맞춤 정보 제공
- ⭐ 개선: 사용자 피드백 기반 지속적인 서비스 개선
- 자연어 대화: GPT-4o-mini 기반 자연스러운 한국어 질의응답
- 맥락 이해: 대화 히스토리를 활용한 문맥 기반 응답
- 정확한 정보: ChromaDB 벡터 검색을 통한 관련 문서 기반 답변
- 출처 제공: 답변의 근거가 된 문서 출처 표시 (최대 5개)
- 세션 관리: 여러 대화 세션 생성 및 관리
- 디버그 정보: RAG 파라미터 실시간 조정 및 성능 테스트
- 성능 분석: 검색 결과, 리랭킹 점수 등 상세 정보 제공
- 일반 회원가입: 이메일 기반 회원가입
- 카카오 로그인: OAuth 2.0 기반 소셜 로그인
- 프로필 관리: 나이, 성별, 지역, 장애여부 등 상세 프로필
- 지역 기반 검색: 사용자 거주 지역 복지 정책 우선 제공
- 개인화 추천: Quick Start 기능으로 프로필 맞춤 정책 추천
- 북마크: 유용한 답변 저장 및 재확인
- 메시지 평가: 각 AI 답변에 대한 별점 평가 (1-5점)
- 세션 평가: 전체 대화 세션에 대한 만족도 평가 (0.5점 단위)
- 댓글 작성: 평가와 함께 상세 의견 남기기
- 분석 대시보드: 관리자용 피드백 통계 및 분석
- 지역별 검색: 17개 시도별 복지 정책 필터링
- 카테고리별 분류: 기초연금, 장기요양, 주거지원 등
- 상세 정보: 신청 자격, 지원 내용, 신청 방법 안내
- FAQ: 자주 묻는 질문 모음
- 대시보드: 사용자 통계, 채팅 로그, 피드백 분석
- 사용자 관리: 회원 목록, 관리자 권한 부여
- 채팅 로그: 전체 대화 기록 조회 및 분석
- 피드백 분석: 평균 별점, 평가 분포, 개선 필요 항목
- Django 4.2.25: Python 웹 프레임워크
- SQLite: 사용자 데이터, 채팅 기록 저장
- Gunicorn: WSGI HTTP 서버
- OpenAI GPT-4o-mini: 대형 언어 모델 (답변 생성)
- OpenAI text-embedding-3-small: 임베딩 모델 (1536차원)
- LangChain 0.3: RAG 파이프라인 프레임워크
- ChromaDB 0.4: 벡터 데이터베이스 (30,494개 문서)
- scikit-learn: TF-IDF 기반 하이브리드 리랭킹
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
- Bootstrap 5.1.3: 반응형 UI 프레임워크
- Bootstrap Icons: 아이콘 라이브러리
- Vanilla JavaScript: AJAX 기반 비동기 통신
- PyMuPDF (fitz): PDF 텍스트 추출 (1차)
- pdfplumber: PDF 텍스트 추출 (2차)
- PyPDF2: PDF 텍스트 추출 (3차)
- Tesseract OCR: 이미지 기반 PDF OCR (4차)
- olefile: HWP 문서 처리
- Git & GitHub: 버전 관리
- python-dotenv: 환경변수 관리
- Whitenoise: 정적 파일 서빙
- Docker & Docker Compose: 컨테이너화 (선택사항)
┌─────────────────────────────────────────────────────────────────┐
│ 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 │ │ │ │
│ └──────────────────┘ └─────────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────────┘
주요 테이블:
- 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)
사용자 질의
│
▼
[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 저장공간
git clone https://github.com/SKNETWORKS-FAMILY-AICAMP/SKN16-4th-4Team.git
cd SKN16-4th-4Team
Windows:
python -m venv venv
venv\Scripts\activate
Mac/Linux:
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
# .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())"
python manage.py migrate
python manage.py collectstatic --noinput
# 처음 실행 시 (약 10-15분 소요)
python manage.py load_welfare_documents
# 기존 데이터 삭제 후 재로드
python manage.py load_welfare_documents --clear
참고: data/ 폴더에 지역별 PDF/HWP 문서가 있어야 합니다.
python manage.py createsuperuser
- Username: admin
- Email: (선택사항)
- Password: 원하는 비밀번호 입력
python manage.py runserver
- 메인 페이지: http://127.0.0.1:8000/
- 관리자 페이지: http://127.0.0.1:8000/admin/
- 챗봇: http://127.0.0.1:8000/chat/
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/ # 캐시 파일
# ================================================================================================
# 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
파일: 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 관리자 페이지 |
# 마이그레이션 파일 생성
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
# 복지 문서 로드 (처음 실행)
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 실행
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']}개")
- /chat/ 접속
- 질문 입력창에 질문 작성
- "전송" 버튼 클릭 또는 Enter 키
- AI 답변 확인 (출처 문서 5개 함께 표시)
- 답변 평가 (별점 1-5)
- 북마크 저장 (필요 시)
예시 질문:
- "기초연금은 누가 받을 수 있나요?"
- "노인 장기요양보험 신청 방법을 알려주세요"
- "서울에 사는 70세 노인이 받을 수 있는 복지 혜택은?"
- "독거노인을 위한 지원 정책이 있나요?"
- 관리자 계정으로 로그인
- /validation/chat/ 접속
- RAG 설정 조정 (선택사항)
- Top-K: 검색할 문서 개수
- Temperature: 답변 창의성
- Rerank Weight: 재순위화 가중치
- 질문 입력
- 상세 디버그 정보 확인
- 검색된 문서 상세
- 유사도 점수
- 리랭킹 점수
전체 API 명세는 API_명세서.md 파일을 참조.
엔드포인트: 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);
});
엔드포인트: POST /bookmark/save/
요청:
{
"question": "기초연금 신청 방법",
"answer": "기초연금은 주민센터에서...",
"chatbot_type": "regular"
}
응답:
{
"success": true,
"bookmark_id": 42,
"message": "북마크가 저장되었습니다."
}
엔드포인트: POST /feedback/submit/
요청:
{
"message_id": 1234,
"rating": 4,
"comment": "답변이 정확하고 도움이 되었습니다."
}
응답:
{
"success": true,
"message": "피드백이 제출되었습니다."
}
엔드포인트: POST /session/rating/submit/
요청:
{
"session_id": "abc123...",
"rating": 4.5,
"comment": "유용한 대화였습니다"
}
흐름:
1. GET /kakao/login/
→ 카카오 OAuth 페이지로 리다이렉트
2. GET /kakao/callback/?code={authorization_code}
→ 토큰 발급 → 사용자 정보 조회 → 로그인 처리
3. GET /kakao/logout/
→ 카카오 로그아웃 → Django 로그아웃
# text-embedding-3-small 모델 사용
embeddings = OpenAIEmbeddings(
model='text-embedding-3-small',
openai_api_key=os.getenv('OPENAI_API_KEY')
)
# 1536차원 벡터 반환
vector = embeddings.embed_query("기초연금")
# 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": "기초연금에 대해 설명해주세요."}
])
증상: 메시지 전송 후 아무 반응 없음, 네트워크 탭에서 302 에러
원인: Django LOGIN_URL 설정 문제
해결 방법:
config/settings.py 파일 끝에 추가:
# Authentication Settings
LOGIN_URL = '/login/'
LOGIN_REDIRECT_URL = '/'
LOGOUT_REDIRECT_URL = '/'
서버 재시작:
python manage.py runserver
증상: "관련된 복지 정책 정보를 찾을 수 없습니다" 메시지
확인 방법:
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
증상: "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'))"
해결:
- .env 파일에서 OPENAI_API_KEY 값 확인
- OpenAI Platform에서 API 키 확인
- 서버 재시작
증상: CSS, 이미지가 표시되지 않음
해결:
# 정적 파일 재수집
python manage.py collectstatic --clear --noinput
# DEBUG=True 설정 확인 (.env 파일)
DEBUG=True
증상: no such table 오류
해결:
# 마이그레이션 파일 생성
python manage.py makemigrations
# 마이그레이션 적용
python manage.py migrate
# 마이그레이션 상태 확인
python manage.py showmigrations
증상: 카카오 로그인 후 오류 발생
확인 사항:
- Kakao Developers에서 앱 설정 확인
- Redirect URI 확인: http://127.0.0.1:8000/kakao/callback/
- 환경변수 확인:
KAKAO_REST_API_KEY=your-kakao-rest-api-key
KAKAO_REDIRECT_URI=http://127.0.0.1:8000/kakao/callback/
F12 → Console 탭
- JavaScript 에러 확인
- AJAX 요청/응답 확인
F12 → Network 탭
- /chat/api/message/ 요청 찾기
- Status Code 확인 (200: 정상, 400/500: 에러)
- Response 탭에서 응답 내용 확인
// 콘솔에서 실행
console.log("Session ID:", SESSION_ID);
console.log("CSRF Token:", getCookie('csrftoken'));
프로젝트 관련 상세 문서:
- 노인복지_RAG_챗봇_구현_기술문서.md: 상세 기술 구현 문서
- API_명세서.md: 전체 API 엔드포인트 명세
- database_schema.dbml: 데이터베이스 ERD (DBML 형식)
SKN16-4th-4Team - 김혜린, 문승현, 박태규, 양지우, 이경은, 황하영
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
'SK네트웍스 Family AI캠프 16기' 카테고리의 다른 글
| [플레이데이터 SK네트웍스 Family AI캠프 16기] 19주차 회고 (0) | 2025.11.04 |
|---|---|
| [플레이데이터 SK네트웍스 Family AI캠프 16기] 18주차 회고 (0) | 2025.10.27 |
| [플레이데이터 SK네트웍스 Family AI캠프 16기] 16주차 회고 (0) | 2025.10.09 |
| [플레이데이터 SK네트웍스 Family AI캠프 16기] 15주차 회고 (0) | 2025.09.30 |
| [플레이데이터 SK네트웍스 Family AI캠프 16기] 14주차 회고 (1) | 2025.09.22 |