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