---
base_model: unsloth/gemma-2-9b-it-bnb-4bit
tags:
- text-generation-inference
- transformers
- gemma2
- trl
license: creativeml-openrail-m
language:
- ko
---

# QCR + GEN for Conversational RAG Chatbot

## 개요

이 모델은 **QCR**(Query Context Rewriter)과 **GEN**(Generator) 기능을 동시에 수행하는 하나의 LoRA 어댑터 모델입니다. 검색 기반 챗봇이나 RAG(Retrieval-Augmented Generation) 시스템에서 활용할 수 있도록 설계되었습니다.

- **QCR 기능**: 사용자의 입력을 분석하여 검색에 필요한 쿼리를 생성하거나, 필요하지 않을 경우 빈 문자열을 반환합니다.
- **GEN 기능**: 검색된 문서 청크(또는 컨텍스트)를 활용하여 자연스러운 답변을 생성합니다.

이 모델은 4bit 양자화된 버전과 일반 버전 모두 지원하므로, 원하는 환경에서 사용할 수 있습니다.

## 데이터셋 및 학습 특징

- **10개 주요 토픽**(가족/주거, 스포츠, 쇼핑, 미용/건강 등)의 대화 데이터를 증강하여 제작.
- **약 18,000개의 QCR + GEN 샘플** 포함.
- **QCR 데이터**
  - 일반 대화(인사, 농담 등)는 **빈 문자열**(`""`)을 반환하여 검색을 생략하고 즉시 답변 가능.
- **GEN 데이터**
  - 검색된 문서 청크(최대 5개, 각 512 토큰 이하)를 활용하여 답변 생성.
  - **6가지 다양한 데이터 구성**:
    1. 관련 정보가 있는 답변
    2. 관련 정보가 없는 답변
    3. 관련성이 혼재된 상황
    4. 검색 청크가 전혀 없는 경우 등
  
이러한 데이터 구성을 통해 **더 자연스러운 대화**를 구현할 수 있도록 학습되었습니다.

## 모델 사용 방식

1. **QCR을 통해 검색 쿼리 생성** → 검색 엔진을 통해 문서 검색 → **GEN으로 답변 생성**
2. 불필요한 검색 방지(QCR이 빈 문자열 반환) → 인사, 잡담 등은 직접 응답 가능.
3. 4bit 양자화 모델 사용 가능 → 메모리 절감 및 고속 추론 가능.

## 프롬프트 템플릿

### Query Context Rewriter (QCR)
```
# Query Rewriter

### Instruction:
다음은 대화 기록(Context)와 사용자의 질문(Input)입니다.
사용자의 질문에 답을 제공하기 위해 필요한 단일 문자열 검색 쿼리를 생성하세요.
검색이 필요하지 않거나 쿼리가 불필요한 경우(인사, 잡담 등)에는 빈 문자열을 반환하세요.

최종 출력 형식은 {'search': '<검색 쿼리>'}입니다.

### Conversation:
{대화 맥락}

### Input:
{사용자 질문}

### Response:
{'search': '{생성된 검색 쿼리 또는 빈 문자열}'}
```

### Generator (GEN)
```
# Generator

### Instruction:
당신은 외부검색을 이용하여 사용자에게 도움을 주는 인공지능 조수입니다.

- Context는 외부검색을 통해 반환된 사용자 요청과 관련된 정보들입니다.
- Context를 활용할 때 문장 끝에 사용한 문서 조각의 [Index]를 붙이고 자연스러운 답변을 작성하세요. (e.g. [1])
- Context의 정보가 사용자 요청과 관련이 없거나 도움이 안될 수 있습니다. 관련있는 정보만 활용하고, 없는 정보를 절대 지어내지 마세요.
- 되도록이면 일반 지식으로 답변하지 말고, 최대한 Context를 통해 답변을 하려고 하세요.
- Context에 없을 경우에는 이 점을 언급하며 사죄하고 다른 주제나 질문을 추천해주세요.
- 사용자 요청에 알맞는 자연스러운 대화를 하세요.
- 항상 존댓말로 답변하세요.

### Conversation:
{대화 맥락}

### Context:
{검색된 문서 청크}

### Input:
{사용자 질문}

### Response:
{모델이 생성한 응답}
```

# 예시 대화 샘플

## 1. 검색이 필요 없는 경우
### 예제 1: 인사 및 일반적인 대화
```
User> 안녕? 넌 누구니?

[QCR 단계] 검색 쿼리 생성...
{'search': ''}  → 검색 불필요로 판단.

[답변 생성 중]...
Assistant> 안녕하세요! 저는 외부검색을 통해 다양한 정보를 활용하여 사용자님께 도움을 주는 인공지능 조수입니다. 어떤 주제나 질문이든 편하게 말씀해 주세요. 오늘 하루가 어떠셨나요?
```

## 2. 검색이 필요한 경우
### 예제 2: 영화 추천 요청
```
User> 넷플릭스에서 볼만한 영화 추천해줘.

[QCR 단계] 검색 쿼리 생성...
{'search': '넷플릭스 추천 영화 목록'} → 검색 필요.

[검색된 문서 활용 후 답변 생성]
Assistant> 넷플릭스에서 인기 있는 영화 목록은 다음과 같습니다.
1. '블랙 미러: 밴더스내치'
2. '돈 룩 업'
3. '익스트랙션'
더 궁금한 점이 있으시면 말씀해주세요!
```

### 예제 3: 특정 정보 요청 (스포츠 규칙)
```
User> 복싱의 룰이 어떻게 되나요?

[QCR 단계] 검색 쿼리 생성...
{'search': '복싱 룰 설명'} → 검색 필요.

[검색된 문서 활용 후 답변 생성]
Assistant> 복싱 경기의 기본 룰은 다음과 같습니다.
- 각 라운드는 3분 진행되며, 1분의 휴식이 주어집니다.
- 글러브 착용은 필수이며, 다운된 선수는 10초 안에 일어나야 합니다.
- 주요 타격 기술로는 스트레이트, 훅, 어퍼컷 등이 있습니다.
더 궁금한 사항이 있으시면 질문해주세요!
```

## 3. 과거 대화 기반 질문
### 예제 4: 문맥을 유지한 질문
```
User> 넷플릭스 영화 추천해줘.

[QCR 단계] 검색 쿼리 생성...
{'search': '넷플릭스 추천 영화 목록'} → 검색 필요.

[검색된 문서 활용 후 답변 생성]
Assistant> 넷플릭스에서 인기 있는 영화 목록은 다음과 같습니다.
1. '블랙 미러: 밴더스내치'
2. '돈 룩 업'
3. '익스트랙션'

User> 오징어 게임은 어때?

[QCR 단계] 검색 쿼리 생성...
{'search': '오징어 게임 정보'} → 검색 필요.

[검색된 문서 활용 후 답변 생성]
Assistant> '오징어 게임'은 넷플릭스에서 방영된 인기 서바이벌 드라마로, 456억 원의 상금을 건 생존 게임을 다룹니다. 게임에는 '무궁화꽃이 피었습니다', '달고나 뽑기' 등의 한국 전통 놀이가 포함되어 있습니다. 시즌 2 제작이 확정되었으며, 2024년 방영 예정입니다. 더 자세한 정보가 필요하시면 알려주세요!
```

## 4. 갑작스러운 토픽 변경
### 예제 5: 검색 중간에 주제 전환
```
User> 넷플릭스에서 볼만한 영화 추천해줘.

[QCR 단계] 검색 쿼리 생성...
{'search': '넷플릭스 추천 영화 목록'} → 검색 필요.

User> 근데 레슬링 규칙은 어떻게 돼?

[QCR 단계] 검색 쿼리 생성...
{'search': '레슬링 규칙 설명'} → 검색 필요.

[검색된 문서 활용 후 답변 생성]
Assistant> 레슬링은 던지기, 쓰러뜨리기, 꺾기 등의 기술을 이용하여 상대를 제압하는 스포츠입니다. 경기 방식은 올림픽 스타일인 '그레코로만형'과 '자유형'으로 나뉩니다. 특정 규칙이 궁금하시다면 추가로 질문해주세요!
```

이러한 예시들을 참고하여 검색 기반 모델을 효과적으로 활용할 수 있습니다.

## 테스트 노트북 (Colab)

간단히 코드를 실행해보려면 [test_run.ipynb](https://huggingface.co/Austin9/gemma-2-9b-it-Ko-RAG/blob/main/test_run.ipynb) 파일을 Google Colab에서 바로 열어보세요.  
- **런타임 유형**에서 GPU를 **T4**로 선택하세요.  
- 이후, **셀을 순서대로 실행**하며 필요한 라이브러리를 설치하고 모델 및 FAISS 인덱스를 로드합니다.  
- 완성된 RAG 기반 챗봇 예시 코드를 체험할 수 있습니다
  
## 주의사항
- 검색 엔진과 함께 사용할 경우 **QCR을 먼저 실행하여 검색 쿼리를 생성**한 후, 검색된 문서 청크를 바탕으로 **GEN을 실행**해야 합니다.
- 검색된 청크는 최대 **512 토큰** 길이이며, 학습 과정에서 **최대 5개의 청크**를 반영하였으므로 이에 맞춰 활용하는 것이 중요합니다.
- QCR의 **프롬프트 형식을 반드시 지켜야** 검색 쿼리 생성이 올바르게 이루어집니다.
- GEN의 답변에서는 검색된 문서 출처(Index)를 정확히 기재해야 하며, 관련성이 없으면 없는대로 안내해야 합니다.

이 모델을 통해 보다 **효율적인 검색 + 정확한 답변**을 제공하는 AI 시스템을 구축할 수 있습니다.