palisade / README.md
camelfilm's picture
Update README.md
b6140da verified
---
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>