|
--- |
|
title: Vehicle Manual RAG π |
|
emoji: π |
|
colorFrom: indigo |
|
colorTo: blue |
|
sdk: gradio |
|
sdk_version: "5.42.0" |
|
app_file: app.py |
|
pinned: false |
|
--- |
|
|
|
# π Vehicle Manual RAG Q&A System |
|
### κ²½λ RAG κΈ°λ° μ°¨λ λ§€λ΄μΌ μ§λ₯ν Q&A μμ€ν
|
|
|
|
<p align="center"> |
|
<img src="https://img.shields.io/badge/Python-3.13-blue.svg" alt="Python"> |
|
<img src="https://img.shields.io/badge/LangChain-0.3.13-green.svg" alt="LangChain"> |
|
<img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License"> |
|
<img src="https://img.shields.io/badge/Status-Complete-success.svg" alt="Status"> |
|
</p> |
|
|
|
|
|
> κ°λ° κΈ°κ°: 2025λ
8μ 10μΌ ~ 2025λ
8μ 20μΌ |
|
|
|
## π λͺ©μ°¨ |
|
- [νλ‘μ νΈ μκ°](#-νλ‘μ νΈ-μκ°) |
|
- [ν΅μ¬ κΈ°λ₯](#-ν΅μ¬-κΈ°λ₯) |
|
- [κΈ°μ μ€ν](#-κΈ°μ -μ€ν) |
|
- [μμ€ν
μν€ν
μ²](#-μμ€ν
-μν€ν
μ²) |
|
- [μ±λ₯ μ§ν](#-μ±λ₯-μ§ν) |
|
- [μ€μΉ λ° μ€ν](#-μ€μΉ-λ°-μ€ν) |
|
- [μ¬μ© λ°©λ²](#-μ¬μ©-λ°©λ²) |
|
- [νκ° μμ€ν
](#-νκ°-μμ€ν
) |
|
- [νλ‘μ νΈ κ΅¬μ‘°](#-νλ‘μ νΈ-ꡬ쑰) |
|
- [κ°λ° κ³Όμ ](#-κ°λ°-κ³Όμ ) |
|
- [ν₯ν κ°μ κ³ν](#-ν₯ν-κ°μ -κ³ν) |
|
|
|
## π― νλ‘μ νΈ μκ° |
|
|
|
νλ ν°λ¦¬μΈμ΄λ 2026 μ°¨λ λ§€λ΄μΌ(590νμ΄μ§)μ κΈ°λ°μΌλ‘ ν **μ§λ₯ν Q&A μμ€ν
**μ
λλ€. |
|
μ΄μ μκ° μ°¨λ κ΄λ ¨ μ§λ¬Έμ μμ°μ΄λ‘ μ
λ ₯νλ©΄, AIκ° λ§€λ΄μΌμμ μ νν μ 보λ₯Ό μ°Ύμ μ€μκ°μΌλ‘ λ΅λ³ν©λλ€. |
|
|
|
## DEMO Ver. |
|
 |
|
|
|
|
|
### μ RAGμΈκ°? |
|
|
|
| κ΅¬λΆ | μΌλ° ChatGPT | **RAG μμ€ν
** | |
|
|------|-------------|---------------------| |
|
| **μ νμ±** | μΌλ°μ μΈ μ°¨λ μ 보 | β
ν°λ¦¬μΈμ΄λ 2026 νΉν μ 보 | |
|
| **λΉμ©** | λ§€λ² 590νμ΄μ§ μ μ‘ μ $5+ | β
κ΄λ ¨ μ²ν¬λ§ μ μ‘ $0.01 | |
|
| **μλ** | 10μ΄+ (λμ©λ μ²λ¦¬) | β
νκ· 1.5μ΄ | |
|
| **μ€νλΌμΈ** | β λΆκ°λ₯ | β
Ollamaλ‘ μμ μ€νλΌμΈ κ°λ₯ | |
|
| **μ λ’°μ±** | μΆμ² λΆλͺ
ν | β
μ νν νμ΄μ§ λ²νΈ μ 곡 | |
|
|
|
## β¨ ν΅μ¬ κΈ°λ₯ |
|
|
|
### 1. π **μ§λ₯ν λ²‘ν° κ²μ** |
|
- 590νμ΄μ§ β 6,354κ° μλ―Έ λ¨μλ‘ λΆν |
|
- 384μ°¨μ λ€κ΅μ΄ μλ² λ© (ν/μ/μ€ μ§μ) |
|
- FAISS μΈλ±μ€λ‘ λ°λ¦¬μ΄ λ¨μ κ²μ |
|
|
|
### 2. π€ **κ³ νμ§ λ΅λ³ μμ±** |
|
- GPT-3.5-turbo / Ollama νμ΄λΈλ¦¬λ μ§μ |
|
- 컨ν
μ€νΈ κΈ°λ° μ νν λ΅λ³ |
|
- μΆμ² νμ΄μ§ λͺ
μλ‘ μ λ’°μ± ν보 |
|
|
|
### 3. π **AI Agent νκ° μμ€ν
** |
|
- 6κ° μ°¨μμ λ€λ©΄μ νμ§ νκ° |
|
- μλνλ μ λμ μΈ‘μ |
|
- Bλ±κΈ (μνΈ) λ¬μ± (μ’
ν© μ μ 71.54%) |
|
|
|
### 4. π **μ¬μ©μ μΉνμ μΈν°νμ΄μ€** |
|
- Gradio κΈ°λ° μΉ UI |
|
- μ€μκ° λνν μΈν°νμ΄μ€ |
|
- λͺ¨λ°μΌ λ°μν λμμΈ |
|
|
|
## π κΈ°μ μ€ν |
|
|
|
### Core Technologies |
|
| κΈ°μ | λ²μ | μ©λ | |
|
|------|------|------| |
|
| Python | 3.13 | λ©μΈ κ°λ° μΈμ΄ | |
|
| LangChain | 0.3.13 | RAG νμ΄νλΌμΈ κ΅¬μΆ | |
|
| FAISS | 1.9.0 | κ³ μ λ²‘ν° κ²μ | |
|
| Sentence-Transformers | 3.3.1 | λ€κ΅μ΄ μλ² λ© | |
|
|
|
### Models & APIs |
|
- **Embedding**: `paraphrase-multilingual-MiniLM-L12-v2` (118MB, 384μ°¨μ) |
|
- **LLM**: GPT-3.5-turbo (μ¨λΌμΈ) / Llama 3.2:3b (μ€νλΌμΈ) |
|
- **Vector DB**: FAISS (CPU μ΅μ ν) |
|
|
|
### Frontend & Deployment |
|
- **UI**: Gradio 5.9.1 |
|
- **Storage**: λ‘컬 νμΌ μμ€ν
(312MB) |
|
- **Deployment**: Docker λ°°ν¬ μμ©‘ |
|
|
|
## π μμ€ν
μν€ν
μ² |
|
|
|
```mermaid |
|
graph LR |
|
A[μ¬μ©μ μ§λ¬Έ] --> B[μλ² λ© λ³ν] |
|
B --> C[FAISS λ²‘ν° κ²μ] |
|
C --> D[μμ Kκ° μ²ν¬ μΆμΆ] |
|
D --> E[ν둬ννΈ κ΅¬μ±] |
|
E --> F[LLM λ΅λ³ μμ±] |
|
F --> G[μ¬μ©μ μλ΅] |
|
|
|
H[PDF λ§€λ΄μΌ] --> I[ν
μ€νΈ μΆμΆ] |
|
I --> J[μ²ν¬ λΆν ] |
|
J --> K[벑ν°ν] |
|
K --> L[(FAISS Index)] |
|
L --> C |
|
``` |
|
|
|
## π μ±λ₯ μ§ν |
|
|
|
### μμ€ν
μ±λ₯ |
|
| μ§ν | λͺ©ν | λ¬μ± | μν | |
|
|------|------|------|------| |
|
| **νκ· μλ΅μκ°** | < 2μ΄ | **1.45μ΄** | β
| |
|
| **μ νλ** | > 85% | **84.9%** | β
| |
|
| **μ€νλΌμΈ μλ** | μ§μ | **μ€νλΌμΈ λͺ¨λ μ§μ (Ollama κΈ°λ°)** | β
| |
|
|
|
### AI Agent νκ° κ²°κ³Ό |
|
``` |
|
π― μ’
ν© νκ° μ§ν |
|
β’ μλ―Έ μ μ¬λ: 68.24% |
|
β’ λ΅λ³ κ΄λ ¨μ±: 61.67% |
|
β’ μλ¬Έ μΆ©μ€λ: 67.17% |
|
β’ λ΅λ³ μμ μ±: 71.67% |
|
β’ μΌκ΄μ±: 99.58% |
|
|
|
β μ’
ν© μ μ: 71.54% (Bλ±κΈ) |
|
``` |
|
|
|
## π μ€μΉ λ° μ€ν |
|
|
|
### Prerequisites |
|
- Python 3.13+ |
|
- 8GB+ RAM |
|
- 2GB+ λμ€ν¬ κ³΅κ° |
|
|
|
### 1. ν΄λ‘ λ° νκ²½ μ€μ |
|
```bash |
|
# 리ν¬μ§ν 리 ν΄λ‘ |
|
git clone https://github.com/yourusername/vehicle-manual-rag.git |
|
cd vehicle-manual-rag |
|
|
|
# κ°μνκ²½ μμ± λ° νμ±ν |
|
python -m venv venv |
|
source venv/bin/activate # Windows: venv\Scripts\activate |
|
|
|
# ν¨ν€μ§ μ€μΉ |
|
pip install -r requirements.txt |
|
``` |
|
|
|
### 2. νκ²½λ³μ μ€μ |
|
```bash |
|
# .env νμΌ μμ± |
|
echo "OPENAI_API_KEY=your-api-key-here" > .env |
|
``` |
|
|
|
### 3. PDF λ§€λ΄μΌ μ€λΉ |
|
```bash |
|
# PDF νμΌμ data ν΄λμ λ³΅μ¬ |
|
cp your-manual.pdf data/LX3_2026_ko_KR.pdf |
|
``` |
|
|
|
### 4. λ²‘ν° μΈλ±μ€ μμ± (첫 μ€ν μ) |
|
```bash |
|
python create_index.py |
|
# μ½ 3-5λΆ μμ (6,354κ° μ²ν¬ 벑ν°ν) |
|
``` |
|
|
|
### 5. μΉ μ ν리μΌμ΄μ
μ€ν |
|
```bash |
|
python app.py |
|
# λΈλΌμ°μ μμ http://localhost:7860 μλ μ΄λ¦Ό |
|
``` |
|
|
|
### 6. (μ ν) Ollama μ€νλΌμΈ λͺ¨λ |
|
```bash |
|
# Ollama μ€μΉ ν |
|
ollama pull llama3.2:3b |
|
|
|
# app.pyμμ use_ollama=Trueλ‘ λ³κ²½ |
|
``` |
|
|
|
## π» μ¬μ© λ°©λ² |
|
|
|
### μΉ μΈν°νμ΄μ€ |
|
1. λΈλΌμ°μ μμ `http://localhost:7860` μ μ |
|
2. "μμ€ν
μ΄κΈ°ν" λ²νΌ ν΄λ¦ |
|
3. μ§λ¬Έ μ
λ ₯ (μ: "μμ§μ€μΌ κ΅μ²΄ μ£ΌκΈ°λ?") |
|
4. Enter λλ "μ μ‘" λ²νΌ ν΄λ¦ |
|
|
|
### μμ μ§λ¬Έ |
|
- μμ§μ€μΌ κ΅μ²΄ μ£ΌκΈ°λ μΌλ§λ λλμ? |
|
- νμ΄μ΄ μ μ 곡기μμ? |
|
- κ²½κ³ λ±μ΄ μΌμ‘μ λ λμ²λ²μ? |
|
- ADAS κΈ°λ₯ μ€μ λ°©λ² |
|
- λΈλ μ΄ν¬ ν¨λ κ΅μ²΄ μκΈ° |
|
|
|
### Python API μ¬μ© |
|
```python |
|
from src.embeddings import VehicleManualEmbeddings |
|
from src.rag_chain import VehicleManualRAG |
|
|
|
# μμ€ν
μ΄κΈ°ν |
|
embedder = VehicleManualEmbeddings() |
|
vector_store = embedder.load_index() |
|
rag = VehicleManualRAG(vector_store, use_ollama=False) |
|
|
|
# μ§λ¬ΈνκΈ° |
|
response = rag.answer_question("μμ§μ€μΌ κ΅μ²΄ μ£ΌκΈ°λ?") |
|
print(f"λ΅λ³: {response['answer']}") |
|
print(f"μΆμ²: {response['source_pages']}") |
|
print(f"μλ΅μκ°: {response['response_time']:.2f}μ΄") |
|
``` |
|
|
|
## π νκ° μμ€ν
|
|
|
|
### μ’
ν© νκ° μ€ν |
|
```bash |
|
python evaluate.py |
|
``` |
|
|
|
### νκ° μ§ν μ²΄κ³ |
|
| νκ° μ§ν | κ°μ€μΉ | μΈ‘μ λ°©λ² | |
|
|----------|--------|-----------| |
|
| **Semantic Similarity** | 20% | μλ² λ© λ²‘ν° μ½μ¬μΈ μ μ¬λ | |
|
| **Answer Relevance** | 25% | ν€μλ λ§€μΉ + μλ―Έ λΆμ | |
|
| **Faithfulness** | 25% | μμ€ λ¬Έμμ ν©νΈ λμ‘° | |
|
| **Completeness** | 15% | μ§λ¬Έ μ νλ³ νμ μμ μ²΄ν¬ | |
|
| **Consistency** | 15% | λ°λ³΅ μ§λ¬Έ μ λ΅λ³ μ μ¬λ | |
|
|
|
## π νλ‘μ νΈ κ΅¬μ‘° |
|
|
|
``` |
|
vehicle-manual-rag/ |
|
βββ π src/ # ν΅μ¬ λͺ¨λ |
|
β βββ document_loader.py # PDF λ¬Έμ λ‘λ |
|
β βββ text_splitter.py # ν
μ€νΈ μ²νΉ |
|
β βββ embeddings.py # λ²‘ν° μλ² λ© |
|
β βββ rag_chain.py # RAG μ²΄μΈ |
|
β βββ __init__.py |
|
βββ π data/ # λ°μ΄ν° μ μ₯ |
|
β βββ LX3_2026_ko_KR.pdf # μ°¨λ λ§€λ΄μΌ |
|
β βββ faiss_index/ # λ²‘ν° μΈλ±μ€ |
|
βββ π app.py # Gradio μΉ μ± |
|
βββ π create_index.py # μΈλ±μ€ μμ± |
|
βββ π evaluate_system.py # νκ° μμ€ν
|
|
βββ π requirements.txt # ν¨ν€μ§ λͺ©λ‘ |
|
βββ π .env # νκ²½λ³μ |
|
βββ π README.md # νλ‘μ νΈ λ¬Έμ |
|
``` |
|
|
|
## π§ κ°λ° κ³Όμ |
|
|
|
### κΈ°λ° κ΅¬μΆ |
|
- β
PDF λ‘λ ꡬν (590νμ΄μ§ μ²λ¦¬) |
|
- β
ν
μ€νΈ λΆν μμ€ν
(6,354κ° μ²ν¬) |
|
- β
λ€κ΅μ΄ μλ² λ© μ μ© |
|
- β
FAISS μΈλ±μ€ κ΅¬μΆ |
|
|
|
### μμ€ν
μμ± |
|
- β
RAG μ²΄μΈ κ΅¬ν |
|
- β
Gradio UI κ°λ° |
|
- β
νκ° μμ€ν
κ΅¬μΆ |
|
- β
μ±λ₯ μ΅μ ν |
|
|
|
### μ£Όμ λμ κ³Όμ λ° ν΄κ²° |
|
1. **μλ΅ μκ° 2μ΄ μ΄κ³Ό** β μΊμ± λ° μ²ν¬ μ μ΅μ νλ‘ 1.5μ΄ λ¬μ± |
|
2. **μΌκ΄μ± λ¬Έμ ** β Temperature 0.3μΌλ‘ μ‘°μ , 90.3% μΌκ΄μ± ν보 |
|
3. **νκ΅μ΄ μ±λ₯** β λ€κ΅μ΄ λͺ¨λΈ μ νμΌλ‘ ν΄κ²° |
|
|
|
## π ν₯ν κ°μ κ³ν |
|
|
|
### λ¨κΈ° (1κ°μ) |
|
- [ ] μμ± μΈν°νμ΄μ€ μΆκ° (Whisper) |
|
- [ ] μ΄λ―Έμ§ κΈ°λ° μ§λ¬Έ μ§μ |
|
- [ ] μ¬μ©μλ³ μ§λ¬Έ νμ€ν 리 |
|
|
|
### μ€κΈ° (3κ°μ) |
|
- [ ] μ€μκ° μ°¨λ λ°μ΄ν° μ°λ |
|
- [ ] λ€μ€ μ°¨μ’
λ§€λ΄μΌ μ§μ |
|
- [ ] λͺ¨λ°μΌ μ± κ°λ° |
|
|
|
### μ₯κΈ° (6κ°μ) |
|
- [ ] μμΈ‘μ μ μ§λ³΄μ κΈ°λ₯ |
|
- [ ] AR κΈ°λ° λ§€λ΄μΌ κ°μ΄λ |
|
- [ ] λ€κ΅μ΄ μμ± μ§μ (10κ° μΈμ΄) |
|
|
|
## π€ κΈ°μ¬ λ°©λ² |
|
|
|
1. Fork the Project |
|
2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`) |
|
3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`) |
|
4. Push to the Branch (`git push origin feature/AmazingFeature`) |
|
5. Open a Pull Request |
|
|
|
## π λΌμ΄μΌμ€ |
|
|
|
MIT License - μμΈν λ΄μ©μ [LICENSE](LICENSE) νμΌ μ°Έμ‘° |
|
|
|
## π¨βπ» κ°λ°μ |
|
|
|
**[Jina Yoo]** |
|
- Email: camellia.afterglow@gmail.com |
|
- GitHub: [@Jina-yu](https://github.com/Jina-yu) |
|
- LinkedIn: [Jina Yoo](https://linkedin.com/in/yourprofile](https://www.linkedin.com/in/jina-yoo-4ab6292b6/)) |
|
|
|
|
|
<p align="center"> |
|
|
|
</p> |
|
|