Spaces:
Runtime error
Runtime error
title: open-webui-rag-system | |
sdk: docker | |
# Open WebUI RAG System | |
Open WebUI์ ์ฐ๋ ๊ฐ๋ฅํ ํ๊ตญ์ด ๋ฌธ์ ๊ธฐ๋ฐ RAG(Retrieval-Augmented Generation) ์์คํ ์ ๋๋ค. PDF์ HWPX ํ์ผ์ ์ง์ํ๋ฉฐ, ํ์ด์ง๋ณ ์ ํํ ์ ๋ณด ์ถ์ถ๊ณผ ์ถ์ฒ ์ถ์ ์ด ๊ฐ๋ฅํฉ๋๋ค. | |
## ์ฃผ์ ๊ธฐ๋ฅ | |
### 1. ๋ฌธ์ ์ฒ๋ฆฌ | |
- **PDF ๋ฌธ์**: PyMuPDF ๊ธฐ๋ฐ ํ ์คํธ, ํ, ์ด๋ฏธ์ง OCR ์ถ์ถ | |
- **HWPX ๋ฌธ์**: XML ํ์ฑ์ ํตํ ์น์ ๋ณ ํ ์คํธ, ํ, ์ด๋ฏธ์ง ์ถ์ถ | |
- **ํ์ด์ง๋ณ ์ฒ๋ฆฌ**: ๊ฐ ๋ฌธ์๋ฅผ ํ์ด์ง/์น์ ๋จ์๋ก ์ ํํ๊ฒ ๋ถ๋ฆฌ | |
- **๋ค์ค ์ฝํ ์ธ ํ์ **: ๋ณธ๋ฌธ, ํ, OCR ํ ์คํธ๋ฅผ ๊ฐ๊ฐ ์๋ณํ์ฌ ์ฒ๋ฆฌ | |
### 2. ๋ฒกํฐ ๊ฒ์ | |
- **E5-Large ์๋ฒ ๋ฉ**: ๋ค๊ตญ์ด ์ง์ ๊ณ ์ฑ๋ฅ ์๋ฒ ๋ฉ ๋ชจ๋ธ | |
- **FAISS ๋ฒกํฐ์คํ ์ด**: ๋น ๋ฅธ ์ ์ฌ๋ ๊ฒ์ | |
- **๋ฐฐ์น ์ฒ๋ฆฌ**: ๋์ฉ๋ ๋ฌธ์ ์ฒ๋ฆฌ ์ต์ ํ | |
- **์ฒญํฌ ๋ถํ **: ๋ฌธ๋งฅ ์ ์ง๋ฅผ ์ํ ๊ฒน์นจ ์ฒ๋ฆฌ | |
### 3. RAG ์์คํ | |
- **Refine ์ฒด์ธ**: ๋ค์ค ๋ฌธ์ ์ฐธ์กฐ๋ฅผ ํตํ ์ ํํ ๋ต๋ณ ์์ฑ | |
- **์ถ์ฒ ์ถ์ **: ํ์ด์ง ๋ฒํธ์ ๋ฌธ์๋ช ์ ํฌํจํ ์ ํํ ์ธ์ฉ | |
- **Hallucination ๋ฐฉ์ง**: ๋ฌธ์์ ๋ช ์๋ ์ ๋ณด๋ง ์ฌ์ฉํ๋ ์๊ฒฉํ ํ๋กฌํํธ | |
### 4. API ์๋ฒ | |
- **FastAPI ๊ธฐ๋ฐ**: ๋น๋๊ธฐ ์ฒ๋ฆฌ ์ง์ | |
- **OpenAI ํธํ**: `/v1/chat/completions` ์๋ํฌ์ธํธ ์ ๊ณต | |
- **์คํธ๋ฆฌ๋ฐ ์ง์**: ์ค์๊ฐ ๋ต๋ณ ์์ฑ | |
- **Open WebUI ์ฐ๋**: ํ๋ฌ๊ทธ์ธ ์์ด ๋ฐ๋ก ์ฐ๊ฒฐ ๊ฐ๋ฅ | |
## ์์คํ ์๊ตฌ์ฌํญ | |
### ํ๋์จ์ด | |
- **GPU**: CUDA ์ง์ (์๋ฒ ๋ฉ ๋ฐ LLM ์ถ๋ก ์ฉ) | |
- **RAM**: ์ต์ 16GB (๋์ฉ๋ ๋ฌธ์ ์ฒ๋ฆฌ ์ ๋ ํ์) | |
- **์ ์ฅ๊ณต๊ฐ**: ๋ชจ๋ธ ๋ฐ ๋ฒกํฐ์คํ ์ด์ฉ 10GB+ | |
### ์ํํธ์จ์ด | |
- Python 3.8+ | |
- CUDA 11.7+ (GPU ์ฌ์ฉ ์) | |
- Tesseract OCR | |
## ์ค์น ๋ฐฉ๋ฒ | |
### 1. ์ ์ฅ์ ํด๋ก | |
```bash | |
git clone <repository-url> | |
cd open-webui-rag-system | |
``` | |
### 2. ์์กด์ฑ ์ค์น | |
```bash | |
pip install -r requirements.txt | |
``` | |
### 3. Tesseract OCR ์ค์น | |
**Ubuntu/Debian:** | |
```bash | |
sudo apt-get install tesseract-ocr tesseract-ocr-kor | |
``` | |
**Windows:** | |
- [Tesseract ๊ณต์ ํ์ด์ง](https://github.com/UB-Mannheim/tesseract/wiki)์์ ์ค์น | |
### 4. LLM ์๋ฒ ์ค์ | |
`llm_loader.py`์์ ์ฌ์ฉํ LLM ์๋ฒ ์ค์ : | |
```python | |
# EXAONE ๋ชจ๋ธ ์ฌ์ฉ ์์ | |
base_url="http://vllm:8000/v1" | |
model="LGAI-EXAONE/EXAONE-3.5-7.8B-Instruct" | |
openai_api_key="token-abc123" | |
``` | |
## ์คํ ๋ฐฉ๋ฒ | |
### 1. ๋ฌธ์ ์ค๋น | |
์ฒ๋ฆฌํ ๋ฌธ์๋ค์ `dataset_test` ํด๋์ ์ ์ฅ: | |
``` | |
dataset_test/ | |
โโโ document1.pdf | |
โโโ document2.hwpx | |
โโโ document3.pdf | |
``` | |
### 2. ๋ฌธ์ ์ฒ๋ฆฌ ๋ฐ ๋ฒกํฐ์คํ ์ด ์์ฑ | |
```bash | |
python document_processor_image_test.py | |
``` | |
๋๋ ๋ฒกํฐ์คํ ์ด ๋น๋ ์คํฌ๋ฆฝํธ ์ฌ์ฉ: | |
```bash | |
python vector_store_test.py --folder dataset_test --save_path faiss_index_pymupdf | |
``` | |
### 3. RAG ์๋ฒ ์คํ | |
```bash | |
python rag_server.py | |
``` | |
์๋ฒ๋ ๊ธฐ๋ณธ์ ์ผ๋ก 8000๋ฒ ํฌํธ์์ ์คํ๋ฉ๋๋ค. | |
### 4. Open WebUI ์ฐ๋ | |
Open WebUI์ ๋ชจ๋ธ ์ค์ ์์ ๋ค์๊ณผ ๊ฐ์ด ์ค์ : | |
- **API Base URL**: `http://localhost:8000/v1` | |
- **API Key**: `token-abc123` | |
- **Model Name**: `rag` | |
### 5. ๊ฐ๋ณ ํ ์คํธ | |
๋ช ๋ น์ค์์ ์ง์ ์ง๋ฌธ: | |
```bash | |
python rag_system.py --query "๋ฌธ์์์ ์ฐพ๊ณ ์ถ์ ๋ด์ฉ" | |
``` | |
๋ํํ ๋ชจ๋: | |
```bash | |
python rag_system.py | |
``` | |
## ํ๋ก์ ํธ ๊ตฌ์กฐ | |
``` | |
open-webui-rag-system/ | |
โโโ document_processor_image_test.py # ๋ฌธ์ ์ฒ๋ฆฌ ๋ฉ์ธ ๋ชจ๋ | |
โโโ vector_store_test.py # ๋ฒกํฐ์คํ ์ด ์์ฑ ๋ชจ๋ | |
โโโ rag_system.py # RAG ์ฒด์ธ ๊ตฌ์ฑ ๋ฐ ์ง์์๋ต | |
โโโ rag_server.py # FastAPI ์๋ฒ | |
โโโ llm_loader.py # LLM ๋ชจ๋ธ ๋ก๋ | |
โโโ e5_embeddings.py # E5 ์๋ฒ ๋ฉ ๋ชจ๋ | |
โโโ requirements.txt # ์์กด์ฑ ๋ชฉ๋ก | |
โโโ dataset_test/ # ๋ฌธ์ ์ ์ฅ ํด๋ | |
โโโ faiss_index_pymupdf/ # ์์ฑ๋ ๋ฒกํฐ์คํ ์ด | |
``` | |
## ํต์ฌ ๋ชจ๋ ์ค๋ช | |
### document_processor_image_test.py | |
- PDF์ HWPX ํ์ผ์ ํ ์คํธ, ํ, ์ด๋ฏธ์ง๋ฅผ ํ์ด์ง๋ณ๋ก ์ถ์ถ | |
- PyMuPDF, pdfplumber, pytesseract๋ฅผ ํ์ฉํ ๋ค์ธต ์ฒ๋ฆฌ | |
- ์น์ ๋ณ ๋ฉํ๋ฐ์ดํฐ์ ํ์ด์ง ์ ๋ณด ์ ์ง | |
### vector_store_test.py | |
- E5-Large ์๋ฒ ๋ฉ ๋ชจ๋ธ์ ์ฌ์ฉํ ๋ฒกํฐํ | |
- FAISS๋ฅผ ์ด์ฉํ ํจ์จ์ ์ธ ๋ฒกํฐ์คํ ์ด ๊ตฌ์ถ | |
- ๋ฐฐ์น ์ฒ๋ฆฌ๋ฅผ ํตํ ๋ฉ๋ชจ๋ฆฌ ์ต์ ํ | |
### rag_system.py | |
- Refine ์ฒด์ธ์ ํ์ฉํ ๋ค๋จ๊ณ ๋ต๋ณ ์์ฑ | |
- ํ์ด์ง ๋ฒํธ hallucination ๋ฐฉ์ง ํ๋กฌํํธ | |
- ์ถ์ฒ ์ถ์ ๊ณผ ๋ฉํ๋ฐ์ดํฐ ๊ด๋ฆฌ | |
### rag_server.py | |
- OpenAI ํธํ API ์๋ํฌ์ธํธ ์ ๊ณต | |
- ์คํธ๋ฆฌ๋ฐ ์๋ต ์ง์ | |
- Open WebUI์์ ์ํํ ์ฐ๋ | |
## ์ค์ ์ต์ | |
### ๋ฌธ์ ์ฒ๋ฆฌ ์ต์ | |
- **์ฒญํฌ ํฌ๊ธฐ**: `chunk_size=500` (๊ธฐ๋ณธ๊ฐ) | |
- **์ฒญํฌ ๊ฒน์นจ**: `chunk_overlap=100` (๊ธฐ๋ณธ๊ฐ) | |
- **OCR ์ธ์ด**: `lang='kor+eng'` (ํ๊ตญ์ด+์์ด) | |
### ๊ฒ์ ์ต์ | |
- **๊ฒ์ ๋ฌธ์ ์**: `k=7` (๊ธฐ๋ณธ๊ฐ) | |
- **์๋ฒ ๋ฉ ๋ชจ๋ธ**: `intfloat/multilingual-e5-large-instruct` | |
- **๋๋ฐ์ด์ค**: `cuda` ๋๋ `cpu` | |
### LLM ์ค์ | |
์ง์ํ๋ ๋ชจ๋ธ๋ค: | |
- LGAI-EXAONE/EXAONE-3.5-7.8B-Instruct | |
- meta-llama/Meta-Llama-3-8B-Instruct | |
- ๊ธฐํ OpenAI ํธํ ๋ชจ๋ธ | |
## ํธ๋ฌ๋ธ์ํ | |
### 1. CUDA ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ | |
```bash | |
# CPU ๋ชจ๋๋ก ์คํ | |
python vector_store_test.py --device cpu | |
``` | |
### 2. ํ๊ธ ํฐํธ ๋ฌธ์ | |
```bash | |
# ํ๊ธ ํฐํธ ์ค์น (Ubuntu) | |
sudo apt-get install fonts-nanum | |
``` | |
### 3. Tesseract ๊ฒฝ๋ก ๋ฌธ์ | |
```python | |
# pytesseract ๊ฒฝ๋ก ์๋ ์ค์ | |
pytesseract.pytesseract.tesseract_cmd = '/usr/bin/tesseract' | |
``` | |
### 4. ๋ชจ๋ธ ๋ค์ด๋ก๋ ์คํจ | |
```bash | |
# Hugging Face ์บ์ ๊ฒฝ๋ก ํ์ธ | |
export HF_HOME=/path/to/huggingface/cache | |
``` | |
## API ์ฌ์ฉ ์์ | |
### ์ง์ ์ง์ | |
```bash | |
curl -X POST "http://localhost:8000/ask" \ | |
-H "Content-Type: application/json" \ | |
-d '{"question": "๋ฌธ์์์ ์์ฐ ๊ด๋ จ ๋ด์ฉ์ ์ฐพ์์ฃผ์ธ์"}' | |
``` | |
### OpenAI ํธํ API | |
```bash | |
curl -X POST "http://localhost:8000/v1/chat/completions" \ | |
-H "Content-Type: application/json" \ | |
-d '{ | |
"model": "rag", | |
"messages": [{"role": "user", "content": "์์ฐ ํํฉ์ด ์ด๋ป๊ฒ ๋๋์?"}], | |
"stream": false | |
}' | |
``` | |
## ์ฑ๋ฅ ์ต์ ํ | |
### 1. ๋ฐฐ์น ํฌ๊ธฐ ์กฐ์ | |
```bash | |
python vector_store_test.py --batch_size 32 # GPU ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ๋ผ ์กฐ์ | |
``` | |
### 2. ์ฒญํฌ ํฌ๊ธฐ ์ต์ ํ | |
```python | |
# ๊ธด ๋ฌธ์์ ๊ฒฝ์ฐ ์ฒญํฌ ํฌ๊ธฐ ์ฆ๊ฐ | |
chunks = split_documents(docs, chunk_size=800, chunk_overlap=150) | |
``` | |
### 3. ๊ฒ์ ๊ฒฐ๊ณผ ์ ์กฐ์ | |
```bash | |
python rag_system.py --k 10 # ๋ ๋ง์ ๋ฌธ์ ์ฐธ์กฐ | |
``` | |
## ๋ผ์ด์ ์ค | |
MIT License | |
## ๊ธฐ์ฌ ๋ฐฉ๋ฒ | |
1. Fork the repository | |
2. Create your feature branch | |
3. Commit your changes | |
4. Push to the branch | |
5. Create a Pull Request |