안녕하세요! 오늘은 RASA를 활용한 교육용 AI 챗봇 구현 방법에 대해 알려드릴게요. 학생들의 질문에 24시간 대답해주는 똑똑한 선생님 비서를 만들어볼까요?
RASA가 뭔가요? 🤔
여러분이 스마트폰에서 사용하는 음성비서(시리, 빅스비)를 상상해보세요.
- 내 질문을 이해하고
- 적절한 답변을 해주는 비서가 있다면?
RASA는 바로 이런 챗봇을 만들 수 있게 해주는 오픈소스 프레임워크예요!
쉽게 말해, RASA는 사람의 말을 이해하고 적절히 대답하는 AI 선생님을 만드는 레고 블록 세트라고 생각하면 됩니다. 프로그래밍 지식이 있다면 누구나 자신만의 챗봇을 만들 수 있어요 ✨
RASA의 핵심 구성요소 💫
RASA는 크게 5가지 블록으로 구성되어 있어요:
- Intent (의도) - 학생이 무엇을 원하는지 파악하는 능력
"시험 일정이 언제야?" → ask_exam_schedule 의도로 인식
- Entities (개체) - 대화 속 중요 정보를 찾는 돋보기
"수학 문제 풀이 방법 알려줘" → '수학'과 '문제 풀이'라는 중요 정보 추출
- Stories (대화 흐름) - 대화의 지도
학생 질문 → 챗봇 응답 → 추가 질문 → 추가 응답의 흐름을 정의
- Actions (행동) - 챗봇이 할 수 있는 행동들
답변하기, 정보 검색하기, 시험 일정 알려주기 등
- Domain (영역) - 챗봇의 지식 백과사전
챗봇이 알고 있는 모든 의도, 개체, 행동, 응답을 정의
설치 및 환경 설정 🛠️
1. 필요한 환경 설정하기
# 가상환경 만들기
python -m venv rasa_env
# 가상환경 활성화 (Windows)
rasa_env\Scripts\activate
# 가상환경 활성화 (Mac/Linux)
source rasa_env/bin/activate
# RASA 설치하기
pip install rasa
2. 프로젝트 시작하기
# 새 프로젝트 만들기
rasa init --no-prompt
# 또는 대화형으로 설정
rasa init
이 명령어를 실행하면 RASA가 기본 프로젝트 구조를 자동으로 만들어줍니다. 마치 레고 블록을 기본 형태로 조립해놓은 것과 같아요!
교육용 챗봇 설계하기 📝
1. 교육용 인텐트 설계
학생들이 무엇을 물어볼지 미리 생각해봅시다:
# data/nlu.yml
nlu:
- intent: greet
examples: |
- 안녕
- 안녕하세요
- 반가워요
- 챗봇님 안녕하세요
- intent: ask_exam_schedule
examples: |
- 시험 일정이 언제예요?
- 다음 시험은 언제인가요?
- 기말고사 일정 알려줘
- 중간고사가 언제야?
- intent: ask_homework
examples: |
- 숙제가 뭐였지?
- 이번 주 과제가 뭐예요?
- 제출해야 할 과제 알려줘
- 숙제 확인하고 싶어요
2. 대화 흐름 만들기
학생과 챗봇 사이의 대화가 어떻게 진행될지 정의합니다:
# data/stories.yml
stories:
- story: 인사하고 시험 일정 물어보기
steps:
- intent: greet
- action: utter_greet
- intent: ask_exam_schedule
- action: utter_exam_schedule
- story: 숙제 물어보기
steps:
- intent: ask_homework
- action: utter_homework
3. 응답 정의하기
챗봇이 어떻게 대답할지 정의합니다:
# domain.yml
responses:
utter_greet:
- text: "안녕하세요! 교육봇입니다. 무엇을 도와드릴까요?"
utter_exam_schedule:
- text: "다음 시험은 6월 15일 월요일입니다. 시험 범위는 5~8장이에요."
utter_homework:
- text: "이번 주 숙제는 프로그래밍 과제 3번과 읽기 자료 요약본 제출입니다. 마감일은 금요일까지입니다."
한국어 처리를 위한 설정 🇰🇷
RASA는 기본적으로 영어에 최적화되어 있어요. 한국어를 잘 처리하려면 추가 설정이 필요합니다.
1. 한국어 파이프라인 설정하기
# config.yml
language: ko
pipeline:
- name: WhitespaceTokenizer
- name: RegexFeaturizer
- name: LexicalSyntacticFeaturizer
- name: CountVectorsFeaturizer
- name: CountVectorsFeaturizer
analyzer: char_wb
min_ngram: 1
max_ngram: 4
- name: DIETClassifier
epochs: 100
- name: EntitySynonymMapper
- name: ResponseSelector
epochs: 100
2. 형태소 분석기 연동하기 (심화)
더 정확한 한국어 처리를 위해 KoNLPy와 같은 한국어 형태소 분석기를 연동할 수 있습니다.
# custom_tokenizer.py
from rasa.nlu.tokenizers.tokenizer import Tokenizer
from konlpy.tag import Mecab
class KoreanTokenizer(Tokenizer):
def tokenize(self, message, attribute):
mecab = Mecab()
text = message.get(attribute)
tokens = mecab.morphs(text)
return self.convert_tokens_to_rasa_format(tokens, text)
그리고 config.yml에 추가:
pipeline:
- name: "custom_tokenizer.KoreanTokenizer"
# 나머지 파이프라인...
실제 교육용 챗봇 예제 📚
1. 수학 문제 풀이 안내 챗봇
# 인텐트 정의
- intent: ask_math_solution
examples: |
- 이차방정식 푸는 법 알려줘
- 미분 어떻게 하는거야?
- 적분 공식 알려주세요
- 삼각함수 풀이방법 설명해줘
# 응답 정의
responses:
utter_math_solution_quadratic:
- text: "이차방정식 ax² + bx + c = 0의 근은 x = (-b ± √(b² - 4ac)) / 2a 입니다. 차근차근 계수를 대입해 볼까요?"
utter_math_solution_calculus:
- text: "미분은 함수의 순간 변화율을 구하는 과정입니다. 기본 공식은 f(x) = xⁿ일 때, f'(x) = n·xⁿ⁻¹ 입니다."
2. 커스텀 액션으로 동적 답변 구현하기
특정 교과 내용이나 학생별 맞춤 답변을 제공하려면 커스텀 액션을 사용합니다:
# actions.py
from typing import Any, Text, Dict, List
from rasa_sdk import Action, Tracker
from rasa_sdk.executor import CollectingDispatcher
class ActionCheckStudentProgress(Action):
def name(self) -> Text:
return "action_check_student_progress"
def run(self, dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
# 학생 ID 추출 (예시)
student_id = tracker.get_slot("student_id")
# 실제로는 데이터베이스에서 학생 정보를 조회
progress = get_student_progress(student_id) # 가상의 함수
if progress["status"] == "good":
message = f"잘하고 있어요! 현재 진도는 {progress['chapter']}장, 평균 점수는 {progress['score']}점입니다."
else:
message = f"조금 더 노력이 필요해요. {progress['weak_point']} 부분을 복습하면 좋을 것 같아요."
dispatcher.utter_message(text=message)
return []
챗봇 학습 및 실행하기 🚀
1. 모델 학습하기
rasa train
2. 챗봇 테스트하기
rasa shell
3. 웹 인터페이스와 연동하기
# 액션 서버 실행 (별도 터미널에서)
rasa run actions
# RASA 서버 실행
rasa run --enable-api --cors "*"
교육용 챗봇의 장점 🌟
- 24/7 학습 지원
- 선생님이 퇴근해도 질문에 답변 가능
- 밤에 공부하는 학생들도 도움 받을 수 있음
- 개인화된 학습 경험
- 학생별 진도와 취약점에 맞춘 답변 제공
- 반복적인 질문도 인내심 있게 대응
- 교사 업무 경감
- 반복적인 질문은 챗봇이 담당
- 교사는 더 가치 있는 활동에 집중 가능
- 학습 데이터 수집
- 학생들이 어떤 부분을 어려워하는지 데이터 확보
- 교육 과정 개선에 활용 가능
주의할 점 ⚠️
- 충분한 학습 데이터 필요
- 다양한 질문 패턴을 수집해야 함
- 학생들의 실제 질문을 반영해야 정확도 상승
- 한국어 처리의 한계
- 영어보다 한국어 처리가 까다로움
- 형태소 분석기 연동으로 개선 가능
- 지속적인 업데이트 필요
- 새로운 교육 내용 반영
- 오답 패턴 수정
실제 구현 예시 📱
# 시험 일정을 데이터베이스에서 가져오는 커스텀 액션
class ActionExamSchedule(Action):
def name(self) -> Text:
return "action_exam_schedule"
def run(self, dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
# 과목 엔티티 추출
subject = tracker.get_slot("subject")
# 데이터베이스에서 시험 일정 조회
if subject:
schedule = get_exam_schedule(subject) # 가상의 함수
message = f"{subject} 시험은 {schedule['date']}에 있습니다. 시험 범위는 {schedule['scope']}입니다."
else:
# 전체 시험 일정
schedules = get_all_exam_schedules() # 가상의 함수
message = "다음 시험 일정입니다:\n"
for subj, data in schedules.items():
message += f"- {subj}: {data['date']} ({data['scope']})\n"
dispatcher.utter_message(text=message)
return []
마치며 🎁
RASA를 활용한 교육용 챗봇은 마치 24시간 근무하는 AI 조교와 같습니다. 학생들의 질문에 언제든지 답변하고, 학습 과정을 돕는 든든한 지원군이 될 수 있어요.
처음에는 설정과 학습 데이터 준비가 조금 번거롭게 느껴질 수 있지만, 한번 구축해놓으면 지속적으로 발전시킬 수 있는 강력한 교육 도구가 됩니다.
여러분만의 특별한 AI 선생님을 만들어보세요! 😊
궁금하신 점 있으시다면 댓글로 남겨주세요!
참고 자료
- Rasa 공식 문서: https://rasa.com/docs/
- Rasa 한국어 처리 가이드: https://rasa.community/
- GeeksforGeeks Rasa 튜토리얼: https://www.geeksforgeeks.org/chatbots-using-python-and-rasa/
- Analytics Vidhya Rasa 구현 가이드: https://www.analyticsvidhya.com/blog/2019/04/learn-build-chatbot-rasa-nlp-ipl/