9.1 KiB
9.1 KiB
Hướng Dẫn Sử Dụng — Blog RAG
Mục lục
- Yêu cầu hệ thống
- Cài đặt
- Cấu hình API
- Sử dụng dữ liệu có sẵn
- Crawl dữ liệu mới
- Build index
- Chạy giao diện web
- Chế độ CLI
- Cấu hình nâng cao
- Xử lý sự cố
1. Yêu cầu hệ thống
- Python 3.10+
- RAM: tối thiểu 4GB (để load embedding model)
- Dung lượng ổ cứng: ~500MB cho dữ liệu + index
2. Cài đặt
# Clone repo
git clone https://git.ttcorp.net/orangepivietnam/orangepi-rag
cd orangepi-rag
# Tạo virtual environment
python -m venv .venv
# Windows:
.venv\Scripts\activate
# Linux/macOS:
source .venv/bin/activate
# Cài dependencies
pip install -r requirements.txt
# Nếu dùng CPU-only (không có GPU), dùng file riêng:
pip install -r requirements-cpu.txt
3. Cấu hình API
cp .env.example .env
Chỉnh sửa file .env:
# BẮT BUỘC: API key cho LLM (OpenAI hoặc tương thích OpenAI)
LLM_API_KEY=sk-...
# Tuỳ chọn: thay đổi base URL (dùng Together.ai, Groq, v.v.)
# LLM_BASE_URL=https://api.groq.com/openai/v1
# Tuỳ chọn: thay đổi model
# LLM_MODEL=llama-3.1-70b-versatile
# Tuỳ chọn: chỉ cần khi crawl dữ liệu mới
# FIRECRAWL_API_KEY=fc-...
Hỗ trợ API:
| Nhà cung cấp | Base URL | Ví dụ model |
|---|---|---|
| OpenAI | https://api.openai.com/v1 |
gpt-4o-mini |
| Groq | https://api.groq.com/openai/v1 |
llama-3.1-70b-versatile |
| Together.ai | https://api.together.xyz/v1 |
meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo |
| Ollama (local) | http://localhost:11434/v1 |
llama3.1 |
4. Sử dụng dữ liệu có sẵn
Dữ liệu orangepi_data/ đã được crawl sẵn từ blog orangepi.vn với 199 bài viết, 36 model Orange Pi.
Bước 1: Build index lần đầu
python rag_app.py --build --data-dir ./orangepi_data --index-dir ./orangepi_data/rag_index
Quá trình này mất ~2-5 phút tùy máy (load embedding model + tạo vectors cho 901 chunks).
Bước 2: Chạy web
python web_app.py --data-dir ./orangepi_data --index-dir ./orangepi_data/rag_index --port 5000
Mở trình duyệt: http://localhost:5000
Cách dùng trên web
- Nhấn nút + (góc trên sidebar) để tạo phiên chat mới
- Nhập câu hỏi vào ô nhập liệu
- Nhấn Enter hoặc nút gửi để nhận câu trả lời
- Mỗi câu trả lời hiển thị thời gian xử lý và nguồn (tên bài viết + link)
- Nhấn biểu tượng mặt trăng/ngày ở sidebar để chuyển Dark/Light mode
Ví dụ câu hỏi
- "Orange Pi 5 dùng chip gì?"
- "So sánh Orange Pi Zero 2 và Raspberry Pi Zero 2"
- "Cài Home Assistant trên Orange Pi Zero2 như thế nào?"
- "Orange Pi nào chạy được RISC-V?"
- "Các hệ điều hành nào hỗ trợ Orange Pi 5?"
5. Crawl dữ liệu mới
Lưu ý: Cần
FIRECRAWL_API_KEYtrong file.env.
Crawl blog bất kỳ (tổng quát)
# Crawl 5 bài đầu tiên (test)
python crawl_blog.py --sitemap https://example.com/post-sitemap.xml --limit 5
# Crawl tất cả bài viết
python crawl_blog.py --sitemap https://example.com/post-sitemap.xml --all
# Dùng file từ khóa tuỳ chỉnh
python crawl_blog.py --sitemap https://example.com/post-sitemap.xml --all --keywords my_keywords.json
# Xuất ra thư mục tuỳ chỉnh
python crawl_blog.py --sitemap https://example.com/post-sitemap.xml --all --out-dir ./my_blog_data
Crawl orangepi.vn (đặc thù)
# Crawl 5 bài
python crawl_orangepi_blog.py --limit 5
# Crawl tất cả
python crawl_orangepi_blog.py --all
File từ khóa (keywords.json)
Định dạng danh mục:
[
{
"category": "hardware",
"keywords": ["Orange Pi 5", "Orange Pi Zero", "RK3588"]
},
{
"category": "software",
"keywords": ["Docker", "Ubuntu", "Armbian"]
},
{
"category": "smart_home",
"keywords": ["Home Assistant", "MQTT", "Node-RED"]
}
]
Xem file mẫu: keywords_example.json
6. Build index
Sau khi crawl xong, build FAISS index:
# Build từ dữ liệu mới crawl
python rag_app.py --build --data-dir ./blog_data --index-dir ./blog_data/rag_index
# Build từ dữ liệu orangepi có sẵn
python rag_app.py --build --data-dir ./orangepi_data --index-dir ./orangepi_data/rag_index
Kiểm tra retrieval (không cần LLM)
python rag_app.py --retrieve-only --query "Orange Pi 5 dùng chip gì" --data-dir ./orangepi_data --index-dir ./orangepi_data/rag_index
7. Chạy giao diện web
# Dữ liệu orangepi.vn có sẵn
python web_app.py --data-dir ./orangepi_data --index-dir ./orangepi_data/rag_index --port 5000
# Dữ liệu blog riêng
python web_app.py --data-dir ./blog_data --index-dir ./blog_data/rag_index --port 5000
# Tuỳ chọn khác
python web_app.py --host 0.0.0.0 --port 8080 --debug
Tuỳ chọn CLI
| Tuỳ chọn | Mặc định | Mô tả |
|---|---|---|
--host |
0.0.0.0 |
Địa chỉ bind |
--port |
5000 |
Cổng lắng nghe |
--data-dir |
. |
Thư mục dữ liệu (chứa chunks.jsonl) |
--index-dir |
./rag_index |
Thư mục FAISS index |
--debug |
false |
Chế độ debug |
Tính năng web
- Quản lý phiên chat: Tạo, xóa, chuyển đổi giữa các phiên
- Lịch sử hội đồng: Mỗi phiên lưu riêng, hỗ trợ ngữ cảnh 10 tin nhắn gần nhất
- Hiển thị markdown: Headings, code blocks, tables, blockquotes, links
- Thời gian xử lý: Hiển thị bên dưới mỗi câu trả lời
- Nguồn trích dẫn: Link đến bài viết gốc
- Dark/Light mode: Nhấn biểu tượng ở sidebar header
- Topic guard: Tự động từ chối câu hỏi ngoài phạm vi dữ liệu
8. Chế độ CLI
# Hỏi một câu
python rag_app.py --query "Orange Pi 5 dùng chip gì" --data-dir ./orangepi_data --index-dir ./orangepi_data/rag_index
# Chat interactive
python rag_app.py --interactive --data-dir ./orangepi_data --index-dir ./orangepi_data/rag_index
# Chỉ test retrieval (không gọi LLM)
python rag_app.py --retrieve-only --query "Home Assistant" --data-dir ./orangepi_data --index-dir ./orangepi_data/rag_index
Tuỳ chọn CLI
| Tuỳ chọn | Mặc định | Mô tả |
|---|---|---|
--data-dir |
. |
Thư mục dữ liệu |
--index-dir |
./rag_index |
Thư mục FAISS index |
--build |
- | Build index từ chunks |
--query |
- | Câu hỏi (một lần) |
--interactive |
- | Chế độ chat interactive |
--retrieve-only |
- | Chỉ test retrieval, không gọi LLM |
--top-k |
5 |
Số chunks trả về |
--embed-model |
paraphrase-multilingual-MiniLM-L12-v2 |
Embedding model |
--llm-model |
gpt-4o-mini |
Tên model LLM |
--llm-base-url |
https://api.openai.com/v1 |
Base URL API |
9. Cấu hình nâng cao
Biến môi trường
| Biến | Mô tả | Mặc định |
|---|---|---|
LLM_API_KEY |
API key cho LLM | - |
LLM_BASE_URL |
Base URL API | https://api.openai.com/v1 |
LLM_MODEL |
Model name | gpt-4o-mini |
FIRECRAWL_API_KEY |
API key cho Firecrawl | - |
RAG_DATA_DIR |
Thư mục dữ liệu | . |
RAG_INDEX_DIR |
Thư mục index | ./rag_index |
RAG_TOP_K |
Số chunks retrieval | 5 |
RAG_MAX_HISTORY |
Số tin nhắn ngữ cảnh | 10 |
RAG_EMBED_MODEL |
Embedding model | paraphrase-multilingual-MiniLM-L12-v2 |
Thay đổi embedding model
# Dùng model khác
python rag_app.py --build --data-dir ./orangepi_data --index-dir ./orangepi_data/rag_index \
--embed-model "sentence-transformers/all-MiniLM-L6-v2"
Lưu ý: Khi thay đổi embedding model cần build lại index.
10. Xử lý sự cố
Lỗi ModuleNotFoundError: No module named 'torch'
pip install torch
# Hoặc dùng bản CPU:
pip install -r requirements-cpu.txt
Lỗi FIRECRAWL_API_KEY is not set
Đảm bảo file .env đã được tạo và điền đúng key. Chỉ cần thiết khi crawl dữ liệu mới.
Lỗi LLM_API_KEY is not set
Đảm bảo file .env có LLM_API_KEY=sk-.... Nếu chỉ muốn test retrieval mà không cần LLM:
python rag_app.py --retrieve-only --query "câu hỏi" --data-dir ./orangepi_data --index-dir ./orangepi_data/rag_index
Lỗi encoding trên Windows
Nếu gặp lỗi ký tự tiếng Việt, đảm bảo terminal dùng UTF-8:
chcp 65001
python web_app.py --data-dir ./orangepi_data --index-dir ./orangepi_data/rag_index --port 5000
Web không load được
- Kiểm tra port chưa bị chiếm:
netstat -ano | findstr :5000 - Thử port khác:
--port 8080 - Bật debug mode:
--debug
Copyright © 2026 — Blog RAG Solution — TTAI Solutions Software