| # Sửa Chatbot để Hỗ trợ General Conversation | |
| ## Vấn đề | |
| Chatbot không trả lời được như một chatbot AI thông thường vì: | |
| 1. **Chỉ gọi LLM khi có documents** → Không thể trả lời general queries | |
| 2. **Trả về error message ngay khi không có documents** → Không cho LLM cơ hội trả lời | |
| ## Giải pháp đã áp dụng | |
| ### 1. Sửa `rag.py` - Cho phép LLM trả lời ngay cả khi không có documents | |
| **File:** `backend/hue_portal/core/rag.py` | |
| **Thay đổi:** | |
| - Trước: Trả về error message ngay khi không có documents | |
| - Sau: Gọi LLM ngay cả khi không có documents (general conversation mode) | |
| ```python | |
| # Trước: | |
| if not documents: | |
| return error_message # ← Không gọi LLM | |
| # Sau: | |
| # Gọi LLM trước (ngay cả khi không có documents) | |
| if use_llm: | |
| llm_answer = llm.generate_answer(query, context=context, documents=documents if documents else []) | |
| if llm_answer: | |
| return llm_answer | |
| # Chỉ trả về error nếu không có LLM và không có documents | |
| if not documents: | |
| return error_message | |
| ``` | |
| ### 2. Sửa `llm_integration.py` - Prompt cho general conversation | |
| **File:** `backend/hue_portal/chatbot/llm_integration.py` | |
| **Thay đổi:** | |
| - Nếu có documents → Yêu cầu trả lời dựa trên documents (strict mode) | |
| - Nếu không có documents → Cho phép general conversation (friendly mode) | |
| ```python | |
| if documents: | |
| # Strict mode: chỉ trả lời dựa trên documents | |
| prompt_parts.extend([...]) | |
| else: | |
| # General conversation mode | |
| prompt_parts.extend([ | |
| "- Trả lời câu hỏi một cách tự nhiên và hữu ích như một chatbot AI thông thường", | |
| "- Nếu câu hỏi liên quan đến pháp luật nhưng không có thông tin, hãy nói rõ", | |
| ... | |
| ]) | |
| ``` | |
| ### 3. Sửa `rag_pipeline` - Luôn gọi generate_answer_template | |
| **File:** `backend/hue_portal/core/rag.py` | |
| **Thay đổi:** | |
| - Trước: Trả về error ngay khi không có documents | |
| - Sau: Luôn gọi `generate_answer_template` để cho LLM cơ hội trả lời | |
| ```python | |
| # Trước: | |
| if not documents: | |
| return {'answer': error_message, ...} # ← Không gọi LLM | |
| # Sau: | |
| # Luôn gọi generate_answer_template (sẽ gọi LLM nếu có) | |
| answer = generate_answer_template(query, documents, content_type, context=context, use_llm=use_llm) | |
| ``` | |
| ### 4. Sửa `chatbot.py` - Sử dụng answer từ LLM ngay cả khi count=0 | |
| **File:** `backend/hue_portal/chatbot/chatbot.py` | |
| **Thay đổi:** | |
| - Trước: Chỉ sử dụng RAG result nếu `count > 0` | |
| - Sau: Sử dụng answer từ LLM ngay cả khi `count = 0` | |
| ```python | |
| # Trước: | |
| if rag_result["count"] > 0 and rag_result["confidence"] >= confidence: | |
| # Sử dụng answer | |
| # Sau: | |
| if rag_result.get("answer") and (rag_result["count"] > 0 or rag_result.get("answer", "").strip()): | |
| # Sử dụng answer (kể cả khi count=0) | |
| ``` | |
| ## Kết quả | |
| ✅ **LLM được gọi ngay cả khi không có documents** | |
| - Logs cho thấy: `[RAG] Using LLM provider: api` | |
| - Logs cho thấy: `[LLM] 🔗 Calling API: ...` | |
| ⚠️ **API trả về 500 error** | |
| - Có thể do HF Spaces API đang gặp lỗi | |
| - Hoặc prompt quá dài | |
| - Cần kiểm tra HF Spaces logs | |
| ## Cách test | |
| 1. **Test với general query:** | |
| ```bash | |
| curl -X POST http://localhost:8000/api/chatbot/chat/ \ | |
| -H "Content-Type: application/json" \ | |
| -d '{"message":"mấy giờ rồi","reset_session":false}' | |
| ``` | |
| 2. **Xem logs:** | |
| ```bash | |
| tail -f /tmp/django_general_conv.log | grep -E "\[RAG\]|\[LLM\]" | |
| ``` | |
| 3. **Kiểm tra LLM có được gọi:** | |
| - Tìm: `[RAG] Using LLM provider: api` | |
| - Tìm: `[LLM] 🔗 Calling API: ...` | |
| ## Lưu ý | |
| - **API mode cần HF Spaces hoạt động** → Nếu API trả về 500, cần kiểm tra HF Spaces | |
| - **Local mode** sẽ hoạt động tốt hơn nếu có GPU | |
| - **General conversation** chỉ hoạt động khi LLM available | |