Update app.py
Browse files
app.py
CHANGED
|
@@ -22,6 +22,7 @@ MAX_RESULTS = 5
|
|
| 22 |
# Новый клиент Mistral
|
| 23 |
mistral_client = Mistral(api_key=os.getenv("MISTRAL_API_KEY"))
|
| 24 |
|
|
|
|
| 25 |
SYSTEM_PROMPT = """
|
| 26 |
Ты PrintMaster, сервисный инженер по печатной технике. Правила:
|
| 27 |
1. Формат ответа строго:
|
|
@@ -29,8 +30,8 @@ SYSTEM_PROMPT = """
|
|
| 29 |
**Решение:** [пошаговые действия]
|
| 30 |
2. В решении включай ВСЕ шаги из найденной информации
|
| 31 |
3. Шаги решения нумеруй цифрами с точкой (1., 2., 3.)
|
| 32 |
-
4.
|
| 33 |
-
5. Не д
|
| 34 |
6. Будь краток, но исчерпывающе
|
| 35 |
7. Используй точные технические термины
|
| 36 |
8. Указывай артикулы деталей при замене
|
|
@@ -192,19 +193,22 @@ def web_search(query: str) -> tuple:
|
|
| 192 |
|
| 193 |
|
| 194 |
def clean_response(response: str) -> str:
|
| 195 |
-
|
| 196 |
-
response = re.sub(r'
|
| 197 |
-
response = re.sub(r'(\*\*Решение:\*\*.+?)(\*\*Решение:\*\*)', r'\1', response, flags=re.DOTALL)
|
| 198 |
response = re.sub(r'(\*\*Источники:\*\*.+?)(\*\*Источники:\*\*)', r'\1', response, flags=re.DOTALL)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 199 |
response = re.sub(r'\n\s*\n', '\n\n', response)
|
| 200 |
response = re.sub(r'[ \t]+', ' ', response)
|
| 201 |
response = re.sub(r'\s*\[Решение\]\s*', '', response)
|
| 202 |
-
|
| 203 |
-
|
| 204 |
-
|
| 205 |
-
|
| 206 |
-
|
| 207 |
-
|
| 208 |
return response.strip()
|
| 209 |
|
| 210 |
|
|
@@ -278,16 +282,15 @@ def process_query(prompt: str):
|
|
| 278 |
critical_steps.append("При необходимости замените неисправные компоненты")
|
| 279 |
|
| 280 |
if critical_steps:
|
| 281 |
-
solution_section = re.search(r'\*\*Решение:\*\*(.+?)(\*\*Источники
|
| 282 |
final_response,
|
| 283 |
flags=re.DOTALL)
|
| 284 |
if solution_section:
|
| 285 |
updated_solution = solution_section.group(1) + "\n" + "\n".join(critical_steps)
|
| 286 |
final_response = final_response.replace(solution_section.group(1), updated_solution)
|
| 287 |
|
| 288 |
-
|
| 289 |
-
|
| 290 |
-
final_response += f"\n\n**Источники:** {sources_ref}"
|
| 291 |
|
| 292 |
message_queue.put(('response_end', final_response))
|
| 293 |
message_queue.put(('sources', json.dumps(sources)))
|
|
@@ -332,4 +335,4 @@ def stream():
|
|
| 332 |
|
| 333 |
|
| 334 |
if __name__ == '__main__':
|
| 335 |
-
app.run(host='0.0.0.0', port=7860, debug=False)
|
|
|
|
| 22 |
# Новый клиент Mistral
|
| 23 |
mistral_client = Mistral(api_key=os.getenv("MISTRAL_API_KEY"))
|
| 24 |
|
| 25 |
+
# Обновленный SYSTEM_PROMPT с улучшенным форматированием
|
| 26 |
SYSTEM_PROMPT = """
|
| 27 |
Ты PrintMaster, сервисный инженер по печатной технике. Правила:
|
| 28 |
1. Формат ответа строго:
|
|
|
|
| 30 |
**Решение:** [пошаговые действия]
|
| 31 |
2. В решении включай ВСЕ шаги из найденной информации
|
| 32 |
3. Шаги решения нумеруй цифрами с точкой (1., 2., 3.)
|
| 33 |
+
4. Всегда завершай ответ разделом **Источники информации** (без нумерации)
|
| 34 |
+
5. Не добавляй дополнительные разделы после "Источники информации"
|
| 35 |
6. Будь краток, но исчерпывающе
|
| 36 |
7. Используй точные технические термины
|
| 37 |
8. Указывай артикулы деталей при замене
|
|
|
|
| 193 |
|
| 194 |
|
| 195 |
def clean_response(response: str) -> str:
|
| 196 |
+
# Удаляем все упоминания источников с нумерацией
|
| 197 |
+
response = re.sub(r'Источники:\s*(\[\d+\](,\s*)?+', '', response)
|
|
|
|
| 198 |
response = re.sub(r'(\*\*Источники:\*\*.+?)(\*\*Источники:\*\*)', r'\1', response, flags=re.DOTALL)
|
| 199 |
+
|
| 200 |
+
# Оставляем только раздел "Источники информации"
|
| 201 |
+
response = re.sub(r'(\*\*Источники информация?\*\*)', '', response, flags=re.IGNORECASE)
|
| 202 |
+
|
| 203 |
+
# Убираем лишние переносы
|
| 204 |
response = re.sub(r'\n\s*\n', '\n\n', response)
|
| 205 |
response = re.sub(r'[ \t]+', ' ', response)
|
| 206 |
response = re.sub(r'\s*\[Решение\]\s*', '', response)
|
| 207 |
+
|
| 208 |
+
# Убираем дублирование разделов
|
| 209 |
+
response = re.sub(r'(\*\*Проблема:\*\*.+?)(\*\*Проблема:\*\*)', r'\1', response, flags=re.DOTALL)
|
| 210 |
+
response = re.sub(r'(\*\*Решение:\*\*.+?)(\*\*Решение:\*\*)', r'\1', response, flags=re.DOTALL)
|
| 211 |
+
|
|
|
|
| 212 |
return response.strip()
|
| 213 |
|
| 214 |
|
|
|
|
| 282 |
critical_steps.append("При необходимости замените неисправные компоненты")
|
| 283 |
|
| 284 |
if critical_steps:
|
| 285 |
+
solution_section = re.search(r'\*\*Решение:\*\*(.+?)(\*\*Источники информация?\*\*|$)',
|
| 286 |
final_response,
|
| 287 |
flags=re.DOTALL)
|
| 288 |
if solution_section:
|
| 289 |
updated_solution = solution_section.group(1) + "\n" + "\n".join(critical_steps)
|
| 290 |
final_response = final_response.replace(solution_section.group(1), updated_solution)
|
| 291 |
|
| 292 |
+
# Всегда добавляем раздел "Источники информации"
|
| 293 |
+
final_response += "\n\n**Источники информации**"
|
|
|
|
| 294 |
|
| 295 |
message_queue.put(('response_end', final_response))
|
| 296 |
message_queue.put(('sources', json.dumps(sources)))
|
|
|
|
| 335 |
|
| 336 |
|
| 337 |
if __name__ == '__main__':
|
| 338 |
+
app.run(host='0.0.0.0', port=7860, debug=False)
|