File size: 3,471 Bytes
3381d43
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
936810c
3381d43
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
936810c
3381d43
 
 
 
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
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))