미션_생성 - 100-hours-a-week/12-marong-Wiki GitHub Wiki

📍 미션 생성

마니또 게임에 사용되는 미션을 LLM 기반으로 생성해주는 서비스

📍 파일 구조

12-marong-AI-mission/
├── main.py                      # 메인 실행 파일
├── main_tool.py                 # Backend DB 기반 미션 생성 정보 조회 도구
│
├── core/
│   └── clova_inference.py       # 미션 생성 핵심 파이프라인
│
├── db/
│   ├── db.py                    # Backend DB 연결
│   └── db_models.py             # DB 모델 정의
│
├── postprocess/
│   ├── clean_mission.py         # 미션 유효성 필터링
│   ├── config.py                # 랜덤 쿼리 등 설정값
│   ├── difficulty_classify.py   # 난이도 판별기
│   └── emoji_gen.py             # 이모지 추가 도구
│
├── scripts/
│   ├── run_chroma.py            # ChromaDB 서버 실행 스크립트
│   └── sbert_down.py            # SBERT 모델 다운로드 스크립트
│
└── README.md

📍 모델 선정 및 사용 이유

  • 사용 모델: HyperCLOVA 1.5B
  • 이유: 후처리 통과 비율, RAG 재사용률, 독자 생성 비율, 생성 속도, GPU 예약 메모리를 종합적으로 검토하였을 때, HyperCLOVA 1.5B를 미션 생성 모델로 선정.

📍 주요 흐름

  • 랜덤 쿼리, 그룹 설명 프롬프트, 좋아요 상위 피드를 LLM(HyperCLOVA) 프롬프트에 입력하고, RAG Context를 참고하여 RAG 결과 활용 및 LLM 기반 미션 생성
[사용자 쿼리 or 랜덤 쿼리 or 피드 기반 콘텐츠]
        + 그룹별 설명 텍스트 (LLM 프롬프트 포함)
         ↓
    유사 예시 검색 (ChromaDB)
         ↓
LLM 텍스트 생성 (LangChain + HuggingFace)
         ↓
    문장 정제 / 난이도 분류
         ↓
    중복 제거 / 이모지 부착
         ↓
     최종 미션 리스트 반환

✔️ Chroma DB에 미션 데이터 상, 중, 하 별로 INSERT

  • 웹사이트에서 수집한 장소 리뷰 데이터와 메타 데이터를 Chroma DB에 저장
# 유효 데이터 필터링
valid_documents = []
valid_metadatas = []
valid_mission_embs = []
valid_ids = []

for idx, row in df.iterrows():
    mission_emb = row['미션_임베딩']

    if mission_emb is not None:
        valid_documents.append(row['미션_내용'])
        valid_mission_embs.append(mission_emb)

        metadata = {
            "난이도": row.get('난이도', ''),
        }
        valid_metadatas.append(metadata)
        valid_ids.append(f"id_{idx + 1}")

# 배치 업로드 함수
def add_to_chroma_in_batches(collection, documents, embeddings, metadatas, ids, batch_size=500):
    for i in range(0, len(documents), batch_size):
        batch_docs = documents[i:i+batch_size]
        batch_embs = embeddings[i:i+batch_size]
        batch_meta = metadatas[i:i+batch_size]
        batch_ids = ids[i:i+batch_size]

        collection.add(
            documents=batch_docs,
            embeddings=batch_embs,
            metadatas=batch_meta,
            ids=batch_ids
        )
        print(f"Added batch {i // batch_size + 1}")

# 업로드 실행
add_to_chroma_in_batches(mission_collection, valid_documents, valid_mission_embs, valid_metadatas, valid_ids)

# 문서 수 확인
print("미션 컬렉션 문서 수:", mission_collection.count())

✔️ LLM 미션 생성 객체 생성

  • ClovaInference 클래스로 마니또 미션 생성을 위한 객체 생성
  • model, contents, tokenizer, sbert_model, mission_collection, hated_mission_collection, group_description를 전달하면 모듈이 미션 생성 시작
clova_llm = ClovaInference(model=model, contents=contents, tokenizer=tokenizer, sbert_model=sbert_model, 
                                mission_collection=mission_collection, hated_mission_collection=hated_mission_collection, group_description=g_desc, user_query=None)
        llm_missions = clova_llm.infer()

✔️ 미션 생성 변수 설명

  • 피드 컨텐츠: 지난 3주 간 좋아요가 많은 피드를 미션 난이도 별로 상, 중, 하 별로 조회한 데이터
  • tokenizer: HyperCLOVA 기본 모델
  • model: HyperCLOVA Peft 기반 LoRA 파인튜닝 데이터
  • mission_collection: RAG를 위한 미션 데이터가 저장된 컬렉션
  • is_hated_collection: 코사인 유사도 기반 부담스러운 미션 데이터인지 여부를 판별하기 위한 컬렉션
  • group_description: HyperCLOVA의 프롬프트에 추가되는 그룹별 설명

📍 결과 예시(MySQL DB에 저장)

{
  '중': [
    ('마니띠의 디스코드 메시지에 귀여운 이모지 달기 😺', '마니또 미션: ⭐️ 달기'),
    ('마니띠가 쓴 개발 용어에 리액션 달기 💻', '마니또 미션: ⭐️ 달기'),
    ('마니띠가 올린 글을 조용히 북마크 하기 📌', '마니또 미션: ⭐️ 하기')
  ]
}