Spaces:
Sleeping
Sleeping
| import numpy as np | |
| from sklearn.metrics.pairwise import cosine_similarity | |
| from transformers import AutoTokenizer, AutoModelForCausalLM | |
| import torch | |
| from Retrieve.retriever import hybrid_search, retrieve | |
| import google.generativeai as genai | |
| import os | |
| from dotenv import load_dotenv | |
| load_dotenv() | |
| api_key = os.getenv("GEMINI_API_KEY") | |
| genai.configure(api_key=api_key) | |
| model = genai.GenerativeModel("gemma-3-27b-it") | |
| history = [] | |
| def build_retrieval_query(question, history): | |
| """ | |
| Tạo query tốt hơn để truy xuất RAG | |
| question: câu hỏi hiện tại của user | |
| history: list chat history | |
| model_call: hàm gọi LLM | |
| """ | |
| # lấy 4 message gần nhất | |
| history_text = "" | |
| for msg in history[-4:]: | |
| role = msg["role"] | |
| content = msg["content"] | |
| history_text += f"{role}: {content}\n" | |
| prompt = f""" | |
| Bạn là hệ thống tạo câu hỏi tìm kiếm tài liệu. | |
| Dựa vào lịch sử hội thoại và câu hỏi hiện tại, | |
| hãy viết lại câu hỏi sao cho đầy đủ ngữ cảnh | |
| để truy xuất tài liệu về Đại học Bách khoa TP.HCM. | |
| Chỉ trả về 1 câu hỏi duy nhất, mà không thay đổi ý nghĩa chính của câu hỏi. | |
| History: | |
| {history_text} | |
| User question: | |
| {question} | |
| Search query: | |
| """ | |
| query = model.generate_content(prompt) | |
| print(query.text) | |
| return query.text | |
| def build_rag_query(question: str, contexts: list, history): | |
| context_text = "\n".join(contexts) | |
| history_text = "" | |
| for msg in history[-4:]: | |
| if msg["role"] == "user": | |
| history_text += f"User: {msg['content']}\n" | |
| else: | |
| history_text += f"Assistant: {msg['content']}\n" | |
| prompt = f""" | |
| Bạn là chatbot tư vấn dành riêng cho Trường Đại học Bách khoa Đại học Quốc gia TP.HCM. | |
| Nhiệm vụ của bạn: | |
| - Chỉ trả lời các câu hỏi liên quan đến Trường Đại học Bách khoa TP.HCM. | |
| - Các chủ đề bao gồm: tuyển sinh, ngành học, học phí, chương trình đào tạo, địa chỉ, cơ sở vật chất và hoạt động sinh viên. | |
| Quy tắc: | |
| 1. Chỉ sử dụng thông tin trong phần Context để trả lời. | |
| 2. Nếu câu hỏi không liên quan đến Trường Đại học Bách khoa TP.HCM, hãy trả lời: | |
| "Xin lỗi, tôi chỉ hỗ trợ thông tin về Trường Đại học Bách khoa TP.HCM." | |
| 3. Nếu Context không chứa thông tin cần thiết, hãy trả lời: | |
| "Xin lỗi, tôi chưa có thông tin về vấn đề này." | |
| 4. Trả lời ngắn gọn, rõ ràng và thân thiện. | |
| 5. Đọc lại lịch sử hội thoại trước khi trả lời để bổ sung ngữ cảnh | |
| Lịch sử hội thoại: | |
| {history_text} | |
| Context: | |
| {context_text} | |
| Câu hỏi của người dùng: | |
| {question} | |
| Trả lời: | |
| """ | |
| print(history_text) | |
| return prompt | |
| def ask_model(question): | |
| query = build_retrieval_query(question, history) | |
| context = hybrid_search(query, question) | |
| prompt = build_rag_query(question, context, history) | |
| response = model.generate_content(prompt) | |
| history.append({"role":"user","content":question}) | |
| history.append({"role":"assistant","content":response.text}) | |
| for text in context: | |
| print(text) | |
| return response.text | |
| if __name__ == "__main__": | |
| question = "bộ nhận diện thương hiệu của trường" | |
| model_id = "google/gemma-3-27b-it" | |
| print(ask_model(question)) | |