Spaces:
Paused
Paused
# llm_handler.py | |
# Chịu trách nhiệm cho mọi logic liên quan đến mô hình ngôn ngữ lớn (LLM). | |
import torch | |
from unsloth import FastLanguageModel | |
# --- HÀM TẠO CÂU TRẢ LỜI --- | |
def generate_llm_response( | |
query: str, | |
context: str, | |
llm_model, | |
tokenizer, | |
max_new_tokens: int = 512, | |
temperature: float = 0.3, | |
top_p: float = 0.9, | |
) -> str: | |
""" | |
Sinh câu trả lời từ LLM dựa trên câu hỏi và ngữ cảnh đã được truy xuất. | |
""" | |
print("🧠 Bắt đầu sinh câu trả lời từ LLM...") | |
# Xây dựng prompt | |
prompt = f"""Bạn là một trợ lý AI chuyên tư vấn về luật giao thông đường bộ Việt Nam. | |
Dựa vào các thông tin luật được cung cấp dưới đây để trả lời câu hỏi của người dùng một cách chính xác và chi tiết. | |
Nếu thông tin không đủ, hãy trả lời rằng bạn không tìm thấy thông tin cụ thể trong tài liệu. | |
### Thông tin luật được trích dẫn: | |
{context} | |
### Câu hỏi của người dùng: | |
{query} | |
### Trả lời của bạn:""" | |
# Tạo input cho model | |
device = llm_model.device | |
inputs = tokenizer(prompt, return_tensors="pt").to(device) | |
# Cấu hình cho việc sinh văn bản | |
generation_config = dict( | |
max_new_tokens=max_new_tokens, | |
temperature=temperature, | |
top_p=top_p, | |
do_sample=True, | |
pad_token_id=tokenizer.eos_token_id | |
) | |
try: | |
output_ids = llm_model.generate(**inputs, **generation_config) | |
input_length = inputs.input_ids.shape[1] | |
generated_ids = output_ids[0][input_length:] | |
response_text = tokenizer.decode(generated_ids, skip_special_tokens=True).strip() | |
print("✅ Sinh câu trả lời hoàn tất.") | |
return response_text | |
except Exception as e: | |
print(f"❌ Lỗi khi sinh câu trả lời từ LLM: {e}") | |
return "Xin lỗi, đã có lỗi xảy ra trong quá trình tạo câu trả lời." | |