Austin9's picture
Update README.md
81b85b6 verified
|
raw
history blame
8.74 kB
---
base_model: unsloth/gemma-2-2b-it
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://colab.research.google.com/github/Austin9/gemma-2-9b-it-Ko-RAG/blob/main/test_run.ipynb) νŒŒμΌμ„ Google Colabμ—μ„œ λ°”λ‘œ μ—΄μ–΄λ³΄μ„Έμš”.
- **λŸ°νƒ€μž„ μœ ν˜•**μ—μ„œ GPUλ₯Ό **T4**둜 μ„ νƒν•˜μ„Έμš”.
- μœ„ μ½”λž© νŒŒμΌμ€ 9b λͺ¨λΈ μΆ”λ‘  파일이기 λ•Œλ¬Έμ—, λͺ¨λΈ λ‘œλ”©μ‹œ 9b -> 2b둜 λ³€κ²½ν•˜κ³  load_in_4bit λ³€μˆ˜λ₯Ό False둜 λ³€κ²½ ν›„ μ‚¬μš©ν•΄μ•Όν•©λ‹ˆλ‹€.
- 이후, **셀을 μˆœμ„œλŒ€λ‘œ μ‹€ν–‰**ν•˜λ©° ν•„μš”ν•œ 라이브러리λ₯Ό μ„€μΉ˜ν•˜κ³  λͺ¨λΈ 및 FAISS 인덱슀λ₯Ό λ‘œλ“œν•©λ‹ˆλ‹€.
- μ™„μ„±λœ RAG 기반 챗봇 μ˜ˆμ‹œ μ½”λ“œλ₯Ό μ²΄ν—˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
## μ£Όμ˜μ‚¬ν•­
- 검색 엔진과 ν•¨κ»˜ μ‚¬μš©ν•  경우 **QCR을 λ¨Όμ € μ‹€ν–‰ν•˜μ—¬ 검색 쿼리λ₯Ό 생성**ν•œ ν›„, κ²€μƒ‰λœ λ¬Έμ„œ 청크λ₯Ό λ°”νƒ•μœΌλ‘œ **GEN을 μ‹€ν–‰**ν•΄μ•Ό ν•©λ‹ˆλ‹€.
- κ²€μƒ‰λœ μ²­ν¬λŠ” μ΅œλŒ€ **512 토큰** 길이이며, ν•™μŠ΅ κ³Όμ •μ—μ„œ **μ΅œλŒ€ 5개의 청크**λ₯Ό λ°˜μ˜ν•˜μ˜€μœΌλ―€λ‘œ 이에 맞좰 ν™œμš©ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.
- QCR의 **ν”„λ‘¬ν”„νŠΈ ν˜•μ‹μ„ λ°˜λ“œμ‹œ μ§€μΌœμ•Ό** 검색 쿼리 생성이 μ˜¬λ°”λ₯΄κ²Œ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.
- GEN의 λ‹΅λ³€μ—μ„œλŠ” κ²€μƒ‰λœ λ¬Έμ„œ 좜처(Index)λ₯Ό μ •ν™•νžˆ κΈ°μž¬ν•΄μ•Ό ν•˜λ©°, 관련성이 μ—†μœΌλ©΄ μ—†λŠ”λŒ€λ‘œ μ•ˆλ‚΄ν•΄μ•Ό ν•©λ‹ˆλ‹€.
- μœ„ 2b λͺ¨λΈ 같은 κ²½μš°λŠ” 9b λͺ¨λΈμ— λΉ„ν•˜μ—¬ 언어적, 논리적 μΈ‘λ©΄μ—μ„œ μž¦μ€ ν• λ£¨μ‹œλ„€μ΄μ…˜μ„ μ²΄ν—˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
이 λͺ¨λΈμ„ 톡해 보닀 **효율적인 검색 + μ •ν™•ν•œ λ‹΅λ³€**을 μ œκ³΅ν•˜λŠ” AI μ‹œμŠ€ν…œμ„ ꡬ좕할 수 μžˆμŠ΅λ‹ˆλ‹€.