| 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 |