File size: 9,381 Bytes
b6140da
 
 
 
 
 
 
 
 
 
 
01661a1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
---
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.
![Image](https://github.com/user-attachments/assets/5b100db1-97d7-443a-af00-3afe56729b7f)


### μ™œ 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>