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