Skip to content

KKPASII/KangwonMungo

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

139 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

KangwonMungo 📚

AI 기반 도서 추천 시스템 (RAG)


🔥 프로젝트 소개

KangwonMungo는 사용자의 취향과 대화 맥락을 기반으로 도서를 추천하는
RAG(Retrieval-Augmented Generation) 기반 AI 추천 시스템입니다.

기존 추천 시스템의 한계였던

  • 평점/구매 이력 기반 추천
  • 사용자 취향 반영 부족

을 해결하기 위해,

  • 벡터 기반 유사도 검색
  • LLM 기반 자연어 응답 생성

을 결합한 구조로 설계되었습니다.


🎥 시연 영상


🧩 아키텍처

img.png


🛠 기술 스택

🧠 AI / Data

Gemini ChromaDB Embedding

⚙️ Backend

Python FastAPI

🎨 Frontend

React TypeScript Axios

🗄️ Database

SQLite

🔍 Crawling

Selenium BeautifulSoup

🚀 주요 기능

  • 💬 채팅 기반 도서 추천
  • 🧠 사용자 취향 분석 (키워드 / 분위기 / 장르)
  • 🔍 벡터 기반 유사도 검색
  • 📚 관심 도서 등록 및 관리
  • 🤖 LLM 기반 추천 이유 및 요약 생성

👨‍💻 담당 역할

  • RAG 구조 설계 및 구현
  • LLM 프롬프트 설계 (키워드 추출 / 도서 검색 쿼리 생성 / 도서 추천 응답 생성 )

📄 동작 흐름

  1. 사용자 입력 (채팅)
  2. LLM을 통해 키워드 및 취향 추출
  3. 검색 쿼리 생성
  4. 벡터 DB에서 유사 도서 검색
  5. 검색 결과 + 사용자 맥락 기반 LLM 응답 생성
  6. 추천 도서 및 설명 반환

⚡ 트러블슈팅

프롬프트 씹힘 문제 (지시사항 일부 무시)

  • 문제:
    CoT(Chain of Thought) 기반으로 프롬프트를 설계하고,
    Intent 분류 및 JSON 출력 구조까지 정의했음에도 불구하고
    특정 상황에서 LLM이 일부 규칙을 무시하거나 출력 형식을 지키지 않는 문제가 발생함

  • 현상:

    • generated_response 형식이 깨지거나 일부 필드 누락
    • search_trigger 조건을 제대로 따르지 않는 경우 발생
    • 잘 동작하다가 특정 입력에서 갑자기 비정상적인 결과 출력
  • 원인 분석:

    • 긴 프롬프트에서 규칙(규정, CoT, JSON 구조)의 우선순위가 명확하지 않음
    • 자연어 기반 응답이기 때문에 모델이 일부 조건을 "생략"하는 경향 존재
    • CoT는 사고 유도에는 효과적이지만 출력 형식을 강제하지 못함
  • 해결:

    • 출력 형식을 Markdown 표 형태로 강제
    • JSON 구조와 필드 순서를 명확히 고정
    • 시스템 프롬프트에서 역할 / 작업 / 출력 형식을 분리하여 재정의
    • Few-shot 예시를 추가하여 출력 패턴을 학습시키는 방식 적용
  • 결과:

    • 필드 누락 및 규칙 무시 문제 해결
    • 추천 결과 일관성 향상
  • 배운 점:
    CoT(Chain of Thought)를 적용하면 모델이 단계적으로 사고하도록 유도할 수 있다고 생각했지만,
    실제로는 일부 지시사항을 생략하거나 shortcut을 사용하는 문제가 발생할 수 있음을 경험했다.

    특히 자연어 기반의 프롬프트는 모델이 지시사항의 우선순위를 스스로 해석하기 때문에,
    특정 조건이나 출력 형식이 일관되게 유지되지 않는 문제가 발생했다.

    이를 해결하기 위해 마크다운 표와 같은 구조화된 출력 형식을 명시적으로 정의하여 적용했고,
    그 결과 모델이 자유롭게 응답하는 대신 정해진 틀에 맞춰 정보를 채우도록 유도할 수 있었다.

    이 경험을 통해 단순한 reasoning 유도만으로는 출력 안정성을 보장할 수 없으며,
    출력 구조를 강제하는 설계(Output Control)가 LLM 활용에서 중요한 요소라는 것을 깨달았다.


실행 방법

# 패키지 설치
npm install
pip install axios fastapi pydantic

# 로컬 서버 실행
cd KANGWONMUNGO/Frontend
npm run dev

# 백엔드 서버 실행
uvicorn backend.app.main:app --reload

# chroma db 설명
- chroma db 폴더에 chroma.sqlite3만 있을 경우, chroma db 폴더를 삭제한 뒤 main.py를 실행하여 다시 생성
- chroma db 폴더에 .bin 폴더들이 있어야, 도서 검색 가능합니다

# 서버 중단
ctrl + c

About

"RAG 기반 LLM 도서 추천 시스템"

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • Python 99.6%
  • PowerShell 0.2%
  • TypeScript 0.1%
  • CSS 0.1%
  • Batchfile 0.0%
  • JavaScript 0.0%