feat: enhance summarization prompt and improve MongoDB test generation

- Updated summarization prompt to require Russian output and exclude non-textual elements
- Upgraded ollama dependency to v0.6.1
- Enhanced run.sh script to support both single record and file-based ID input for MongoDB test generation
- Updated documentation in scripts/README.md to reflect new functionality
- Added verbose flag to generate_summarization_from_mongo.py for better debugging
```

This commit message follows the conventional commit format with a short title (50-72 characters) and provides a clear description of the changes made and their purpose.
This commit is contained in:
2026-01-23 03:49:22 +03:00
parent d8785ada8a
commit 2048e4e40d
234 changed files with 3268 additions and 72 deletions

View File

@@ -32,17 +32,23 @@ python scripts/generate_tests.py --count 2 --category translation --model second
**Функциональность:**
- Извлекает текст статьи из коллекции `rssNotification` (поле `.meta.topicContent`)
- Генерирует тестовые данные в формате JSON для бенчмарка AI
- Генерирует тестовые данные в формате TXT для бенчмарка AI
- Валидирует generated тесты
- Поддерживает обработку как одной записи, так и нескольких записей из файла
**Использование:**
```bash
# Для обработки одной записи
python scripts/generate_summarization_from_mongo.py --record-id 507f1f77bcf86cd799439011
# Для обработки нескольких записей из файла
python scripts/generate_summarization_from_mongo.py --id-file ids.txt
```
**Параметры:**
- `--record-id`: ID записи в MongoDB (обязательный параметр)
- `--output-dir`: Директория для сохранения generated тестов (по умолчанию: tests/summarization)
- `--record-id`: ID записи в MongoDB (для обработки одной записи)
- `--id-file`: Файл с ID записей (по одной на строку, для обработки нескольких записей)
* Примечание: Укажите либо `--record-id`, либо `--id-file`, но не оба одновременно
**Требования:**
- Доступ к MongoDB кластеру (10.0.0.3, 10.0.0.4, 10.0.0.5)
@@ -56,6 +62,13 @@ Summarize the following text in 1-2 sentences: 'Текст статьи из Mon
**Примечание:** Тесты генерируются в формате TXT с разделителем `==============`. Поле "expected" может быть пустым, если генерация пересказа не удалась.
**Обработка файла с ID:**
- Скрипт читает ID из файла построчно
- Обрабатывает каждую запись по очереди
- Выводит прогресс и статистику по обработке
- Продолжает обработку остальных записей даже при ошибках отдельных записей
- Выводит подробные логи об ошибках для каждой неудачной записи
## Установка зависимостей
Для работы скриптов требуются следующие зависимости:

View File

@@ -66,12 +66,13 @@ def extract_text_from_topic_content(topic_content: Dict) -> Optional[str]:
return content_str
def generate_test_from_mongo_record(record_id: str) -> bool:
def generate_test_from_mongo_record(record_id: str, verbose: bool = True) -> bool:
"""
Генерирует тест пересказа из записи MongoDB.
Args:
record_id: ID записи в MongoDB
verbose: Выводить подробную отладочную информацию (по умолчанию: True)
Returns:
True, если тест успешно generated, False в случае ошибки
@@ -84,32 +85,42 @@ def generate_test_from_mongo_record(record_id: str) -> bool:
# Извлекаем запись по ID
record = collection.find_one({"_id": record_id})
if not record:
print(f"❌ Запись с ID {record_id} не найдена в коллекции")
if verbose:
print(f"❌ Запись с ID {record_id} не найдена в коллекции")
return False
# Отладочная информация
print(f"🔍 Найдена запись: {record_id}")
print(f"📋 Полная структура записи:")
print(json.dumps(record, ensure_ascii=False, indent=2, default=str))
# Отладочная информация (только при verbose=True)
if verbose:
print(f"🔍 Найдена запись: {record_id}")
print(f"📋 Полная структура записи:")
print(json.dumps(record, ensure_ascii=False, indent=2, default=str))
# Извлекаем текст из meta.topicContent
meta_data = record.get('meta', {})
topic_content = meta_data.get('topicContent')
if not topic_content:
print(f"В записи {record_id} отсутствует поле meta.topicContent")
if verbose:
print(f"В записи {record_id} отсутствует поле meta.topicContent")
print(f"📋 Полная структура записи:")
print(json.dumps(record, ensure_ascii=False, indent=2, default=str))
return False
print(f"📝 Тип поля meta.topicContent: {type(topic_content)}")
print(f"📝 Содержимое meta.topicContent (первые 500 символов):")
print(str(topic_content)[:500])
if verbose:
print(f"📝 Тип поля meta.topicContent: {type(topic_content)}")
print(f"📝 Содержимое meta.topicContent (первые 500 символов):")
print(str(topic_content)[:500])
# Извлекаем текст
article_text = extract_text_from_topic_content(topic_content)
if not article_text:
print(f"Не удалось извлечь текст из meta.topicContent записи {record_id}")
if verbose:
print(f"Не удалось извлечь текст из meta.topicContent записи {record_id}")
print(f"📋 Полная структура записи:")
print(json.dumps(record, ensure_ascii=False, indent=2, default=str))
return False
print(f"📝 Итоговый текст (первые 500 символов): {article_text[:500]}")
if verbose:
print(f"📝 Итоговый текст (первые 500 символов): {article_text[:500]}")
# Генерируем пересказ через LLM (если доступно)
expected_summary = ""
@@ -132,7 +143,8 @@ Provide only the summary, no additional text."""
# Очищаем ID от недопустимых символов для имени файла
filename = sanitize_filename(record_id)
if not filename:
print(f"Не удалось создать допустимое имя файла из ID записи {record_id}")
if verbose:
print(f"Не удалось создать допустимое имя файла из ID записи {record_id}")
return False
# Используем очищенный ID записи как имя файла
@@ -142,14 +154,23 @@ Provide only the summary, no additional text."""
with open(test_file, "w", encoding="utf-8") as f:
f.write(f"{article_text}{TEST_SEPARATOR}{expected_summary}")
print(f"✅ Создан тест tests/summarization/{filename}.txt")
print(f" Источник: MongoDB запись {record_id}")
print(f" Текст статьи (первые 100 символов): {article_text[:100]}...")
if verbose:
print(f"✅ Создан тест tests/summarization/{filename}.txt")
print(f" Источник: MongoDB запись {record_id}")
print(f" Текст статьи (первые 100 символов): {article_text[:100]}...")
return True
except Exception as e:
print(f"❌ Ошибка при генерации теста: {e}")
if verbose:
print(f"❌ Ошибка при генерации теста: {e}")
try:
record = collection.find_one({"_id": record_id})
if record:
print(f"📋 Полная структура записи:")
print(json.dumps(record, ensure_ascii=False, indent=2, default=str))
except:
pass
return False
finally:
if 'client' in locals():
@@ -187,33 +208,93 @@ def validate_test(test_data: Dict[str, str]) -> bool:
return True
def read_ids_from_file(file_path: str) -> list:
"""
Читает ID записей из файла.
Args:
file_path: Путь к файлу с ID записей (по одной на строку)
Returns:
Список ID записей
"""
try:
with open(file_path, 'r', encoding='utf-8') as f:
ids = [line.strip() for line in f if line.strip()]
return ids
except Exception as e:
print(f"❌ Ошибка при чтении файла {file_path}: {e}")
return []
def main():
"""Основная функция скрипта."""
parser = argparse.ArgumentParser(
description="Генератор тестов пересказов из MongoDB",
epilog="Примеры использования:\n"
" python scripts/generate_summarization_from_mongo.py --record-id 507f1f77bcf86cd799439011"
" python scripts/generate_summarization_from_mongo.py --record-id 507f1f77bcf86cd799439011\n"
" python scripts/generate_summarization_from_mongo.py --id-file ids.txt"
)
parser.add_argument(
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument(
"--record-id",
type=str,
required=True,
help="ID записи в MongoDB (обязательный параметр)"
help="ID записи в MongoDB (для обработки одной записи)"
)
group.add_argument(
"--id-file",
type=str,
help="Файл с ID записей (по одной на строку, для обработки нескольких записей)"
)
args = parser.parse_args()
print(f"🔍 Подключаюсь к MongoDB кластеру...")
print(f"📄 Извлекаю запись с ID: {args.record_id}")
print(f"💾 Сохраняю тест в: tests/summarization/")
if args.record_id:
print(f"🔍 Подключаюсь к MongoDB кластеру...")
print(f"📄 Извлекаю запись с ID: {args.record_id}")
print(f"💾 Сохраняю тест в: tests/summarization/")
success = generate_test_from_mongo_record(args.record_id)
success = generate_test_from_mongo_record(args.record_id)
if success:
print("\n✨ Готово! Тест успешно generated.")
else:
print("\nНе удалось generated тест.")
sys.exit(1)
if success:
print("\n✨ Готово! Тест успешно generated.")
else:
print("\nНе удалось generated тест.")
sys.exit(1)
elif args.id_file:
print(f"🔍 Подключаюсь к MongoDB кластеру...")
print(f"📄 Извлекаю ID записи из файла: {args.id_file}")
print(f"💾 Сохраняю тесты в: tests/summarization/")
# Читаем ID из файла
record_ids = read_ids_from_file(args.id_file)
if not record_ids:
print("❌ Файл с ID записей пуст или недействителен.")
sys.exit(1)
print(f"📊 Найдено {len(record_ids)} ID записей в файле")
print("🔄 Начинаю обработку записей...\n")
success_count = 0
error_count = 0
for i, record_id in enumerate(record_ids, 1):
print(f"[{i}/{len(record_ids)}] Обрабатываю запись: {record_id}")
success = generate_test_from_mongo_record(record_id, verbose=True)
if success:
success_count += 1
else:
error_count += 1
print() # Пустая строка для разделения логов
print(f"\n📊 Итог:")
print(f" ✅ Успешно generated: {success_count}")
print(f" ❌ Ошибки: {error_count}")
if error_count > 0:
print(f"\n⚠️ Некоторые записи были обработаны с ошибками. Проверьте логи выше.")
sys.exit(1)
else:
print("\n✨ Готово! Все тесты успешно generated.")
if __name__ == "__main__":
main()