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