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:
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user