File size: 9,982 Bytes
cb93402
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
# Hướng Dẫn Sử Dụng PDF với ChatbotRAG

## Tổng Quan

Hệ thống ChatbotRAG hiện đã hỗ trợ **tải lên và index PDF** để chatbot có thể trả lời câu hỏi dựa trên nội dung trong PDF. Điều này rất hữu ích cho:
- Hướng dẫn sử dụng sản phẩm
- Tài liệu FAQ
- Chính sách, quy định
- Tài liệu kỹ thuật

## Cách Thức Hoạt Động

1. **Upload PDF** → Hệ thống parse PDF thành text
2. **Chunking** → Text được chia thành các chunks (mặc định: 500 words/chunk, overlap 50 words)
3. **Embedding** → Mỗi chunk được convert thành vector embedding
4. **Indexing** → Lưu vào Qdrant + MongoDB
5. **Chat** → Chatbot tìm kiếm chunks liên quan và trả lời câu hỏi

## Cách 1: Upload PDF Qua API

### Endpoint: `POST /upload-pdf`

**Request:**
```bash
curl -X POST "http://localhost:8000/upload-pdf" \
  -F "file=@huong_dan_su_dung.pdf" \
  -F "title=Hướng dẫn sử dụng ChatbotRAG" \
  -F "description=Tài liệu hướng dẫn đầy đủ về ChatbotRAG" \
  -F "category=user_guide"
```

**Python:**
```python
import requests

with open('huong_dan_su_dung.pdf', 'rb') as f:
    files = {'file': f}
    data = {
        'title': 'Hướng dẫn sử dụng ChatbotRAG',
        'description': 'Tài liệu hướng dẫn đầy đủ',
        'category': 'user_guide'
    }

    response = requests.post(
        'http://localhost:8000/upload-pdf',
        files=files,
        data=data
    )

    print(response.json())
```

**Response:**
```json
{
  "success": true,
  "document_id": "pdf_20251029_143022",
  "filename": "huong_dan_su_dung.pdf",
  "chunks_indexed": 45,
  "message": "PDF 'huong_dan_su_dung.pdf' đã được index thành công với 45 chunks"
}
```

### Tham Số:
- `file` (required): File PDF
- `document_id` (optional): ID tùy chỉnh, mặc định auto-generate
- `title` (optional): Tiêu đề tài liệu
- `description` (optional): Mô tả
- `category` (optional): Danh mục (user_guide, faq, policy, etc.)

## Cách 2: Batch Index Nhiều PDFs

Nếu bạn có nhiều PDF files, sử dụng script batch:

```bash
# Index tất cả PDFs trong thư mục
python batch_index_pdfs.py ./docs/user_guides

# Với category tùy chỉnh
python batch_index_pdfs.py ./docs/policies --category=policy

# Force reindex (ghi đè nếu đã có)
python batch_index_pdfs.py ./docs/faq --category=faq --force
```

Script sẽ tự động:
- Scan tất cả file .pdf trong thư mục
- Index từng file với metadata phù hợp
- Skip những file đã index (trừ khi dùng --force)
- Hiển thị progress và summary

## Quản Lý PDF Documents

### Xem Danh Sách PDFs

```bash
curl http://localhost:8000/documents/pdf
```

**Response:**
```json
{
  "documents": [
    {
      "document_id": "pdf_user_guide",
      "type": "pdf",
      "filename": "huong_dan_su_dung.pdf",
      "num_chunks": 45,
      "metadata": {
        "title": "Hướng dẫn sử dụng",
        "category": "user_guide"
      }
    }
  ],
  "total": 1
}
```

### Xóa PDF Document

```bash
# Xóa document và tất cả chunks của nó
curl -X DELETE http://localhost:8000/documents/pdf/pdf_user_guide
```

## Chat Với PDF Content

Sau khi index PDF, bạn có thể chat như bình thường:

```python
import requests

response = requests.post('http://localhost:8000/chat', json={
    'message': 'Làm sao để upload PDF vào ChatbotRAG?',
    'use_rag': True,
    'use_advanced_rag': True,
    'top_k': 5,
    'hf_token': 'your_hf_token'
})

result = response.json()
print("Answer:", result['response'])

# Xem sources
for ctx in result['context_used']:
    print(f"- Page {ctx['metadata']['page']}: {ctx['metadata']['text'][:100]}...")
```

Chatbot sẽ tự động tìm kiếm trong PDF và trả lời dựa trên nội dung đã index.

## Tạo PDF Hướng Dẫn Sử Dụng

### Template Nội Dung

Dưới đây là cấu trúc đề xuất cho PDF hướng dẫn ChatbotRAG:

```
HƯỚNG DẪN SỬ DỤNG CHATBOTRAG

1. GIỚI THIỆU
   - ChatbotRAG là gì?
   - Tính năng chính
   - Use cases

2. BẮT ĐẦU NHANH
   2.1. Cài đặt
   2.2. Khởi động server
   2.3. Truy cập API

3. INDEX DỮ LIỆU
   3.1. Index text đơn giản
   3.2. Index với images
   3.3. Index nhiều texts và images cùng lúc
   3.4. Upload PDF

4. TÌM KIẾM
   4.1. Search bằng text
   4.2. Search bằng image
   4.3. Hybrid search

5. CHAT VỚI CHATBOT
   5.1. Chat cơ bản
   5.2. Chat với RAG
   5.3. Advanced RAG options
   5.4. Tùy chỉnh LLM parameters

6. QUẢN LÝ DOCUMENTS
   6.1. Xem danh sách documents
   6.2. Xóa documents
   6.3. Quản lý PDF files

7. CÂU HỎI THƯỜNG GẶP (FAQ)
   - Làm sao để upload PDF?
   - Chatbot không tìm thấy thông tin?
   - Làm sao để cải thiện độ chính xác?
   - Token limit là bao nhiêu?

8. API REFERENCE
   - POST /index
   - POST /search
   - POST /chat
   - POST /upload-pdf
   - GET /documents/pdf
```

### Tạo PDF Từ Markdown

Bạn có thể tạo PDF từ Markdown bằng nhiều tools:

**1. Pandoc (Recommended):**
```bash
pandoc guide.md -o guide.pdf --pdf-engine=xelatex
```

**2. Online Tools:**
- https://www.markdowntopdf.com/
- https://md2pdf.netlify.app/

**3. VS Code Extension:**
- Install "Markdown PDF" extension
- Right-click file .md → "Markdown PDF: Export (pdf)"

### Ví Dụ Markdown Content

Tạo file `chatbot_guide.md`:

```markdown
# Hướng Dẫn Sử Dụng ChatbotRAG

## 1. Upload PDF

Để upload PDF vào hệ thống:

### Bước 1: Chuẩn bị file PDF
- File phải có định dạng .pdf
- Nội dung nên rõ ràng, có cấu trúc

### Bước 2: Upload qua API

\`\`\`bash
curl -X POST "http://localhost:8000/upload-pdf" \
  -F "file=@your_file.pdf" \
  -F "title=Tên tài liệu"
\`\`\`

### Bước 3: Kiểm tra
Sau khi upload, hệ thống sẽ trả về số chunks đã được index.

## 2. Chat Với Chatbot

Sau khi upload PDF, bạn có thể hỏi chatbot:

**Ví dụ:**
- "Làm sao để upload PDF?"
- "Các bước tạo event là gì?"
- "Tính năng nào trong hệ thống?"

Chatbot sẽ tìm kiếm trong PDF và trả lời dựa trên nội dung đã index.

## 3. FAQ

### Câu hỏi 1: Upload PDF tối đa bao nhiêu trang?
Không giới hạn, nhưng PDF càng lớn thì thời gian index càng lâu.

### Câu hỏi 2: Có thể upload nhiều PDFs không?
Có, bạn có thể upload nhiều PDFs. Mỗi PDF sẽ có document_id riêng.

### Câu hỏi 3: Làm sao để xóa PDF đã upload?
Sử dụng endpoint DELETE /documents/pdf/{document_id}
```

Sau đó convert sang PDF:
```bash
pandoc chatbot_guide.md -o chatbot_guide.pdf
```

## Best Practices

### 1. Cấu Trúc PDF
- ✓ Có tiêu đề rõ ràng
- ✓ Chia sections/chapters
- ✓ Sử dụng bullet points
- ✓ Tránh quá nhiều hình ảnh phức tạp (text extraction khó)

### 2. Nội Dung
- ✓ Viết câu ngắn gọn, dễ hiểu
- ✓ Mỗi section tập trung 1 chủ đề
- ✓ Có ví dụ cụ thể
- ✗ Tránh văn xuôi dài, khó tách câu

### 3. Metadata
- Luôn đặt `title` rõ ràng
- Sử dụng `category` để phân loại
- Thêm `description` cho dễ quản lý

### 4. Chunking
Mặc định:
- Chunk size: 500 words
- Overlap: 50 words

Có thể tùy chỉnh trong `pdf_parser.py`:
```python
parser = PDFParser(
    chunk_size=500,      # Tăng nếu muốn context dài hơn
    chunk_overlap=50,    # Tăng để giữ context tốt hơn
    min_chunk_size=50    # Min words cho 1 chunk
)
```

## Troubleshooting

### Lỗi: "Error reading PDF"
- Kiểm tra file PDF có bị corrupt không
- Thử mở bằng PDF reader để verify
- Convert lại PDF nếu cần

### Lỗi: "No text extracted"
- PDF có thể là scanned images (không có text layer)
- Cần OCR trước khi index (dùng tools như Tesseract)

### Chatbot không tìm thấy thông tin
- Kiểm tra `score_threshold` - thử giảm xuống (e.g., 0.3)
- Tăng `top_k` để retrieve nhiều documents hơn
- Rephrase câu hỏi

### Chunks quá ngắn/dài
- Điều chỉnh `chunk_size` trong `pdf_parser.py`
- Reindex PDF với settings mới

## Complete Example

```python
# 1. Upload PDF
import requests

with open('user_guide.pdf', 'rb') as f:
    response = requests.post(
        'http://localhost:8000/upload-pdf',
        files={'file': f},
        data={
            'title': 'Hướng dẫn sử dụng',
            'category': 'user_guide'
        }
    )

doc_id = response.json()['document_id']
print(f"Uploaded: {doc_id}")

# 2. List PDFs
response = requests.get('http://localhost:8000/documents/pdf')
print(response.json())

# 3. Chat
response = requests.post('http://localhost:8000/chat', json={
    'message': 'Làm sao để tạo event mới?',
    'use_rag': True,
    'use_advanced_rag': True,
    'hf_token': 'your_token'
})

print("Answer:", response.json()['response'])

# 4. Delete PDF (if needed)
response = requests.delete(f'http://localhost:8000/documents/pdf/{doc_id}')
print(response.json())
```

## Next Steps

1. **Tạo PDF hướng dẫn của bạn** với nội dung về hệ thống của bạn
2. **Upload PDF** vào hệ thống
3. **Test chatbot** - hỏi các câu hỏi về nội dung trong PDF
4. **Fine-tune** - điều chỉnh parameters nếu cần
5. **Add more PDFs** - thêm FAQs, policies, etc.

## Support

Nếu có vấn đề, check:
- Server logs để xem errors
- MongoDB để xem documents đã được lưu chưa
- Qdrant collection để verify chunks đã được index

## Conclusion

Hệ thống PDF RAG giúp chatbot của bạn trả lời câu hỏi dựa trên tài liệu có sẵn, không cần train lại model. Bạn chỉ cần:
1. Upload PDF
2. Chat như bình thường
3. Chatbot sẽ tìm kiếm và trả lời dựa trên PDF content

Đơn giản và hiệu quả!