File size: 4,508 Bytes
dc22afe
 
 
8235df4
 
6414af8
8235df4
 
ecd0d07
8235df4
 
ecd0d07
dc22afe
3a407ef
 
8235df4
3a407ef
 
 
 
 
 
 
8235df4
 
dc22afe
3a407ef
ecd0d07
 
 
 
 
8235df4
ecd0d07
dc22afe
8235df4
dc22afe
8235df4
dc22afe
ecd0d07
 
dc22afe
ecd0d07
dc22afe
 
8235df4
dc22afe
 
 
 
ecd0d07
dc22afe
 
ecd0d07
8235df4
dca79e4
8235df4
dc22afe
dca79e4
 
 
 
 
 
8235df4
 
dca79e4
 
 
 
 
ecd0d07
8235df4
 
dca79e4
 
 
 
 
 
8235df4
 
dca79e4
 
 
 
 
 
 
8235df4
 
dca79e4
 
 
 
 
 
 
 
 
 
 
 
 
 
8235df4
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
from langchain_groq import ChatGroq
from langchain.schema import AIMessage, HumanMessage, SystemMessage
import json
from langchain.schema import SystemMessage, HumanMessage
from langchain_groq import ChatGroq
class RAGGenerator:
     



    def generate_answer(self,messages: list, solution: str, lang: str) -> str:
        
        consigne = (
        "Te egy műszaki asszisztens vagy, aki a gépjármű-biztosításra szakosodott. "
        "A megadott végleges megoldás alapján kizárólag azokat az elemeket emeld ki, amelyek pontosan válaszolnak a felhasználó kérdésére. "
        "Ezután fogalmazz meg egy tiszta, tömör, szigorúan tényszerű, pontos és részletes választ. "
        "A válasz **csak egyetlen nyelven legyen megfogalmazva**, az utasításban megadott nyelv szerint. "
        "Ha a megoldás szövegében szerepel hivatalos forrás (pl. törvény, rendelet, cikk, kódex, jogszabály), azt **említsd meg pontosan**. "
        "NE tartalmazzon SEMMILYEN személyesítést (se név, se üdvözlés, se köszönet, se aláírás). "
        "NE kérj semmilyen külső fájlt, képernyőképet vagy adatot. "
        "Ha a kérdés nem kapcsolódik az autóbiztosításhoz vagy a rendelkezésre álló dokumentumokhoz, "
        "válaszolj az alábbi sablon szerint:\n"
        "**Elnézést, de nem tudok válaszolni erre a kérdésre. Egy autóbiztosítási témákra specializálódott asszisztens vagyok, és csak a megadott dokumentumok alapján válaszolhatok.**"
    )



        langue_instruction = {
            'fr': 'Réponds en français.',
            'en': 'Respond in English.',
            'es': 'Responde en español.',
            'de': 'Antworte auf Deutsch.',
            'zh': '请用中文回答。' 
        }

        sys_msg = consigne + ' ' + langue_instruction.get(lang, '')

        content = [SystemMessage(content = f"A következő megoldás felhasználásával készítsd el az átfogalmazást: Végleges megoldás:\n{solution}")]

        chat_history = [SystemMessage(content=sys_msg)] + [
            AIMessage(content=msg["content"]) if msg["role"] == "assistant" else HumanMessage(content=msg["content"]) 
            for msg in messages
        ] + content

        chat = ChatGroq(
            model_name="meta-llama/llama-4-scout-17b-16e-instruct",  
            temperature=0.2
        )

        reply = chat.invoke(chat_history)

        return reply.content


    def retrieve_qa(self,query: str, docs_scores: list = []) -> tuple:
        if not docs_scores:
            raise ValueError("Nem található dokumentum a lekérdezéshez.")

        chat = ChatGroq(
            model_name="LLaMA3-8b-8192",
            temperature=0
        )
        try:
            lang_detect_messages = [
                SystemMessage(content="Határozd meg a következő mondat nyelvét. Csak az ISO 639-1 nyelvkódot válaszold meg (pl. 'fr', 'en', 'es' stb.):"),

                HumanMessage(content=query)
            ]
            lang_response = chat.invoke(lang_detect_messages)
            lang = lang_response.content.strip().lower()
        except Exception:
            lang = "en"  
        if not docs_scores:
                raise ValueError("Aucun document pertinent trouvé après reranking.")

        first_doc, _ = docs_scores[0]
        try:
            qa_pairs = json.loads(first_doc.metadata.get('qa_pairs', '[]'))
            qa_pairs = [q for q in qa_pairs if q.get('question')]
        except json.JSONDecodeError:
            raise ValueError("Érvénytelen a 'qa_pairs' metaadat.")


        if lang and qa_pairs:
            for pair in qa_pairs:
                original_question = pair.get("question", "")
                if original_question:
                    try:
                        messages = [
                            SystemMessage(content=f"Fordítsd le a következő kérdést {lang} nyelvre, csak a lefordított mondatot add meg:"),

                            HumanMessage(content=original_question)
                        ]
                        response = chat.invoke(messages)
                        pair["question"] = response.content.strip()
                    except Exception:
                        pass

        solutions = []
        for doc, _ in docs_scores:
            sol = doc.metadata.get('solution_finale', '')
            if sol:
                solutions.append(sol)
        full_solution = "\n\n".join(solutions)

        return qa_pairs, full_solution, lang