안녕하세요. 이전에 Flask + Ollama로 AI 챗봇을 만들어본 경험을 공유했었는데, 오늘은 그 다음 이야기를 해보려고 합니다.
지난번 프로젝트에서 가장 큰 고민이었던 배포 비용 문제를 해결하면서 동시에 다른 AI 기술도 공부해볼 수 있는 프로젝트를 찾고 있었어요. 그러다가 만들어본 게 'AI Master'라는 AI 강사 매칭 플랫폼입니다.
왜 AI 강사 매칭 서비스를 생각했나
이전 Ollama 프로젝트는 로컬에서는 정말 잘 돌아갔어요. RTX 3060으로 eev-korean-10.8b 모델이 ChatGPT 못지않게 빠르게 답변을 생성했거든요. 하지만 실제 배포를 고려하니까 현실적인 벽이 있더라고요.
- GPU 서버: 월 수십만원 (개인 프로젝트로는 부담)
- CPU 서버: 응답 시간 1-2분 (사용자 경험상 불가능)
그래서 생각했어요. "GPU 없이도 의미있는 AI 서비스를 만들 수 있는 방법이 뭐가 있을까?"
마침 주변에서 AI 도구들을 배우고 싶어하는 사람들이 많더라고요. 미드저니는 어떻게 쓰는지, ChatGPT 프롬프트는 어떻게 짜는지, 런웨이로 영상은 어떻게 만드는지... 근데 이런 걸 체계적으로 가르쳐주는 강사를 찾기는 쉽지 않았어요.
그래서 사용자 니즈에 맞는 AI 강사를 추천해주는 매칭 플랫폼을 만들어보기로 했습니다.
처음 구상한 기능들
기본적으로 AI 분야별 전문 강사들을 데이터베이스에 등록하고, 사용자 요청에 맞는 강사를 추천하는 시스템을 생각했어요.
- 이미지 AI 전문가: 미드저니, 달리, 스테이블 디퓨전 등을 가르치는 강사
- 텍스트 AI 전문가: ChatGPT, 클로드, 제미나이 활용법을 가르치는 강사
- 동영상 AI 전문가: 런웨이, 피카 등 영상 생성 AI를 가르치는 강사
- 음성 AI 전문가: 일레븐랩스, 뮤버트 등 음성 AI를 가르치는 강사
사용자가 "포토샵 대신 쓸 수 있는 이미지 AI 배우고 싶어요"라고 하면, 이미지 AI 전문가 중에서 가장 적합한 강사를 찾아서 추천해주는 방식이었어요.
개발 과정에서 배운 것들
1. 프로토타이핑부터 시작
처음에는 진짜 AI 없이 간단한 키워드 매칭으로 시작했어요.
function getInstructorRecommendation(userInput) {
if (userInput.includes('이미지') || userInput.includes('그림')) {
return {
instructor: '김미드 강사',
specialty: '미드저니, 달리 전문',
experience: '3년'
};
}
// 더 많은 키워드 매칭...
}
이렇게 하니까 사용자들이 어떤 식으로 요청하는지, 어떤 강사 정보를 원하는지 미리 파악할 수 있더라고요.
2. 벡터 검색으로 강사 매칭 정확도 높이기
단순 키워드 매칭으로는 한계가 있어서 다른 방법을 찾아봤어요. 그러다가 알게 된 게 벡터 검색(Vector Search)이었습니다.
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
model = SentenceTransformer('all-MiniLM-L3-v2')
def recommend_instructor(user_input):
# 사용자 요청을 벡터로 변환
user_vector = model.encode([user_input])
# 강사 프로필들과 유사도 계산
similarities = cosine_similarity(user_vector, instructor_vectors)
# 가장 적합한 강사 추천
return get_top_instructors(similarities)
이 방식의 좋은 점
- "로고 만들고 싶어" → 미드저니 전문 강사 추천
- "블로그 글쓰기 도움받고 싶어" → ChatGPT 전문 강사 추천
- 단순 키워드가 아니라 문맥을 이해해서 매칭
그리고 무엇보다 CPU 서버에서도 빠르게 돌아간다는 게 큰 장점이었어요.
3. 강사 데이터 구조 설계
각 강사마다 이런 정보들을 저장했어요.
{
"id": 1,
"name": "김아이 전문가",
"role": "現 네이버 AI 크리에이티브 팀 리드",
"avatar": "fas fa-palette",
"specialties": ["Midjourney", "브랜드디자인", "광고소재", "DALL-E", "Stable Diffusion"],
"keywords": ["이미지", "디자인", "광고", "브랜드", "마케팅", "포스터", "로고", "시각", "크리에이티브", "그래픽"],
"achievement": "💰 Midjourney로 월 500만원 수익 달성\n🎨 삼성전자 광고 캠페인 AI 이미지 제작",
"description": "AI 이미지 생성 도구를 활용한 브랜드 디자인 및 마케팅 소재 제작 전문가입니다. Midjourney, DALL-E, Stable Diffusion 등 최신 이미지 생성 AI를 실무에 적용하여 기업의 비주얼 아이덴티티 구축을 돕습니다."
},
{
"id": 2,
"name": "박비디오 전문가",
"role": "現 카카오 영상 AI 개발팀",
"avatar": "fas fa-video",
"specialties": ["Runway", "Sora", "영상편집", "Pika Labs", "D-ID"],
"keywords": ["영상", "동영상", "비디오", "편집", "유튜브", "콘텐츠", "미디어", "촬영", "쇼츠", "틱톡"],
"achievement": "🎬 AI 영상으로 유튜브 구독자 50만 돌파\n⚡ 영상 제작 시간 90% 단축 노하우 보유",
"description": "AI 영상 생성 및 편집 도구를 활용한 콘텐츠 제작 전문가입니다. Runway, Sora, Pika Labs 등을 사용하여 기업의 마케팅 영상, 교육 콘텐츠, 소셜미디어 영상을 효율적으로 제작합니다."
},
4. 배포에서 만난 문제들
Flask 서버를 Render에 배포하는 과정에서 여러 문제를 겪었어요.
첫 번째 문제: ModuleNotFoundError
→ requirements.txt에 sentence-transformers 등 필요한 라이브러리들 제대로 명시
두 번째 문제: Gunicorn 설정
→ gunicorn app:app --host=0.0.0.0 --port=$PORT 명령어 수정
세 번째 문제: 무한 재시작 루프
이게 가장 골치 아팠어요. AI 모델 로딩 때문에 서버가 계속 재시작되더라고요. → 메모리 사용량 최적화하고 모델 로딩 시간 단축
네 번째 문제: AI 모델 다운로드 타임아웃
처음에 더 큰 모델(all-MiniLM-L6-v2)을 쓰려다가 배포 시간 초과로 실패 → 더 가벼운 모델(all-MiniLM-L3-v2)로 변경
다섯 번째 문제: 모바일 메뉴 UI 문제
배포 후에 모바일에서 테스트해보니 메뉴가 제대로 안 보이더라고요. → CSS 미디어 쿼리로 햄버거 메뉴 구현, 모바일 사용자 경험 개선
최종 시스템 구조
완성된 시스템은 이렇게 동작해요:
사용자: "이미지 AI 배우고 싶어요"
↓
Flask 서버에서 요청 받음
↓
SentenceTransformer로 문장을 벡터로 변환
↓
미리 준비된 강사 프로필들과 유사도 계산
↓
가장 적합한 강사 3명 추천
↓
강사 정보를 JSON으로 반환
기술 스택
- 프론트엔드: HTML, CSS, JavaScript
- 백엔드: Python Flask
- AI 엔진: SentenceTransformers
- 데이터: 하드코딩된 강사 정보 (향후 DB 연동 예정)
- 배포: Render.com
이전 프로젝트와 비교
구분 | Before | After |
목적 | 질문에 답변 생성 | AI 강사 매칭 |
AI 기술 | 텍스트 생성 (LLM) | 벡터 검색 |
서버 요구사항 | GPU 필수 | CPU로 충분 |
응답 속도 | GPU: 빠름, CPU: 매우 느림 | CPU에서도 0.5초 |
배포 비용 | 월 수십만원 | 거의 무료 |
메모리 사용량 | 8GB+ | 1GB 미만 |
확장성 | 모델 교체 어려움 | 강사 데이터 추가 쉬움 |
두 프로젝트 모두 각각의 의미가 있지만, 개인 프로젝트로 실제 서비스까지 고려한다면 AI Master 방식이 훨씬 현실적이더라고요.
실제 동작 예시
사용자가 "포토샵 대신 쓸 수 있는 AI 툴 배우고 싶어요"라고 입력하면,
- 벡터 검색으로 의미 분석
- 이미지 AI 카테고리의 강사들과 매칭
- 추천 결과:
🎨 추천 강사: 김미드 님
전문 분야: 미드저니, 달리, 스테이블 디퓨전
경력: 3년간 이미지 AI 전문 강의
특이사항: 기업 워크샵 50회 이상, 포토샵 대체 AI 툴 전문
아쉬운 점과 배운 점
아쉬운 점
- 강사 데이터가 하드코딩되어 있어서 실제 강사 등록 시스템이 없음
- 실제 예약이나 결제 기능까지는 구현 못함
- 강사 평가나 후기 시스템이 없어서 품질 검증이 어려움
배운 점
- 모든 AI 서비스가 거대한 모델을 필요로 하는 건 아니다
- 문제에 맞는 적절한 기술 선택이 중요하다
- 프로토타이핑으로 빠르게 검증하는 방법
- 벡터 검색이 단순한 추천 시스템에도 유용하다
특히 이전 프로젝트에서 겪었던 배포 비용 문제를 다른 접근 방식으로 해결할 수 있다는 걸 배운 게 가장 큰 수확이었어요.
앞으로 해보고 싶은 것들
1. 데이터베이스 체계 구축
지금은 강사 정보를 하드코딩으로 관리하고 있는데, 강사가 많아지면 한계가 있을 것 같아요.
- PostgreSQL이나 MySQL 같은 관계형 데이터베이스 도입
- 강사 정보, 사용자 정보, 수업 이력 등을 체계적으로 관리
- 관리자 페이지에서 강사 등록/수정이 쉽게 되도록
2. 사용자 인증 시스템
현재는 로그인 없이 추천만 받을 수 있는데, 실제 서비스로 발전시키려면:
- 회원가입/로그인 기능 (Flask-Login 사용 예정)
- 사용자별 관심 분야 저장
- 추천 받은 강사 북마크 기능
- 개인화된 추천 히스토리
3. 실제 예약 및 결제 시스템
매칭만으로 끝나지 않고 실제 수업으로 이어지도록:
- 강사 스케줄 관리 시스템
- 결제 기능 (아임포트나 토스페이먼츠 연동)
- 예약 확인 및 취소 기능
- 수업 완료 후 자동 정산 시스템
4. 커뮤니티 기능
사용자들이 AI 학습 경험을 공유할 수 있는 공간:
- 수업 후기 및 평점 시스템
- AI 도구 활용 팁 공유 게시판
- 질문/답변 커뮤니티 (같은 분야 수강생들끼리)
- 강사별 팬 커뮤니티나 스터디 그룹
5. 서비스 고도화
- 더 세분화된 AI 분야 (코딩 AI, 디자인 AI, 데이터 분석 AI 등)
- 강사 평가 시스템으로 품질 관리
- 수업 만족도 기반 추천 알고리즘 개선
- 이번에 배운 벡터 검색을 다른 매칭 서비스에도 적용
이런 기능들을 단계별로 차근차근 만들어보면 재미있을 것 같습니다.
마치며
Ollama 프로젝트에서 배포 비용 때문에 고민이 많았는데, 이번 프로젝트를 통해서 다른 방향의 해결책을 찾을 수 있었어요.
AI 서비스라고 해서 무조건 최신 거대 모델을 써야 하는 건 아니더라고요. 사용자 문제를 해결하는 데 적합한 기술을 선택하는 게 더 중요한 것 같습니다. 비슷한 고민을 하고 계신 분들에게 조금이라도 도움이 되었으면 좋겠어요.
'SideProject' 카테고리의 다른 글
비전공자의 AI 개발 도전기 3편: Django로 업그레이드한 AI 도구 추천 사이트 (1) | 2025.06.27 |
---|---|
비전공자의 AI 개발 도전기: Flask + Ollama로 나만의 챗봇 만들기 (3) | 2025.06.18 |
댓글