samiha123 commited on
Commit
ecd0d07
·
verified ·
1 Parent(s): e09c69d

Update src/generation.py

Browse files
Files changed (1) hide show
  1. src/generation.py +39 -34
src/generation.py CHANGED
@@ -3,36 +3,36 @@ from langchain.schema import AIMessage, HumanMessage, SystemMessage
3
  import json
4
 
5
  class RAGGenerator:
6
-
7
- def generate_answer(self, messages: list, solution: str, lang: str, raw_context: str = "") -> str:
8
- """
9
- Génère une réponse basée sur la solution finale et le texte brut, avec consignes pour ne pas omettre
10
- les lois ou sources citées, en langue hongroise.
11
- """
12
-
13
- # Instructions en hongrois avec inclusion explicite des lois/sources
14
  consigne = (
15
- "Te egy műszaki asszisztens vagy. A végleges megoldás és a nyers szöveg alapján "
16
- "készíts egy világos, tömör, tényszerű, pontos és részletes választ a felhasználó kérdésére. "
17
- "A válaszban minden jogi, szabályozási vagy hivatkozott forrás (pl. törvény, cikk, rendelet, szakasz, kódex, irányelv stb.) "
18
- "szerepeljen pontosan úgy, ahogy az a szövegben található. Ezeket soha ne hagyd ki, még ha csak közvetve is utalnak rájuk. "
19
- "A válasz NE tartalmazzon semmilyen megszemélyesítést, köszöntést, nevet, aláírást vagy kérdést fájlok küldésére."
 
 
20
  )
21
 
22
- context_msg = SystemMessage(content=f"""
23
- Ez a nyers szöveg, amely dokumentumokból származik:
24
-
25
- {raw_context}
 
 
 
26
 
27
- Ez pedig az előre kiszűrt végleges megoldás:
28
 
29
- {solution}
30
- """)
31
 
32
- chat_history = [SystemMessage(content=consigne)] + [
33
- AIMessage(content=msg["content"]) if msg["role"] == "assistant" else HumanMessage(content=msg["content"])
34
  for msg in messages
35
- ] + [context_msg]
36
 
37
  chat = ChatGroq(
38
  model_name="meta-llama/llama-4-scout-17b-16e-instruct",
@@ -40,11 +40,13 @@ Ez pedig az előre kiszűrt végleges megoldás:
40
  )
41
 
42
  reply = chat.invoke(chat_history)
 
43
  return reply.content
44
 
 
45
  def retrieve_qa(self, query: str, docs_scores: list = []) -> tuple:
46
  if not docs_scores:
47
- raise ValueError("Nem található dokumentum a lekérdezéshez.")
48
 
49
  chat = ChatGroq(
50
  model_name="LLaMA3-8b-8192",
@@ -52,28 +54,29 @@ Ez pedig az előre kiszűrt végleges megoldás:
52
  )
53
  try:
54
  lang_detect_messages = [
55
- 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.):"),
56
  HumanMessage(content=query)
57
  ]
58
  lang_response = chat.invoke(lang_detect_messages)
59
  lang = lang_response.content.strip().lower()
60
  except Exception:
61
- lang = "en"
62
 
63
  first_doc, _ = docs_scores[0]
64
  try:
65
  qa_pairs = json.loads(first_doc.metadata.get('qa_pairs', '[]'))
66
  qa_pairs = [q for q in qa_pairs if q.get('question')]
67
  except json.JSONDecodeError:
68
- raise ValueError("Érvénytelen a 'qa_pairs' metaadat.")
69
 
 
70
  if lang and qa_pairs:
71
  for pair in qa_pairs:
72
  original_question = pair.get("question", "")
73
  if original_question:
74
  try:
75
  messages = [
76
- SystemMessage(content=f"Fordítsd le a következő kérdést {lang} nyelvre, csak a lefordított mondatot add meg:"),
77
  HumanMessage(content=original_question)
78
  ]
79
  response = chat.invoke(messages)
@@ -82,16 +85,18 @@ Ez pedig az előre kiszűrt végleges megoldás:
82
  pass
83
 
84
  solutions = []
85
- full_texts = []
 
86
  for doc, _ in docs_scores:
87
  sol = doc.metadata.get('solution_finale', '')
88
- text = doc.page_content or ''
89
  if sol:
90
  solutions.append(sol)
91
- if text:
92
- full_texts.append(text)
 
 
93
 
94
  full_solution = "\n\n".join(solutions)
95
- raw_context = "\n\n".join(full_texts)
96
 
97
- return qa_pairs, full_solution, raw_context, lang
 
 
3
  import json
4
 
5
  class RAGGenerator:
6
+
7
+ def generate_answer(self, messages: list, solution: str, lang: str) -> str:
8
+
9
+ # Ajout dans la consigne de la détection et citation explicite des sources légales si présentes
 
 
 
 
10
  consigne = (
11
+ "Tu es un assistant technique. En te basant uniquement sur la solution finale fournie, "
12
+ "mets en évidence uniquement les éléments pertinents qui répondent à la question de l'utilisateur. "
13
+ "Formule ensuite une réponse claire, concise, strictement factuelle, précise et détaillée. "
14
+ "Ne contiens aucune personnalisation (pas de nom, de salutation, ni de remerciement). "
15
+ "Ne demande pas l'envoi de fichiers, captures d'écran, ou toute autre aide externe.\n"
16
+ "Si le texte contient des citations de lois, articles, décrets, règlements, codes, directives ou toute source officielle, "
17
+ "mentionne explicitement ces sources en citant leur nom ou référence."
18
  )
19
 
20
+ langue_instruction = {
21
+ 'fr': 'Réponds en français.',
22
+ 'en': 'Respond in English.',
23
+ 'es': 'Responde en español.',
24
+ 'de': 'Antworte auf Deutsch.',
25
+ 'zh': '请用中文回答。'
26
+ }
27
 
28
+ sys_msg = consigne + " " + langue_instruction.get(lang, '')
29
 
30
+ content = [SystemMessage(content=f"Utilise la solution finale suivante pour formuler la réponse :\n{solution}")]
 
31
 
32
+ chat_history = [SystemMessage(content=sys_msg)] + [
33
+ AIMessage(content=msg["content"]) if msg["role"] == "assistant" else HumanMessage(content=msg["content"])
34
  for msg in messages
35
+ ] + content
36
 
37
  chat = ChatGroq(
38
  model_name="meta-llama/llama-4-scout-17b-16e-instruct",
 
40
  )
41
 
42
  reply = chat.invoke(chat_history)
43
+
44
  return reply.content
45
 
46
+
47
  def retrieve_qa(self, query: str, docs_scores: list = []) -> tuple:
48
  if not docs_scores:
49
+ raise ValueError("Aucun document trouvé pour la requête.")
50
 
51
  chat = ChatGroq(
52
  model_name="LLaMA3-8b-8192",
 
54
  )
55
  try:
56
  lang_detect_messages = [
57
+ SystemMessage(content="Détecte la langue ISO 639-1 de la phrase suivante (ex: 'fr', 'en', 'es'):"),
58
  HumanMessage(content=query)
59
  ]
60
  lang_response = chat.invoke(lang_detect_messages)
61
  lang = lang_response.content.strip().lower()
62
  except Exception:
63
+ lang = "en"
64
 
65
  first_doc, _ = docs_scores[0]
66
  try:
67
  qa_pairs = json.loads(first_doc.metadata.get('qa_pairs', '[]'))
68
  qa_pairs = [q for q in qa_pairs if q.get('question')]
69
  except json.JSONDecodeError:
70
+ raise ValueError("Métadonnée 'qa_pairs' invalide.")
71
 
72
+ # Traduction des questions dans la langue détectée
73
  if lang and qa_pairs:
74
  for pair in qa_pairs:
75
  original_question = pair.get("question", "")
76
  if original_question:
77
  try:
78
  messages = [
79
+ SystemMessage(content=f"Traduis la question suivante en {lang}, uniquement la phrase traduite:"),
80
  HumanMessage(content=original_question)
81
  ]
82
  response = chat.invoke(messages)
 
85
  pass
86
 
87
  solutions = []
88
+ sources = set() # Pour collecter les sources
89
+
90
  for doc, _ in docs_scores:
91
  sol = doc.metadata.get('solution_finale', '')
 
92
  if sol:
93
  solutions.append(sol)
94
+ # Supposons que la source est stockée dans metadata sous 'source' ou 'origin'
95
+ src = doc.metadata.get('source') or doc.metadata.get('origin') or doc.metadata.get('reference')
96
+ if src:
97
+ sources.add(src)
98
 
99
  full_solution = "\n\n".join(solutions)
 
100
 
101
+ # Retourner aussi la liste des sources pour info / traçabilité
102
+ return qa_pairs, full_solution, lang, list(sources)