Spaces:
Paused
Paused
A newer version of the Gradio SDK is available: 6.13.0
RAG ์์คํ ํ ์คํธ ๋ฐ ํ๋ ๊ฐ์ด๋
์ด ๋ฌธ์๋ ํ๊น ํ์ด์ค ์คํ์ด์ค์ฉ ์ธ๋ฌด ์ฑ๋ด RAG ์์คํ ์ ํ ์คํธ ๋ฐ ํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
๐ ๊ฐ์
RAG (Retrieval-Augmented Generation) ์์คํ ์ ์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ ์ํด ๋ค์ ๋๊ตฌ๋ค์ ์ ๊ณตํฉ๋๋ค:
test_rag.py: ๊ธฐ๋ณธ RAG ํ ์คํธ ๋ฐ ์ฑ๋ฅ ํ๊ฐtune_rag_config.py: ์๋ ์ค์ ํ๋run_rag_tests.py: ํตํฉ ํ ์คํธ ์คํ ์คํฌ๋ฆฝํธ
๐ ๋น ๋ฅธ ์์
1. ์ ์ฒด ํ ์คํธ ์คํ
python run_rag_tests.py
2. RAG ์์คํ ์ฌ๊ตฌ์ถ ํ ํ ์คํธ
python run_rag_tests.py --rebuild
3. ๋น ๋ฅธ ํ ์คํธ๋ง ์คํ
python run_rag_tests.py --quick
4. ์ค์ ํ๋๋ง ์คํ
python run_rag_tests.py --tune
5. ์ฑ๋ฅ ๋ฒค์น๋งํฌ๋ง ์คํ
python run_rag_tests.py --benchmark
๐ ํ์ผ ๊ตฌ์กฐ
clovax-tax-chatbot/
โโโ rag_system.py # RAG ์์คํ
๋ฉ์ธ ๋ชจ๋
โโโ config.py # ์ค์ ํ์ผ
โโโ law_fetcher.py # ๋ฒ๋ น ๋ฐ์ดํฐ ํ์ฒ
โโโ test_rag.py # RAG ํ
์คํธ ์คํฌ๋ฆฝํธ
โโโ tune_rag_config.py # ์ค์ ํ๋ ์คํฌ๋ฆฝํธ
โโโ run_rag_tests.py # ํตํฉ ์คํ ์คํฌ๋ฆฝํธ
โโโ RAG_TESTING.md # ์ด ๊ฐ์ด๋ ๋ฌธ์
โ
โโโ vector_db.faiss # ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค (์์ฑ๋จ)
โโโ documents.pkl # ๋ฌธ์ ๋ฐ์ดํฐ (์์ฑ๋จ)
โโโ metadata.json # ๋ฉํ๋ฐ์ดํฐ (์์ฑ๋จ)
โ
โโโ law_cache/ # ๋ฒ๋ น ๋ฐ์ดํฐ ์บ์ ๋๋ ํ ๋ฆฌ
โ โโโ cache_info.json
โ โโโ ์ง๋ฐฉ์ธ๋ฒ.json
โ โโโ ์ง๋ฐฉ์ธ๋ฒ์ํ๋ น.json
โ
โโโ test_results_*.json # ํ
์คํธ ๊ฒฐ๊ณผ ํ์ผ๋ค (์์ฑ๋จ)
๐ง ์์ธ ์ฌ์ฉ๋ฒ
test_rag.py - ๊ธฐ๋ณธ RAG ํ ์คํธ
๊ธฐ๋ฅ
- ๊ธฐ๋ณธ ์ง์์๋ต ํ ์คํธ (12๊ฐ ํ ์คํธ ์ฟผ๋ฆฌ)
- ๊ฒ์ ํ๋ผ๋ฏธํฐ ํ๋ ํ ์คํธ
- ํ์ด๋ธ๋ฆฌ๋ ๊ฐ์ค์น ํ๋ ํ ์คํธ
- ์ฑ๋ฅ ๋ฒค์น๋งํฌ
- ํ ์คํธ ๊ฒฐ๊ณผ ์ ์ฅ
์คํ ๋ฐฉ๋ฒ
# ๊ธฐ์กด ๋ฒกํฐ DB ์ฌ์ฉ
python test_rag.py
# RAG ์์คํ
์ฌ๊ตฌ์ถ ํ ํ
์คํธ
python test_rag.py --rebuild
ํ ์คํธ ์ฟผ๋ฆฌ ์์
- "์ทจ๋์ธ์จ์ด ์ผ๋ง์ธ๊ฐ์?"
- "์ฃผํ ์ทจ๋์ธ ๊ณ์ฐ ๋ฐฉ๋ฒ์ ์๋ ค์ฃผ์ธ์"
- "1์ธ๋ 1์ฃผํ์ ์ทจ๋์ธ ๊ฐ๋ฉด ํํ์?"
- "์ ํผ๋ถ๋ถ ์ทจ๋์ธ ๊ฐ๋ฉด ์กฐ๊ฑด์?"
- "๋์ง ์ทจ๋์ธ ๊ฐ๋ฉด ๊ท์ ์ ์๋ ค์ฃผ์ธ์"
tune_rag_config.py - ์๋ ์ค์ ํ๋
๊ธฐ๋ฅ
- ์๋ฒ ๋ฉ ๋ชจ๋ธ ์ต์ ํ
- ๊ฒ์ ํ๋ผ๋ฏธํฐ ์ต์ ํ (top_k, similarity_threshold)
- ํ์ด๋ธ๋ฆฌ๋ ๊ฐ์ค์น ์ต์ ํ (vector vs tfidf)
- ๋ฐฐ์น ํฌ๊ธฐ ์ต์ ํ
- ์ต์ ํ๋ ์ค์ ํ์ผ ์์ฑ
์คํ ๋ฐฉ๋ฒ
python tune_rag_config.py
ํ๊ฐ ๊ธฐ์ค
- ์๋ต ํ์ง (40์ ): ํค์๋ ๋งค์นญ๋ฅ
- ์์ค ๋ฌธ์ ์ (20์ ): ๊ด๋ จ ๋ฌธ์ ๊ฐ์
- ์๋ต ์๋ (20์ ): 3์ด ์ด๋ด ๋ง์
- ์์ค ๋ฌธ์ ํ์ง (20์ ): ๊ด๋ จ๋ ์ ์
run_rag_tests.py - ํตํฉ ์คํ ์คํฌ๋ฆฝํธ
์ฃผ์ ์ต์
python run_rag_tests.py [์ต์
]
์ต์
:
--rebuild RAG ์์คํ
์ฌ๊ตฌ์ถ ํ ํ
์คํธ
--tune ์ค์ ํ๋๋ง ์คํ
--benchmark ์ฑ๋ฅ ๋ฒค์น๋งํฌ๋ง ์คํ
--quick ๋น ๋ฅธ ํ
์คํธ (3๊ฐ ์ฟผ๋ฆฌ๋ง)
--info ์์คํ
์ ๋ณด๋ง ํ์
๐ ๊ฒฐ๊ณผ ํ์ผ
ํ
์คํธ ๊ฒฐ๊ณผ ํ์ผ (test_results_YYYYMMDD_HHMMSS.json)
{
"timestamp": "2024-01-01T12:00:00",
"config": { ... },
"test_results": [
{
"query": "์ทจ๋์ธ์จ์ด ์ผ๋ง์ธ๊ฐ์?",
"answer": "...",
"source_count": 3,
"response_time": 1.23,
"success": true
}
],
"summary": {
"total_tests": 12,
"successful_tests": 12
}
}
ํ๋ ๊ฒฐ๊ณผ ํ์ผ (rag_tuning_results_YYYYMMDD_HHMMSS.json)
{
"timestamp": "2024-01-01T12:00:00",
"baseline_config": { ... },
"best_config": { ... },
"best_score": 85.2,
"tuning_history": [ ... ]
}
์ต์ ํ๋ ์ค์ ํ์ผ (optimized_config.py)
# optimized_config.py - ํ๋๋ RAG ์ค์
OPTIMIZED_RAG_CONFIG = {
"embedding_models": ["jhgan/ko-sroberta-multitask"],
"batch_size": 32,
"top_k": 5,
"similarity_threshold": 0.2,
"hybrid_weights": {"vector": 0.7, "tfidf": 0.3}
}
โ๏ธ ์ค์ ํ๋ผ๋ฏธํฐ ์ค๋ช
config.py์ RAG_CONFIG
RAG_CONFIG = {
# ์๋ฒ ๋ฉ ๋ชจ๋ธ (์ฐ์ ์์๋๋ก ์๋)
'embedding_models': [
'jhgan/ko-sroberta-multitask', # ํ๊ตญ์ด ํนํ
'sentence-transformers/paraphrase-multilingual-mpnet-base-v2',
'paraphrase-multilingual-MiniLM-L12-v2'
],
# ๋ฐฐ์น ํฌ๊ธฐ (๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ vs ์๋)
'batch_size': 32,
# ๊ฒ์ ๊ฒฐ๊ณผ ๊ฐ์
'top_k': 5,
# ์ ์ฌ๋ ์๊ณ๊ฐ (๋ฎ์์๋ก ๋ ๋ง์ ๋ฌธ์ ํฌํจ)
'similarity_threshold': 0.2,
# ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์ ๊ฐ์ค์น
'hybrid_weights': {
'vector': 0.7, # ์๋ฏธ์ ์ ์ฌ๋
'tfidf': 0.3 # ํค์๋ ๋งค์นญ
}
}
๐ฏ ํ๋ ๊ฐ์ด๋๋ผ์ธ
1. ์ฑ๋ฅ ์ฐ์ (ํ๊น ํ์ด์ค ์คํ์ด์ค)
batch_size: 16-32 (๋ฉ๋ชจ๋ฆฌ ์ ํ)top_k: 3-5 (์๋ต ์๋)similarity_threshold: 0.15-0.25
2. ์ ํ๋ ์ฐ์ (๋ก์ปฌ ํ๊ฒฝ)
batch_size: 64-128top_k: 7-10similarity_threshold: 0.1-0.2
3. ํ์ด๋ธ๋ฆฌ๋ ๊ฐ์ค์น ์กฐ์
- ํค์๋ ๊ฒ์ ์ค์ฌ:
vector: 0.5, tfidf: 0.5 - ์๋ฏธ ๊ฒ์ ์ค์ฌ:
vector: 0.8, tfidf: 0.2 - ๊ท ํ:
vector: 0.7, tfidf: 0.3(๊ถ์ฅ)
๐ ๋ฌธ์ ํด๊ฒฐ
Q1: "๋ฒกํฐ DB ํ์ผ์ด ์์ต๋๋ค" ์ค๋ฅ
# ํด๊ฒฐ: RAG ์์คํ
์ฌ๊ตฌ์ถ
python run_rag_tests.py --rebuild
Q2: ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ์ค๋ฅ
# config.py์์ batch_size ์ค์ด๊ธฐ
'batch_size': 16 # 32 โ 16
Q3: ์๋ต ์๋๊ฐ ๋๋ฆผ
# config.py์์ top_k ์ค์ด๊ธฐ
'top_k': 3, # 5 โ 3
'similarity_threshold': 0.25 # ์๊ณ๊ฐ ๋์ด๊ธฐ
Q4: ๊ฒ์ ์ ํ๋๊ฐ ๋ฎ์
# config.py์์ ๋ ํฌ๊ด์ ์ผ๋ก ์ค์
'top_k': 7, # ๋ ๋ง์ ๋ฌธ์ ๊ฒ์
'similarity_threshold': 0.15, # ์๊ณ๊ฐ ๋ฎ์ถ๊ธฐ
'hybrid_weights': {'vector': 0.6, 'tfidf': 0.4} # TF-IDF ๊ฐ์ค์น ์ฆ๊ฐ
๐ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง
์ฃผ์ ์งํ
- ์๋ต ์๊ฐ: < 3์ด (๋ชฉํ)
- ๊ฒ์ ์ ํ๋: ํค์๋ ๋งค์นญ๋ฅ > 80%
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋: < 2GB (ํ๊น ํ์ด์ค ์ ํ)
- ์์ค ๋ฌธ์ ๊ด๋ จ๋: > 0.3 (hybrid_score)
๋ชจ๋ํฐ๋ง ๋ช ๋ น์ด
# ์์คํ
์ ๋ณด ํ์ธ
python run_rag_tests.py --info
# ๋น ๋ฅธ ์ฑ๋ฅ ์ฒดํฌ
python run_rag_tests.py --quick
# ์์ธ ๋ฒค์น๋งํฌ
python run_rag_tests.py --benchmark
๐ ํ๊น ํ์ด์ค ์คํ์ด์ค ์ต์ ํ
1. ๋ฉ๋ชจ๋ฆฌ ์ต์ ํ
- ๋ฒกํฐ DB๋ฅผ ๋ฏธ๋ฆฌ ๊ตฌ์ถํ์ฌ ์ ๋ก๋
- ์บ์๋ ๋ฒ๋ น ๋ฐ์ดํฐ ํ์ฉ
- ์์ ๋ฐฐ์น ํฌ๊ธฐ ์ฌ์ฉ (16-32)
2. ์๋ต ์๋ ์ต์ ํ
- ์ฑ๊ธํค ํจํด์ผ๋ก RAG ์ธ์คํด์ค ์ฌ์ฌ์ฉ
- ์ ์ ํ top_k ์ค์ (3-5)
- ์๊ณ๊ฐ ์กฐ์ (0.2-0.3)
3. ๋ชจ๋ธ ์ต์ ํ
- ํ๊ตญ์ด ํนํ ๋ชจ๋ธ ์ฐ์ ์ฌ์ฉ
- ๊ฒฝ๋ํ๋ ์๋ฒ ๋ฉ ๋ชจ๋ธ ์ ํ
- GPU ์ฌ์ฉ ๊ฐ๋ฅ์ ์๋ ๊ฐ์ง
๐ ์ถ๊ฐ ์ง์
๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ์ถ๊ฐ ๊ธฐ๋ฅ์ด ํ์ํ ๊ฒฝ์ฐ:
- ํ
์คํธ ๊ฒฐ๊ณผ ํ์ผ ํ์ธ (
test_results_*.json) - ํ๋ ํ์คํ ๋ฆฌ ๋ถ์ (
rag_tuning_results_*.json) - ์์คํ
์ ๋ณด ํ์ธ (
python run_rag_tests.py --info)
์ ๋ฐ์ดํธ: 2024๋ 8์ ํ๊น ํ์ด์ค ์คํ์ด์ค ์ต์ ํ ๋ฒ์