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 |