담담(DAMDAM)은
로 제작된 AI 심리상담 챗봇으로, 감정분석 모델과 RAG 기반 LLM을 활용합니다. 소셜로그인 한 번으로 편리하게, 언제 어디서든
AI 상담사에게 맞춤형 상담을 받고, AI 분석을 통해 내 상담 내용을 분석하는 상담별·기간별 레포트를 제공받을 수도 있습니다.
이 프로젝트는 2025년 4월 14일부터 5월 22일까지 진행된 6인(백엔드 1인, 프론트엔드 2인, AI 2인, Infra/Bigdata 1인) 프로젝트 산출물입니다.
| Name | 박성재 👑팀장/AI(LLM) | 정지은 🎖️BE리더 | 서준호 🎖️FE리더 |
|---|---|---|---|
| Profile | |||
| Position | AI Engineer / PM | Back-end Developer / PL | Front-end Developer / PL |
| Git | @psj9709 | @doh3e | @Junho-Seo |
| [email protected] | [email protected] | [email protected] |
RAG 기반 문서검색·응답 시스템 설계 및 도입
1. 정확도 향상과 최신 정보 기반 답변 생성을 위해 RAG
(Retrieval-Augmented Generation) 구조 도입
2. 질문 입력 → 임베딩 검색 → 유사 문서 반환 → LLM 생성까지
일관된 파이프라인 구축하여 응답 품질 개선
3. 문장 임베딩 및 검색
- BAAI/bge-m3 SentenceTransformer 모델 사용해 질문을 벡터로 변환
- FAISS 인덱스(qa_index_bge_m3.faiss)에서 L2 정규화 후 코사인 유사도
기반으로 유사 문서 검색
모델 선정 및 구성
1. 경량화된 LLM 채택: 서버 자원을 고려해 google/gemma-3-12b-it-qat
(QAT 양자화된 모델)을 선택하고, Ollama를 활용해 로컬 GPU 환경에
최적화하여 실행
2. Ollama 기반 인프라 구축:
- EC2 GPU 서버에 Ollama 설치 후 모델 로드
- Docker 환경에서도 접근할 수 있도록 host.docker.internal 주소 활용
채팅 방식 및 시스템 구조
1. FastAPI 서버 구현
- 필요 엔드포인트를 RESTful API 형식으로 구성
- httpx 라이브러리를 통해 Ollama로 생성 요청을 비동기로 전달
2. 데이터 저장 방식:
- 유저 메시지와 AI 응답을 별도 저장하지 않고, 각 요청 시
chat_memory에서 최근 대화만 유지.
프롬프트 설계 및 튜닝 전략
1. 역할 설정 : 모델에게 ‘상냥하고 신뢰감 있는 심리상담사’로서의 역할을 부여
2. 유저 맥락 반영 : 백엔드로부터 유저 정보를 받아 프롬프트에 자연스럽게 포함
3. 프롬프트 안전장치 :
- 인사/비인사 구분 규칙 적용: 인사하지 않으면 절대 인사하지 않도록 설계
- 감정 유추 금지, 과거 사건 추정 금지, 불필요한 조언 금지 등 정확한
공감 기반 응답 지침 명시
4. 요약/분석 프롬프트 :
- Russell 감정 원형 모형 기반의 감정 요약 프롬프트 작성
- 단기 요약, 기간별 리포트 등 분석 목적에 따라 다른 프롬프트 템플릿 구성
백엔드 및 DATABASE 전체 설계
1. ERD 설계 및 관계형 모델링: 사용자·상담·레포트·문의 등 주요 엔티티 간
1:1·1:N·N:M 관계 정의
2. Redis 활용 방안 수립: 세션 상태·토큰 카운트 저장, 감정 분석 결과
캐싱 구조 설계
3. API 엔드포인트 및 로직 전체 설계 및 작성
4. Spring Boot 프로젝트 초기 세팅 및 의존성 빌드, 관련 Configuration 작성
Redis(NoSQL)와 WebSocket을 이용한 유저-AI 챗봇 실시간 채팅 구현
1. WebSocket 통신 로직: STOMP 핸드셰이크 → 메시지 송수신 → 이벤트 핸들러 구성
2. Redis 연동: 채팅 세션별 메시지·타임스탬프·토큰 수 캐싱 및 조회
3. AI 감정분석 결과 및 LLM 결과 Redis에 저장 및 실시간 조회
Fast API / Spark / S3 연동 구현, 성능 개선을 위한 Virtual Thread 도입
1. WebClient와 Virtual Thread를 활용한 비동기 감정분석모델·LLM/RAG FastAPI 요청
2. 세션별 레포트 발행 시 상담 전문 Json 형태로 저장 ->
Virtual Thread로 동시 업로드 성능 향상
3. 기간별 레포트 발행 시 Spark 연동
소셜로그인 인증/인가 구현
1. OAuth2 클라이언트 설정: Google·Naver·Kakao 소셜 로그인 연동 및 JWT 발급
2. Spring Security 구성: CORS 설정 / 권한 필터 → 토큰 검사 → Role 기반 접근 제어
Spring DATA JPA와 QueryDSL을 활용한 백엔드-RDB 연동/관리
1. Repository 설계: JPARepository + QueryDSL CustomRepository로 복잡 쿼리 모듈화
2. 성능 최적화: 정규 인덱스 적용, Fetch Join으로 N+1 문제 해소
회원관리, 상담관리, 레포트관리, 문의 및 공지 CRUD API 작업
1. RESTful API 설계: 회원가입·로그인·상담·레포트·문의·공지 각종 엔드포인트 구현
2. DTO Validation & 예외 처리: Annotation 기반 검증 →
각 파트별 커스텀 Exception 핸들러 → 일관된 응답 포맷 제공
기타
1. 브랜치 전략 수립: GitFlow 기반 feature/MR 프로세스 → 코드 리뷰·병합 규칙 정립
2. Naver Check Style 활용 코드 및 네이밍 스타일 적용, 이슈/MR 등 컨벤션 규칙 정립
3. Readme 작성
FSD 아키텍처 설계 및 도입
1. 유지보수 및 확장성 향상을 위해 Feature-Sliced Design 아키텍처 적용.
2. `app` (전역 설정/상태), `processes` (복합 시나리오), `widgets` (UI 블록),
`features` (기능 단위), `entities` (도메인 객체), `shared` (공용 모듈)
레이어로 구성하여 관심사 분리 및 모듈화 극대화.
Next.js App Router 기반 기본 레이아웃 구현
1. 전역 레이아웃 및 페이지별 특화 레이아웃 구축
2. 공통 위젯을 활용하여 일관된 사용자 경험 제공
AI 상담 기능 (실시간 채팅)
1. `@stomp/stompjs`, `sockjs-client` 기반 웹소켓 통신으로 LLM 서버와 실시간 메시징 구현
2. 채팅 UI, 메시지 입력/표시 기능 개발
3. 상담 세션 관리 (시작, 종료, 보고서 생성 버튼 등) 기능 통합
음성-텍스트 변환 (STT) 기능
1. `react-media-recorder` 활용 음성 녹음 기능 구현
2. OpenAI Whisper API 연동:
- 음성 파일: 클라이언트 녹음 → Next.js Route Handler → Whisper API (STT 변환)
→ 텍스트 결과 클라이언트 반환
- STT 변환 텍스트: 웹소켓 통해 LLM 서버로 전송
전역 상태 및 서버 데이터 관리
1. 클라이언트 상태: `Zustand` 활용 (UI 상태, 인증 토큰, 상담/STT 관련 상태 등)
2. 서버 데이터: `Tanstack Query` 활용 (API 연동, 데이터 캐싱, 동기화, 로딩/에러 처리)
| Name | 김천우 Infra/Bigdata | 유보형 AI(감정분석) | 이현준 FE |
|---|---|---|---|
| Profile | |||
| Position | Infra / DevOps / BigData | AI Engineer | Front-end Develop |
| Git | @kcheonu | @bobobo7git | @Jun-Data |
| [email protected] | [email protected] | [email protected] |
아키텍처 설계 및 인프라 구축
1. AWS EC2 총 6대를 활용해 서비스 인프라 구성
(기본제공 EC2 + t3.xlarge, g4dn.2xlarge, r5.large 등 고성능 서버)
2. 각 서버에 역할 분산:
- 기본 EC2: Spring Boot 백엔드, PostgreSQL, Next.js 프론트엔드, Redis
- t3.xlarge: FastAPI 기반 AI Audio 서비스
- g4dn.2xlarge: 감정 분석 및 상담을 위한 음성/텍스트 기반 AI 추론 서버
Jenkins + Docker 기반 CI/CD 파이프라인 구성
1. Jenkins를 통해 GitLab push 시 자동 빌드/배포 구현
FastAPI 기반 SPARK API 서버 구축
1. FastAPI로 Spark 작업 트리거용 API 서버 개발
2. Spark 잡 실행 요청 시, 사용자 ID 및 날짜 범위 기반으로 S3에서 대화 로그 조회 후
분석처리 결과를 다시 백엔드로 전달하거나 S3에 저장
3. Spark 데이터 파이프라인 구성
유저 대화 로그를 S3에서 읽어와 기간별로 키워드 추출 및 감정 통계 분석
4. 결과는 parquet로 저장하며 중복 실행 방지 로직도 구현 (이미 처리된 경우 Spark job skip)
5. UDF를 이용한 텍스트 전처리 및 감정 스코어 추출
도커 기반 환경 통합
1. 모든 컴포넌트 (Spring Boot, FastAPI, Redis, PostgreSQL 등) Docker로 컨테이너화
2. 각 컨테이너가 의존성 문제 없이 동작하도록 Dockerfile 및 docker-compose 작성 및 유지보수
3. 빌드 캐시 문제, 포트 충돌, 컨테이너 용량 문제 등 직접 해결
Nginx 관리 및 도메인 설정
1. Nginx + SSL + 도메인 설정
2. Nginx 리버스 프록시 설정 및 damdam.kr 도메인 연결
3. HTTPS 인증서 발급 및 자동 갱신 설정
기타
1. 시각 자료 제작 및 AI 활용 영상 포트폴리오 제작
2. Cloudcraft를 활용한 인프라 아키텍처 시각화 및 사용자 흐름 설명
음성 분석
1. 음성-감정 분류용 데이터 수집
2. 데이터 전처리 및 음성 피처 추출(MFCC, Mel-Spectrogram, openSmile Emobase)
3. XGBoost, 1d-CNN, wav2vec2 등 분류 모델 검증
4. SenseVoice 오픈소스 커스터마이징
텍스트 분석
1. 텍스트-감정 분류용 데이터 수집
2. 데이터 전처리(BERT Tokenizer)
3. KoBERT, RoBERTa 등 분류 모델 검증 및 RoBERTa 파인튜닝
감정 분석 모델 Fast API 서버 구축
1. RESTful API 적용 및 예외 처리
2. Docker 이미지 빌드 및 컨테이너화
LLM 프롬프팅
1. 멀티턴 챗봇 응답 프롬프트 설계
2. 기간별 레포트 프롬프트 설계
기타타
1. 발표 자료 PPT 작성
2. 감정 분석 포팅 매뉴얼 작성
랜딩 페이지(홈 화면) 구현
1. 서비스 첫인상을 위한 매력적인 홈 화면 개발
2. Next.js App Router, Shadcn/ui, Tailwind CSS 활용하여 반응형 UI/UX 제공
회원 인증 (소셜 로그인 연동)
1. Google, Naver, Kakao 소셜 로그인 기능 연동 구현
2. 최초 로그인 시 추가 정보 입력 및 사전 설문 연동 프로세스 구축
3. JWT 토큰 기반 인증 상태 관리
사전 설문 기능 개발
1. 단계별 설문 페이지 및 답변 처리 로직 구현
2. 설문 결과 서버 전송 기능 개발
나의 상담 (세션별/기간별 레포트 및 시각화)
1. 상담 레포트 조회 페이지 개발.
2. 백엔드 LLM 요약/감정분석 데이터 기반 레포트 내용 구성
3. 데이터 시각화: `Chart.js`/`Recharts` 활용 감정 그래프 연동
마이페이지 기능 구현
1. 사용자 프로필(정보 조회/수정 ,앱/AI 설정) 기능 개발
2. 관련 API 연동 및 클라이언트 상태 관리
전역 상태 및 서버 데이터 관리
1. 클라이언트 상태: `Zustand` 활용 (UI 상태, 인증 토큰, 상담/STT 관련 상태 등)
2. 서버 데이터: `Tanstack Query` 활용 (API 연동, 데이터 캐싱, 동기화, 로딩/에러 처리)
불편한 회원가입 절차 없이 가지고 계시던 소셜계정으로 로그인을 진행해보세요!
사전설문을 통해 나만을 위핸 AI와의 상담을 만들어갈 수 있어요.(사전 설문은 선택사항입니다.)
| 로그인 및 사전설문 | 마이페이지 |
|---|---|
gif-login-survey.mp4 |
gif-mypage.mp4 |
언제 어디서든 편하게, 여러분을 위한 맞춤형 상담을 받아보세요!
기쁠 때나 슬플 때나 AI 상담사 담담이가 당신의 이야기를 성심성의껏 들어드릴게요.
회원 정보에 입력해둔 정보나 사전 설문이 있다면 좀 더 정교한 답변을 받아볼 수도 있어요.
| 상담 채팅 & 상담 수정 및 삭제 |
|---|
gif-counsel.mp4 |
상담한 내역을 통해 레포트를 발행해볼 수도 있어요.
1회의 상담에 대해 각 채팅별로 어떤 감정을 느꼈었는지 상담 요약과 감정 분석 그래프, AI 분석을 제공해 주고
특정 기간을 설정해서 분석을 요청하면 해당 기간에 했던 상담에 대한 전반적인 상담 요약과 AI의 다양한 조언을 들을 수 있어요!
| 세션별 레포트 (1회 상담에 대한 분석) | 기간별 레포트 (기간 전체 요약 분석) |
|---|---|
gif-session-report.mp4 |
gif-period-report.mp4 |
📌 문제 상황
- 배포 환경(Docker, Nginx, Jenkins CI/CD)에서 음성 녹음 후 STT(Speech-to-Text) 변환을 위한 내부 API 요청 시 500 에러 발생.
- 로컬 개발 환경에서는 동일 기능 정상 작동.
- 프론트엔드 애플리케이션 서버 로그에는 관련 요청 처리 기록이 부재했고, 웹 서버(Nginx)의 에러 로그에도 특이사항은 발견되지 않음.
🔎 원인 분석: Nginx 라우팅 설정 오류
- 애플리케이션 서버 로그 부재
- 요청이 해당 서버의 지정된 API 처리 로직까지 도달하지 못했음을 시사.
- 웹 서버(Nginx) 설정 분석
- 내부 API 요청 경로를 포함한 특정 패턴의 모든 요청이 의도치 않게 백엔드 주 업무 처리 서버로 전달되도록 하는 포괄적인 전달 규칙을 확인.
- 결과
- 프론트엔드 애플리케이션 서버가 처리해야 할 내부 API 요청마저 백엔드 주 업무 서버로 잘못 전달됨
- 해당 서버에는 이 요청을 처리할 수 있는 기능이 없어 에러 발생.
✅ 해결
Nginx 설정을 수정하여, 프론트엔드 애플리케이션 서버의 내부 API 요청과 백엔드 주 업무 서버의 API 요청을 명확히 구분하여 각 요청이 올바른 애플리케이션 서버로 전달(프록시)되도록 변경.
- 수정 내용:
- 백엔드 주 업무 서버로 향하는 요청 경로 규칙을 더 구체적으로 명시
- 프론트엔드 애플리케이션 서버의 내부 API 요청 경로들은 해당 프론트엔드 애플리케이션 서버로 전달되도록 Nginx의 요청 경로별 전달 규칙(location 블록) 순서 및 내용을 조정.
- 적용:
- Nginx 설정 수정 후 문법 검사 및 서비스 재시작.
🎯 정리
배포 환경에서의 STT 기능 500 에러는 Nginx의 라우팅 설정 오류로 인해, 프론트엔드 Next.js의 API 라우트인 /api/stt 요청이 의도치 않게 백엔드 서버로 전달되어 발생한 문제였습니다.
Nginx 설정을 수정하여 해당 요청이 올바르게 Next.js 애플리케이션으로 프록시되도록 조치하여 해결하였습니다.
이 과정에서 초기에는 클라이언트 측 파일명 오류, Nginx의 client_max_body_size 등을 의심했으나, 서버 로그 및 Nginx 설정 파일의 단계적인 분석을 통해 실제 원인을 파악할 수 있었습니다.







