-
온라인 강의 플랫폼을 위한 백엔드 튜터 챗봇 서버입니다.
-
학습 질의응답: 수강생이 학습 내용과 관련된 질문을 입력하면 튜터 챗봇이 강의 자료를 기반으로 답변을 제공합니다.
-
학습 상호작용: 강의별 학습 내용을 중심으로 수강생과 튜터 챗봇 간의 질의응답을 지원하여 학습 효과와 소통을 지원합니다.
-
비동기 처리: Kafka를 활용하여 강의 교안 파일(PDF) 임베딩 이벤트를 비동기적으로 처리함으로써 시스템 성능과 확장성을 확보합니다.
-
패키지 구조
tutor_bot ├─ main │ ├─ java/com/example/tutor_bot │ │ ├─ advice │ │ ├─ common │ │ │ ├─ aspect │ │ │ ├─ dto │ │ │ │ └─ exception │ │ │ └─ kafka │ │ │ ├─ dto │ │ │ └─ utils │ │ │ └─ serializer │ │ ├─ config │ │ ├─ controller │ │ ├─ dto │ │ │ ├─ request │ │ │ └─ response │ │ ├─ event │ │ │ ├─ consumer │ │ │ └─ producer │ │ └─ service │ └─ resources │ └─ prompts └─ test/java/com/example/tutor_bot
-
| 이름 | 역할 |
|---|---|
| 정수연 | 튜터 챗봇 개발 |
| 심규환 | Kafka 이벤트 처리 |
| 이재원 | CI/CD, 모니터링 |
-
강사 → API 서버: 강의 메타데이터(제목, 설명 등) 및 강의 자료를 등록 요청합니다.
-
API 서버: 강의 정보를 DB에 초기 저장하고 고유 ID를 생성합니다.
-
외부 인코딩 서버 → Kafka: 강의 자료 업로드 및 인코딩 완료 후, Kafka Embedding 이벤트를 발행합니다.
-
API 서버 (Kafka Consumer): 이벤트를 수신하여 해당 강의 ID와 강의 자료를 pgvector에 저장합니다.
-
설명: 강사가 강의를 등록하고 강의 자료를 업로드하면 외부 서버에서 인코딩이 진행됩니다. 인코딩이 완료되면 Kafka 이벤트를 통해 강의 자료를 pgvector에 임베딩하여 검색 및 질의응답에 활용합니다.
-
수강생 → API 서버: 특정 강의에 대한 질문을 등록합니다.
-
API 서버: 질문을 redis에 저장합니다.
-
튜터 → API 서버: 학습 자료를 기반으로 등록된 질문에 대한 답변을 생성합니다.
-
API 서버: 답변을 redis에 저장합니다.
-
설명: 수강생이 강의와 관련된 질문을 하면 튜터 챗봇이 강의 자료를 기반으로 답변을 제공합니다. 이를 통해 학습자는 실시간 피드백을 받아 이해도를 높이고 학습 효율성을 극대화할 수 있습니다.
- 프롬프트에 페르소나와 조건을 정의하여 답변을 생성
- 강의 자료 기반 응답을 우선 제공하며, 부족한 경우 RAG를 통해 보완
- PDF 파일을
pgvector에 임베딩하여 정확한 검색 지원 - 청크 분할 및 공백 처리 최적화를 통해 검색 품질 향상
- 최근 대화 기록을 Redis에 저장하여 연속적인 질의응답 가능
- 사용자별·강의별 대화 세션 관리
- 강의 자료에 없는 질문은 외부 공식 데이터 소스를 검색하여 응답 보완
- 검색 결과와 LLM 응답을 결합해 정확도 및 신뢰도 향상
- 프롬프트의 구성 방식에 따라 튜터 챗봇의 응답 품질이 크게 달라진다는 점을 확인했습니다.
- 개발 초기에는 단순히 페르소나만 정의했으나 튜터 챗봇이 기획 의도대로 동작하지 않는 문제를 경험했습니다. 이후 프롬프트를 재구성하는 과정에서 응답 품질이 크게 달라지는 것을 확인하며 프롬프트 작성의 중요성을 명확히 인식하게 되었습니다.
- 강의 자료를 기반으로 학습 지원을 제공하되 해당 자료에 질문에 대한 충분한 설명이 없는 경우 RAG(Retrieval-Augmented Generation)를 활용해 보완하도록 기획했습니다.
- PDF 파일을
pgvector에 임베딩할 때 청크 분할 방식에 따라 검색 정확도와 데이터 품질이 크게 달라진다는 것을 알게 되었습니다. - 초기에는 공백 처리 문제로 인해 검색 성능이 저하되는 문제가 있었으나 청크를 더 세분화하고 공백 처리를 개선하여
content에 보다 안정적으로 저장되도록 조정했습니다.
- Redis를 사용해 ChatMemory를 구현하여 수강생과 튜터 간의 질의응답 기록을 저장했습니다.
- 그러나 시스템 프롬프트 조건과의 불일치로 인해 이전 대화 내용을 불러오지 못하는 문제가 발생하였고 이를 해결하기 위해 시스템 프롬프트 조건 및 데이터 구조를 재검토했습니다.
- 프롬프트의 페르소나와 조건을 변경할 때마다 응답 결과가 크게 달라지는 경험을 통해 원하는 성능의 챗봇을 구현하기 위해서는 정확하고 체계적인 프롬프트 작성이 필수적임을 깨달았습니다.