chatbot / src /generation.py
samiha123's picture
Update src/generation.py
3a407ef verified
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