SK네트웍스 Family AI캠프 10기 15주차 회고록 (25.04.14 ~ 25.04.18)
기간: 25.04.14 ~ 25.04.18
학습 내용 요약
※ 미니프로젝트3 회고록 – 요리왕 좌룡
이번 미니 프로젝트에서는 요리왕 좌룡이라는 AI 기반 요리 추천 챗봇 서비스를 만들었다. 사용자가 가진 재료, 조리도구, 요리 시간을 기반으로 실행 가능한 레시피를 추천해주는 시스템을 목표로 잡았다. 단순한 키워드 검색이 아닌, LLM과 RAG 방식을 활용해서 조건에 맞는 요리를 제안하는 게 핵심이었다.
1. 서비스 기획 배경
- 검색의 한계: ‘된장찌개’가 땡겨도 ‘된장찌개’라는 단어가 떠오르지 않으면 검색 자체가 어렵다. 우리는 이 문제에서 출발했다.
- 현실적인 불편: 자취하면서 느꼈던, “냉장고에 뭐가 있긴 한데 뭘 해먹어야 하지…” 하는 막막함을 해결하고 싶었다.
- 사용자 제약 고려: 직장인, 자취생처럼 시간이 부족하거나 도구가 제한적인 사람들도 요리를 쉽게 할 수 있도록 설계했다.
2. 사용자 흐름 (UX 시나리오)
사용자가 챗봇에게 재료, 도구, 시간을 입력하면 → 챗봇이 조건에 맞는 요리를 추천 → 조리 방법, 대체 재료, 순서까지 단계별로 안내해준다.
3. 주요 기술 구성
- LLM 모델: 파인튜닝된
gemma3-4b
모델을 사용해서 사용자의 조건을 자연스럽게 이해하고 적절한 요리를 추천하도록 구성.
- RAG 방식: BeautifulSoup으로 만개의 레시피 데이터를 크롤링하고, RAG로 검색 기반 질의응답을 구현했다.
- Embedding + Vector DB: OpenAI embedding 모델로 벡터화 → FAISS를 통해 비슷한 레시피를 빠르게 찾는다.
4. 데이터 수집 및 전처리
- YouTube 자막:
yt-dlp
를 사용해서 요리 영상의 자막을 수집하고, 이를 Q&A 형태의 데이터셋으로 구성.
- 웹 크롤링: 만개의 레시피 사이트에서 실사용 가능한 레시피 정보를 가져와 추천 품질을 보강했다.
5. 기능 확장 아이디어
- 후속 질문 대응: “다른 요리는?”처럼 자연스러운 대화를 이어갈 수 있도록 설계.
- 재료 이미지 OCR: 사진만 올려도 어떤 재료가 있는지 파악할 수 있도록 이미지 처리 기능을 고려했다.
- 장보기 연동: 부족한 재료를 바로 쇼핑몰 장바구니로 연동하는 기능도 기획 중이다.
6. 문제 해결 과정
- Fine-Tuning + RAG 충돌: 두 방식을 같이 쓰니까 답변이 꼬이는 문제가 있었는데, 방식별 독립 실행 경로를 만들어 해결했다.
- API 사용량 제한: OpenAI 호출 제한에 걸렸을 땐, CSV로 나눠 저장하고 시간 간격을 두어 안정적으로 데이터셋을 만들 수 있었다.
7. 최종 결과
실제 요리가 가능한, 조건 맞춤형 레시피를 추천해주는 챗봇을 완성했다. 대체 재료 제안, 조리 순서 안내, 사용자의 시간/도구 조건까지 반영한 점에서 현실적으로 꽤 쓸만한 결과물을 만들어냈다고 생각한다.
※ Docker 실습 정리
내가 작성한 관련 글: Docker 사용법 바로가기
Docker 명령어와 이미지/컨테이너 관리 방법을 정리해봤다. 특히 우분투 이미지 실행, MySQL 컨테이너 활용, docker-compose 사용 등 실습 중심으로 익혔다.
실습 내용은 항목별로 나눠 정리했고, 실전에서도 바로 쓸 수 있도록 예제 중심으로 구성했다.
※ Linux 실습 정리
내가 작성한 관련 글: Linux 사용법 바로가기
도커 환경에서 우분투를 띄운 뒤, 리눅스 명령어와 셸 스크립트를 본격적으로 실습했다. 사용자 계정 관리, 권한 설정, 파일 조작, 쉘 스크립트 작성, 환경 변수 설정 등 서버 작업에 꼭 필요한 기본기를 익혔다.
트러블 슈팅
Fine-Tuning + RAG 혼합 사용 문제
두 방식을 함께 쓰니까 모델이 혼란스러워서 이상한 답을 내놓는 경우가 있었다. 그래서 각 방식을 독립적으로 실행하도록 구조를 바꿨고, 응답 적절성을 판단해서 상황에 맞는 방식만 작동하게끔 수정했다.
OpenAI API 제한 문제
OpenAI 호출이 일정량을 넘으면 끊겨버리는 문제. 그래서 데이터를 CSV 단위로 나누고, 요청마다 시간 간격을 두는 방식으로 우회했다. 덕분에 안정적으로 학습 데이터를 수집할 수 있었다.
시스템 메시지 프롬프트 문제
초기 system message 프롬프트가 LLM에 제대로 전달되지 않아서 원하는 형식대로 답변을 못 받는 문제가 있었는데, 다른 사례들을 참고해서 예시와 함께 프롬프트를 수정했다. 이후엔 원하는 형태의 응답이 잘 생성되었다.
KPT 회고 (15주차)
Keep
- 미니프로젝트 결과물이 괜찮아서 뿌듯했다. 노력한 만큼 좋은 피드백도 받았고, 특히 강사님이 칭찬해주신 부분은 오랫동안 기억에 남을 것 같다.
- 개인적으로도 많이 지친 한 주였지만, 그 와중에 결과를 만들어낸 내가 대견했다. 이 흐름, 다음 프로젝트까지 이어가고 싶다.
Problem
- 헬스장에 못 갔다. 체력도 중요하다는 걸 머리로는 알고 있었는데, 이번 주는 시간도 없고 정신적으로도 버거워서 실천이 잘 안 됐다.
- 프로젝트 집중도 좋지만, 체력과 멘탈 관리도 장기전을 위해선 꼭 필요하다는 걸 다시 느꼈다.
Try
- 운동 시간 확보하기: 스트레스 해소와 집중력 유지를 위해 운동은 필수. 루틴을 만들어 매일 30분이라도 몸을 움직이려 한다.
- 시간 관리 체계화: 다음 미니프로젝트, 최종 프로젝트는 역할 분담도 중요해서 일정 조율을 더 잘해야 할 것 같다. 휴식 시간도 업무 못지않게 중요하게 챙길 예정이다.
- 지속적인 자기 관리: 체력, 식습관, 수면 모두 포함해서 스스로를 유지하는 습관을 만들어야겠다. 프로젝트가 많아도 꾸준함은 무기다.
마무리
-
이번 주는 정신적으로 쉽지 않았지만, 결과적으로 만족스러운 한 주였다. 미니프로젝트 결과가 좋았고, 그만큼 얻은 피드백도 많았다. 앞으로의 프로젝트에서도 '끝까지 간다'는 마음으로 임할 계획이다.
-
그리고 다시 한 번 느꼈다. 지속 가능성은 체력과 루틴에서 나온다. 집중력도 습관에서 오고, 성과도 꾸준함에서 온다. 다음 미니프로젝트와 최종 프로젝트에서도 남들이 어떻든지 쉽게 흔들리지 않고, 내 방식대로 밀어붙여 좋은 결과를 만들 수 있도록 노력하겠다.