docs: update test format documentation in README

Update documentation to reflect new TXT format with separator for summarization tests instead of JSON format. Clarify that expected field may be empty if summary generation fails.

feat: change test generation to TXT format with separator

Change test generation from JSON to TXT format with TEST_SEPARATOR. Add filename sanitization function to handle MongoDB record IDs. Update output path and file naming logic. Add attempt to generate expected summary through LLM with fallback to empty string.
This commit is contained in:
2026-01-22 20:40:41 +03:00
parent 2466f1253a
commit 2a04e6c089
21 changed files with 96 additions and 104 deletions

View File

@@ -3,7 +3,7 @@
Скрипт для генерации тестов пересказов из MongoDB.
Извлекает текст статьи из коллекции rssNotification (поле .meta.topicContent)
и генерирует тестовые данные в формате JSON для бенчмарка AI.
и генерирует тестовые данные в формате TXT для бенчмарка AI.
"""
import argparse
@@ -15,6 +15,27 @@ from typing import Dict, Optional
import pymongo
from pymongo import MongoClient
# Добавляем путь к исходникам, чтобы импортировать константы
sys.path.insert(0, str(Path(__file__).parent.parent))
from src.constants import TEST_SEPARATOR
def sanitize_filename(filename: str) -> str:
"""
Очищает строку от недопустимых символов для имени файла.
Args:
filename: Исходное имя файла
Returns:
Очищенное имя файла или пустая строка, если очистка невозможна
"""
import re
# Заменяем недопустимые символы на подчеркивание
# Допустимые символы: буквы, цифры, подчеркивание, тире, точка
sanitized = re.sub(r'[^\w\-\.]', '_', filename)
return sanitized if sanitized else filename
def connect_to_mongo() -> MongoClient:
"""Подключается к MongoDB кластеру."""
client = MongoClient(
@@ -90,29 +111,38 @@ def generate_test_from_mongo_record(record_id: str) -> bool:
print(f"📝 Итоговый текст (первые 500 символов): {article_text[:500]}")
# Формируем тест
test_data = {
"prompt": f"Summarize the following text in 1-2 sentences: '{article_text}'",
"expected": "" # Ожидаемый результат будет пустым, так как его нужно будет сгенерировать отдельно
}
# Генерируем пересказ через LLM (если доступно)
expected_summary = ""
try:
# Пытаемся сгенерировать пересказ
summary_prompt = f"""Summarize the following text in 1-2 sentences:
"{article_text}"
Provide only the summary, no additional text."""
# Если Ollama доступен, можно было бы использовать его здесь
# Для простоты оставляем пустым или можно добавить логику позже
expected_summary = ""
except:
# Если генерация не удалась, оставляем пустым
expected_summary = ""
# Создаем директорию для сохранения теста (всегда в tests/summarization)
output_path = Path("tests") / "summarization"
output_path.mkdir(parents=True, exist_ok=True)
# Находим следующий доступный номер теста
test_num = 1
while True:
test_file = output_path / f"test{test_num}.json"
if not test_file.exists():
break
test_num += 1
# Очищаем ID от недопустимых символов для имени файла
filename = sanitize_filename(record_id)
if not filename:
print(f"Не удалось создать допустимое имя файла из ID записи {record_id}")
return False
# Сохраняем тест
# Используем очищенный ID записи как имя файла
test_file = output_path / f"{filename}.txt"
# Сохраняем текст статьи и ожидаемый пересказ с разделителем
with open(test_file, "w", encoding="utf-8") as f:
json.dump(test_data, f, ensure_ascii=False, indent=2)
f.write(f"{article_text}{TEST_SEPARATOR}{expected_summary}")
print(f"✅ Создан тест tests/summarization/test{test_num}.json")
print(f"✅ Создан тест tests/summarization/{filename}.txt")
print(f" Источник: MongoDB запись {record_id}")
print(f" Текст статьи (первые 100 символов): {article_text[:100]}...")
@@ -151,6 +181,10 @@ def validate_test(test_data: Dict[str, str]) -> bool:
print("❌ Поле 'prompt' не может быть пустым")
return False
if not test_data["expected"].strip():
print("❌ Поле 'expected' не может быть пустым")
return False
return True
def main():
@@ -158,8 +192,7 @@ def main():
parser = argparse.ArgumentParser(
description="Генератор тестов пересказов из MongoDB",
epilog="Примеры использования:\n"
" python scripts/generate_summarization_from_mongo.py --record-id 507f1f77bcf86cd799439011 --output-dir tests\n"
" python scripts/generate_summarization_from_mongo.py --record-id 507f1f77bcf86cd799439011 --output-dir results"
" python scripts/generate_summarization_from_mongo.py --record-id 507f1f77bcf86cd799439011"
)
parser.add_argument(
"--record-id",
@@ -167,12 +200,6 @@ def main():
required=True,
help="ID записи в MongoDB (обязательный параметр)"
)
parser.add_argument(
"--output-dir",
type=str,
default="tests",
help="Директория для сохранения generated тестов (по умолчанию: tests)"
)
args = parser.parse_args()