Skip to content

Aivle4th-team3/Aplus-EDU

Repository files navigation

AI 교육 플랫폼 A+EDU

AI를 학생으로 활용하여 자기주도 학습하는 교육 서비스

주관 : KT     소속 : KT 에이블스쿨 4기 수도권 1반 3조     프로젝트 기간 : 2023-12-11 ~ 2024-01-12

🚩 목차

📖 프로젝트 소개

   미국의 응용행동과학연구에서는 외부 정보가 인간의 뇌에 저장되는 방법을 기준으로 가장 효과적인 학습 방법을 피라미드 계층으로 정리하여 제안하였습니다.
   학습 피라미드에 따르면 학습한 내용을 직접 설명하고 가르치는 방식이 가장 효율적임을 알 수 있습니다.
   A+EDU는 능동적 학습 방법과 생성형 AI 기술을 결합한 자기주도 학습 서비스를 제공하여, 성취도 평가와 피드백을 통해 학습 과정의 부족한 부분을 보완하고 오개념 학습을 예방하는 교육 플랫폼입니다.
learnig-pyramid

🧑‍💻 팀 소개

김영진 김진우 안진수 유승호 임형섭 정원철
Youngjean Jinwoo Jinsoo Seungho Hyeongseop Woncheol

🎥 데모

demo.mp4

💡 주요 기능

  1. 웹 페이지

    • 사용자 회원가입, 로그인 관리
    • OAuth로 Github, Google, Naver, Kakao 계정 연동
    • 게시판, 댓글 작성
    • ckeditor로 편집 가능한 게시글 작성
    • 내 게시글에 댓글 달림시 알람
    • 사용자 일정 관리
  2. 동영상 강의

    • 강의 등록
    • 강의 당 여러편의 동영상 등록
    • 강의 시청 및 평가
  3. 학생AI와 채팅

    • 채팅방을 통해 학생 AI와 채팅
    • 채팅을 통한 학생AI 학습 (벡터데이터베이스)
    • 음성 입력으로 채팅 (STT)
    • 학생AI의 응답을 음성화 (TTS)
  4. 평가

    • 저장된 평가지에 맞춰 학생AI의 평가
    • 문항 당 점수와 해설
    • 전체 문항 점수를 고려한 등급 평가

🎨 UI

첫 페이지창 로그인창 강의 목록창 채팅창 평가창

🛠️ 기술 스택

AI

LangChain OpenAI Gemini LLaMA HuggingFace Ollama

Back-end

Django Anaconda Python

Front-end

Vue.js JavaScript HTML5 CSS

Database

PostgreSQL Chroma FAISS Pinecone SQLite

IaaS

AWS AWS S3 GoogleDrive

⚙️ 구현 세부 사항

  • Django을 이용하여 웹어플리케이션 구현
  • Django ORM을 이용하여 PostgreSQL 데이터베이스를 제어
  • ASGI로 웹소켓 채팅
  • Vue.js를 이용하여 인터렉티브한 SPA
  • Prompt Engineering으로 LLM이 특정 작업을 수행하도록 지시하여 응답을 유도
  • LangChain 프레임워크를 통해 템플릿, LLM과 벡터 데이터베이스의 파이프라인을 구축
  • LLM으로 GPT, Gemini, LLaMA 또는 HuggingFace 등 다양한 모델의 API을 유연하게 전환 가능
  • Ollama를 사용해 로컬에서 LLM 모델 실행도 가능
  • Vector Database를 사용한 컨텍스트 관리로 LLM의 기억 저장소 역할 - Chroma, FAISS, Pinecone
  • AWS에서 EC2와 S3를 사용하여 웹 호스팅

🏗️ ERD

ERD

📂 프로젝트 구조

열기
Aplus-EDU
├─ .git
├─ .gitattributes
├─ .gitignore
├─ .gitmodules
├─ accounts
│  ├─ admin.py
│  ├─ apps.py
│  ├─ forms.py
│  ├─ migrations
│  │  ├─ 0001_initial.py
│  │  └─ __init__.py
│  ├─ models.py
│  ├─ signals.py
│  ├─ urls.py
│  ├─ urls_allauth.py
│  ├─ views.py
│  └─ __init__.py
├─ board
│  ├─ admin.py
│  ├─ apps.py
│  ├─ forms.py
│  ├─ migrations
│  │  ├─ 0001_initial.py
│  │  └─ __init__.py
│  ├─ models.py
│  ├─ signals.py
│  ├─ templatetags
│  │  └─ url_utils.py
│  ├─ urls.py
│  ├─ views.py
│  └─ __init__.py
├─ chat
│  ├─ admin.py
│  ├─ apps.py
│  ├─ asgi.py
│  ├─ forms.py
│  ├─ migrations
│  │  ├─ 0001_initial.py
│  │  ├─ 0002_remove_message_bot_message_embedded_and_more.py
│  │  ├─ 0003_remove_message_user_remove_message_video_and_more.py
│  │  └─ __init__.py
│  ├─ models.py
│  ├─ services
│  │  ├─ stt.py
│  │  └─ tts.py
│  ├─ urls.py
│  ├─ views.py
│  ├─ websocket
│  │  ├─ consumers.py
│  │  └─ urls.py
│  └─ __init__.py
├─ config
│  ├─ asgi.py
│  ├─ asset_storage.py
│  ├─ message.py
│  ├─ settings.py
│  ├─ urls.py
│  ├─ views.py
│  ├─ wsgi.py
│  └─ __init__.py
├─ core
│  └─ templatetags
│     ├─ form_tags.py
│     ├─ markdown_tags.py
│     └─ svg_tags.py
├─ dist
│  └─ student_ai-0.3.8-py3-none-any.whl
├─ evaluation
│  ├─ admin.py
│  ├─ apps.py
│  ├─ migrations
│  │  ├─ 0001_initial.py
│  │  ├─ 0002_remove_testresult_testpaper_testresult_message.py
│  │  ├─ 0003_remove_testresult_message_testresult_testpaper_and_more.py
│  │  ├─ 0004_rename_scrore_testresult_score_and_more.py
│  │  └─ __init__.py
│  ├─ models.py
│  ├─ urls.py
│  ├─ views.py
│  └─ __init__.py
├─ home
│  ├─ admin.py
│  ├─ apps.py
│  ├─ context.py
│  ├─ forms.py
│  ├─ migrations
│  │  ├─ 0001_initial.py
│  │  └─ __init__.py
│  ├─ models.py
│  ├─ urls.py
│  ├─ views.py
│  └─ __init__.py
├─ lecture
│  ├─ admin.py
│  ├─ apps.py
│  ├─ migrations
│  │  ├─ 0001_initial.py
│  │  ├─ 0002_alter_lecture_thumbnail_alter_video_file.py
│  │  └─ __init__.py
│  ├─ models.py
│  ├─ urls.py
│  └─ views.py
├─ manage.py
├─ README.md
├─ requirements.txt
├─ static
│  ├─ accounts
│  │  ├─ css
│  │  │  ├─ avatar.css
│  │  │  ├─ consent.css
│  │  │  ├─ signup.css
│  │  │  └─ social-btn.css
│  │  ├─ img
│  │  │  ├─ babyRobot.png
│  │  │  └─ Rei.jpg
│  │  ├─ js
│  │  │  ├─ enableAgree.js
│  │  │  └─ read-image.js
│  │  └─ md
│  │     ├─ personal_agreement.md
│  │     └─ terms_of_use.md
│  ├─ board
│  │  ├─ css
│  │  │  ├─ post_detail.css
│  │  │  └─ post_form.css
│  │  └─ js
│  │     ├─ popupDelete.js
│  │     └─ postsInjection.js
│  ├─ chat
│  │  ├─ css
│  │  │  ├─ app-chat.css
│  │  │  ├─ loading.css
│  │  │  └─ record-voice.css
│  │  ├─ img
│  │  │  ├─ gpt_logo.svg
│  │  │  └─ loading.svg
│  │  └─ js
│  │     ├─ chat.js
│  │     ├─ loading.js
│  │     └─ recordVoice.js
│  ├─ common
│  │  ├─ img
│  │  │  └─ system.png
│  │  └─ lifeQuotes.txt
│  ├─ evaluation
│  │  ├─ img
│  │  │  ├─ A.png
│  │  │  ├─ B.png
│  │  │  ├─ C.png
│  │  │  ├─ D.png
│  │  │  └─ F.png
│  │  └─ js
│  │     ├─ eachEvalsChartBuilder.js
│  │     ├─ historyChartBuilder.js
│  │     ├─ personalChartBuilder.js
│  │     └─ todayEvalsChartBuilder.js
│  ├─ frontdoor
│  │  ├─ css
│  │  │  ├─ avatar.css
│  │  │  ├─ background.css
│  │  │  ├─ footer.css
│  │  │  └─ happynewyear.css
│  │  ├─ img
│  │  │  ├─ babyRobot__1.png
│  │  │  ├─ babyRobot__2.png
│  │  │  ├─ babyRobot__3.png
│  │  │  ├─ babyRobot__4.png
│  │  │  ├─ babyRobot__5.png
│  │  │  ├─ banner (1).png
│  │  │  ├─ banner (2).png
│  │  │  ├─ banner (3).png
│  │  │  ├─ blank profile.png
│  │  │  ├─ EDU.png
│  │  │  ├─ Hyeongseop.png
│  │  │  ├─ Jinsoo.png
│  │  │  ├─ Jinwoo.png
│  │  │  ├─ logoText.png
│  │  │  ├─ profile.png
│  │  │  ├─ robot.gif
│  │  │  ├─ robot1.png
│  │  │  ├─ robot2.png
│  │  │  ├─ robot3.png
│  │  │  ├─ robot4.png
│  │  │  ├─ robot5.png
│  │  │  ├─ Seungho.png
│  │  │  ├─ Woncheol.png
│  │  │  └─ Yeongjin.png
│  │  └─ js
│  │     ├─ frontdoor.js
│  │     └─ happynewyear.js
│  ├─ home
│  │  ├─ css
│  │  │  ├─ faq.css
│  │  │  ├─ home.css
│  │  │  ├─ main.css
│  │  │  └─ snow.css
│  │  ├─ js
│  │  │  ├─ main.js
│  │  │  ├─ readComment.js
│  │  │  ├─ slidePhrase.js
│  │  │  └─ snow.js
│  │  └─ md
│  │     └─ faq.md
│  ├─ lecture
│  │  ├─ css
│  │  │  └─ modal.css
│  │  ├─ img
│  │  │  └─ converse_with_ai.png
│  │  └─ js
│  │     ├─ modal.js
│  │     └─ videoInjection.js
│  └─ vendor
│     ├─ css
│     │  ├─ bootstrap.css
│     │  ├─ sb-admin-2.min.css
│     │  └─ three-dots.css
│     ├─ js
│     │  ├─ bootstrap.js
│     │  └─ menu.js
│     └─ sneat-bootstrap
│        ├─ app-academy.css
│        ├─ app-calendar-events.js
│        ├─ app-calendar.css
│        ├─ app-calendar.js
│        ├─ config.js
│        ├─ core.css
│        ├─ helpers.js
│        └─ theme-default.css
├─ templates
│  ├─ account
│  │  ├─ avatar.html
│  │  ├─ consent.html
│  │  ├─ login.html
│  │  ├─ mypage.html
│  │  ├─ password_reset.html
│  │  ├─ signup.html
│  │  └─ socialbuttons.html
│  ├─ board
│  │  ├─ confirm_delete.html
│  │  ├─ post_detail.html
│  │  └─ post_form.html
│  ├─ chat
│  │  ├─ loading.html
│  │  └─ page.html
│  ├─ evaluation
│  │  ├─ page.html
│  │  └─ personal.html
│  ├─ frontdoor
│  │  ├─ base.html
│  │  ├─ happynewyear.html
│  │  ├─ index.html
│  │  ├─ introduction.html
│  │  └─ topbar.html
│  ├─ home
│  │  ├─ base.html
│  │  ├─ faq.html
│  │  ├─ layout.html
│  │  ├─ main.html
│  │  ├─ sidebar.html
│  │  └─ topbar.html
│  ├─ lecture
│  │  ├─ room.html
│  │  └─ showcase.html
│  └─ socialaccount
│     └─ signup.html
└─ _student-ai

🚀 실행 방법

  1. 요구 패키지 설치
    pip install -r requirements.txt
  2. 환경 변수 입력 .env 파일을 루트 폴더 아래에 생성
ENVIRONMENT= # DEVELOPE (로컬) | PRODUCTION (AWS)
DJANGO_SECRET_KEY= # https://django-secret-key-generator.netlify.app 에서 발급

GITHUB_OAUTH_CLIENT_ID= # https://github.com/settings/developers 새 앱 만들고 Client ID
GITHUB_OAUTH_SECRET= # ...Client secrets
GOOGLE_OAUTH_CLIENT_ID= # https://console.cloud.google.com/apis/credentials 사용자 인증 정보 만들고 클라이언트 ID
GOOGLE_OAUTH_SECRET= # ...클라이언트 보안 비밀번호
NAVER_OAUTH_CLIENT_ID= # https://developers.naver.com/apps 애플리케이션 등록 - 네이버 로그인 API 등록하고 Client ID
NAVER_OAUTH_SECRET= # ...Client Secret
KAKAO_OAUTH_CLIENT_ID= # https://developers.kakao.com/console/app 애플리케이션 추가하기 - 앱 키 - REST API 키
KAKAO_OAUTH_SECRET # ...보안 - Client Secret

DB_MASTER_USER_ID= # 데이터베이스 유저 아이디
DB_MASTER_USER_PWD= # 데이터베이스 유저 비밀번호
DB_HOST= # (로컬) http://localhost | (AWS): https://console.aws.amazon.com/rds - Endpoint

AWS_ACCESS_KEY_ID= # https://aws.amazon.com/ko/iam - 엑세스 키 ID
AWS_SECRET_ACCESS_KEY= # ...비밀 엑세스 키

LLM_PROVIDER= # OPENAI | GOOGLE | HUGGINGFACEHUB | OLLAMA
EMBEDDING_PROVIDER= # OPENAI | GOOGLE | HUGGINGFACEHUB
VECTORSTORE_PROVIDER= # Chroma | FAISS | PINECONE

OPENAI_API_KEY= # https://platform.openai.com/settings/profile?tab=api-keys
GOOGLE_API_KEY= # https://aistudio.google.com/app/apikey
HUGGINGFACEHUB_API_TOKEN= # https://huggingface.co/settings/tokens

OPENAI_LLM_MODEL= # gpt-3.5-turbo | gpt-4 | gpt-4-turbo
GOOGLE_LLM_MODEL= # text-bison@001 | text-bison@002 | gemini-pro
HUGGINGFACEHUB_LLM_MODEL= # mistralai/Mistral-7B-Instruct-v0.2 | https://huggingface.co/models?other=LLM
OLLAMA_LLM_MODEL= # llama3 | phi3 | wizardlm2 | https://ollama.com/library

GOOGLE_EMBEDDING_MODEL= # models/embedding-001
HUGGINGFACEHUB_EMBEDDING_MODEL= # jhgan/ko-sroberta-nli | https://huggingface.co/models?other=embeddings
  1. 데이터베이스로 장고ORM 마이그레이션
    python manage.py migrate
  2. 장고 서버 실행
    python manage.py runserver
  3. 관리자 계정 생성
    python manage.py createsuperuser

Releases

No releases published

Packages

No packages published

Contributors 6