Spaces:
Sleeping
Sleeping
Commit
·
be82b2e
1
Parent(s):
65c4610
added new prompt + table showing improvement
Browse files
app.py
CHANGED
|
@@ -31,7 +31,16 @@ CUSTOM_PROMPT_NEW = """
|
|
| 31 |
История чата:
|
| 32 |
{chat_history}
|
| 33 |
|
| 34 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 35 |
Проанализируйте запрос пользователя и определите тип задачи:
|
| 36 |
|
| 37 |
1. КРАТКОЕ САММАРИ (ключевые слова: "кратко", "суммировать", "резюме", "основные моменты", "в двух словах"):
|
|
@@ -117,20 +126,23 @@ def table_to_document(table_json):
|
|
| 117 |
description = table_json.get("table_description", "")
|
| 118 |
headers = table_json.get("headers", [])
|
| 119 |
|
| 120 |
-
table_text = f"
|
| 121 |
-
table_text += f"
|
| 122 |
-
table_text += f"
|
| 123 |
-
|
|
|
|
|
|
|
| 124 |
|
| 125 |
if headers:
|
| 126 |
-
table_text += f"
|
| 127 |
|
| 128 |
data = table_json.get("data", [])
|
| 129 |
if data:
|
| 130 |
-
|
|
|
|
| 131 |
if isinstance(row, dict):
|
| 132 |
row_str = " | ".join([f"{k}: {v}" for k,v in row.items()])
|
| 133 |
-
table_text += f"{row_str}\n"
|
| 134 |
|
| 135 |
return Document(text=table_text, metadata=metadata)
|
| 136 |
|
|
@@ -195,7 +207,6 @@ def download_table_data():
|
|
| 195 |
|
| 196 |
|
| 197 |
def improve_query_with_history(question, chat_history_list):
|
| 198 |
-
"""Улучшает запрос с учетом истории чата"""
|
| 199 |
try:
|
| 200 |
log_message("🔄 Улучшение запроса с учетом истории...")
|
| 201 |
|
|
@@ -205,22 +216,22 @@ def improve_query_with_history(question, chat_history_list):
|
|
| 205 |
|
| 206 |
history_context = ""
|
| 207 |
for i, (user_msg, bot_msg) in enumerate(chat_history_list[-3:], 1):
|
| 208 |
-
history_context += f"
|
| 209 |
|
| 210 |
-
improvement_prompt = f"""
|
| 211 |
-
Ты помощник для улучшения поисковых запросов. Проанализируй историю чата и текущий вопрос пользователя.
|
| 212 |
|
| 213 |
-
|
| 214 |
{history_context}
|
| 215 |
|
| 216 |
-
|
| 217 |
-
|
| 218 |
-
Если текущий вопрос неполный или ссылается на что-то из истории (например, "что это значит?", "а это что?", "объясните это"),
|
| 219 |
-
то создай улучшенный запрос, который включает контекст из истории.
|
| 220 |
|
| 221 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 222 |
|
| 223 |
-
|
| 224 |
|
| 225 |
from llama_index.llms.google_genai import GoogleGenAI
|
| 226 |
llm = GoogleGenAI(model="gemini-2.0-flash", api_key=GOOGLE_API_KEY)
|
|
@@ -315,15 +326,6 @@ def answer_question(question, history):
|
|
| 315 |
bot_response = llm.complete(russian_prompt).text.strip()
|
| 316 |
log_message(f"🔄 Исправленный ответ на русском: {bot_response[:100]}...")
|
| 317 |
|
| 318 |
-
# Добавляем информацию о документе если есть метаданные
|
| 319 |
-
if retrieved_nodes and hasattr(retrieved_nodes[0], 'metadata'):
|
| 320 |
-
metadata = retrieved_nodes[0].metadata
|
| 321 |
-
document_id = metadata.get('document_id', '')
|
| 322 |
-
if document_id and document_id != 'unknown':
|
| 323 |
-
if not bot_response.endswith('.'):
|
| 324 |
-
bot_response += '.'
|
| 325 |
-
bot_response += f"\n\nПодробнее об этом можно узнать в документе {document_id}."
|
| 326 |
-
|
| 327 |
# Обновляем историю чата
|
| 328 |
chat_history.append((question, bot_response))
|
| 329 |
|
|
@@ -451,6 +453,9 @@ def generate_sources_html(nodes):
|
|
| 451 |
unique_docs[doc_id].append(node)
|
| 452 |
|
| 453 |
for doc_id, doc_nodes in unique_docs.items():
|
|
|
|
|
|
|
|
|
|
| 454 |
file_link = None
|
| 455 |
if chunks_df is not None and 'file_link' in chunks_df.columns:
|
| 456 |
doc_rows = chunks_df[chunks_df['document_id'] == doc_id]
|
|
@@ -463,10 +468,14 @@ def generate_sources_html(nodes):
|
|
| 463 |
if file_link:
|
| 464 |
html += f"<a href='{file_link}' target='_blank' style='color: #68d391; text-decoration: none; font-size: 14px; display: inline-block; margin-bottom: 10px;'>🔗 Ссылка на документ</a><br>"
|
| 465 |
|
| 466 |
-
for node in doc_nodes
|
| 467 |
-
|
| 468 |
-
|
| 469 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 470 |
|
| 471 |
html += "</div>"
|
| 472 |
|
|
|
|
| 31 |
История чата:
|
| 32 |
{chat_history}
|
| 33 |
|
| 34 |
+
|
| 35 |
+
ИНСТРУКЦИИ ПО ОБРАБОТКЕ КОНТЕКСТА:
|
| 36 |
+
|
| 37 |
+
1. АНАЛИЗ ТАБЛИЧНЫХ ДАННЫХ:
|
| 38 |
+
- Если в контексте есть информация начинающаяся с "Таблица", внимательно изучите её содержимое
|
| 39 |
+
- Извлекайте данные из строк с заголовками и данными таблицы
|
| 40 |
+
- Указывайте номер и название таблицы при ответе
|
| 41 |
+
- Структурируйте ответ на основе табличных данных
|
| 42 |
+
|
| 43 |
+
2. ОПРЕДЕЛЕНИЕ ТИПА ЗАДАЧИ:
|
| 44 |
Проанализируйте запрос пользователя и определите тип задачи:
|
| 45 |
|
| 46 |
1. КРАТКОЕ САММАРИ (ключевые слова: "кратко", "суммировать", "резюме", "основные моменты", "в двух словах"):
|
|
|
|
| 126 |
description = table_json.get("table_description", "")
|
| 127 |
headers = table_json.get("headers", [])
|
| 128 |
|
| 129 |
+
table_text = f"ТАБЛИЦА: {table_json.get('table_number', '')} - {table_json.get('table_title', '')}\n"
|
| 130 |
+
table_text += f"ДОКУМЕНТ: {document_id}\n"
|
| 131 |
+
table_text += f"РАЗДЕЛ: {table_json.get('section', '')}\n"
|
| 132 |
+
|
| 133 |
+
if description:
|
| 134 |
+
table_text += f"ОПИСАНИЕ: {description}\n"
|
| 135 |
|
| 136 |
if headers:
|
| 137 |
+
table_text += f"ЗАГОЛОВКИ ТАБЛИЦЫ: {' | '.join(headers)}\n"
|
| 138 |
|
| 139 |
data = table_json.get("data", [])
|
| 140 |
if data:
|
| 141 |
+
table_text += "ДАННЫЕ ТАБЛИЦЫ:\n"
|
| 142 |
+
for i, row in enumerate(data):
|
| 143 |
if isinstance(row, dict):
|
| 144 |
row_str = " | ".join([f"{k}: {v}" for k,v in row.items()])
|
| 145 |
+
table_text += f"Строка {i+1}: {row_str}\n"
|
| 146 |
|
| 147 |
return Document(text=table_text, metadata=metadata)
|
| 148 |
|
|
|
|
| 207 |
|
| 208 |
|
| 209 |
def improve_query_with_history(question, chat_history_list):
|
|
|
|
| 210 |
try:
|
| 211 |
log_message("🔄 Улучшение запроса с учетом истории...")
|
| 212 |
|
|
|
|
| 216 |
|
| 217 |
history_context = ""
|
| 218 |
for i, (user_msg, bot_msg) in enumerate(chat_history_list[-3:], 1):
|
| 219 |
+
history_context += f"Вопрос {i}: {user_msg}\nОтвет {i}: {bot_msg[:200]}...\n\n"
|
| 220 |
|
| 221 |
+
improvement_prompt = f"""Проанализируй историю диалога и улучши текущий запрос пользователя.
|
|
|
|
| 222 |
|
| 223 |
+
ИСТОРИЯ ДИАЛОГА:
|
| 224 |
{history_context}
|
| 225 |
|
| 226 |
+
ТЕКУЩИЙ ЗАПРОС: {question}
|
|
|
|
|
|
|
|
|
|
| 227 |
|
| 228 |
+
ПРАВИЛА:
|
| 229 |
+
1. Если запрос неполный или ссылается на предыдущий контекст (например: "что это", "о чем это", "объясни это"), дополни его информацией из истории
|
| 230 |
+
2. Если запрос самодостаточный, верни его без изменений
|
| 231 |
+
3. Сохраняй ключевые термины и названия документов из истории
|
| 232 |
+
4. Отвечай только улучшенным запросом без дополнительных пояснений
|
| 233 |
|
| 234 |
+
УЛУЧШЕННЫЙ ЗАПРОС:"""
|
| 235 |
|
| 236 |
from llama_index.llms.google_genai import GoogleGenAI
|
| 237 |
llm = GoogleGenAI(model="gemini-2.0-flash", api_key=GOOGLE_API_KEY)
|
|
|
|
| 326 |
bot_response = llm.complete(russian_prompt).text.strip()
|
| 327 |
log_message(f"🔄 Исправленный ответ на русском: {bot_response[:100]}...")
|
| 328 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 329 |
# Обновляем историю чата
|
| 330 |
chat_history.append((question, bot_response))
|
| 331 |
|
|
|
|
| 453 |
unique_docs[doc_id].append(node)
|
| 454 |
|
| 455 |
for doc_id, doc_nodes in unique_docs.items():
|
| 456 |
+
if doc_id == 'unknown' or doc_id == 'Раздел документа':
|
| 457 |
+
continue
|
| 458 |
+
|
| 459 |
file_link = None
|
| 460 |
if chunks_df is not None and 'file_link' in chunks_df.columns:
|
| 461 |
doc_rows = chunks_df[chunks_df['document_id'] == doc_id]
|
|
|
|
| 468 |
if file_link:
|
| 469 |
html += f"<a href='{file_link}' target='_blank' style='color: #68d391; text-decoration: none; font-size: 14px; display: inline-block; margin-bottom: 10px;'>🔗 Ссылка на документ</a><br>"
|
| 470 |
|
| 471 |
+
table_nodes = [node for node in doc_nodes if 'table_number' in node.metadata]
|
| 472 |
+
if table_nodes:
|
| 473 |
+
for node in table_nodes[:3]:
|
| 474 |
+
metadata = node.metadata
|
| 475 |
+
table_num = metadata.get('table_number', '')
|
| 476 |
+
table_title = metadata.get('table_title', 'Без названия')
|
| 477 |
+
if table_num and table_title != 'Без названия':
|
| 478 |
+
html += f"<p style='font-size: 12px; color: #a0aec0; margin: 5px 0;'>📊 {table_num}: {table_title}</p>"
|
| 479 |
|
| 480 |
html += "</div>"
|
| 481 |
|