сырой текст задания → плоская карточка: task_card.py

This commit is contained in:
2026-05-27 06:47:25 +00:00
parent 89ada56d82
commit 75b688be8d
@@ -0,0 +1,90 @@
import os
import sys
from typing import List
from pydantic import BaseModel, Field
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import PydanticOutputParser
# 1. Модель карточки задания
class TaskCard(BaseModel):
title: str = Field(..., description="Краткое название задачи")
subject: str = Field(..., description="Предмет или область знаний")
deadline_hint: str = Field(
..., description="Указание срока сдачи в свободной форме"
)
deliverable_type: str = Field(
...,
description="Тип сдаваемого материала (отчёт, код, презентация и т.д.)",
)
grading_hints: List[str] = Field(
default_factory=list,
description="Ключевые критерии оценки, упомянутые в тексте",
)
# 2. Парсер для гарантированного вывода модели
parser = PydanticOutputParser(pydantic_object=TaskCard)
# 3. Шаблон промпта с инструкцией о формате
prompt_template = PromptTemplate(
template="""
Вы — ассистент, который преобразует неформальное описание задания в структурированный объект.
Нужно вернуть только данные в следующем формате:
{format_instructions}
Текст задания:
"{task_text}"
""",
input_variables=["task_text"],
partial_variables={"format_instructions": parser.get_format_instructions()},
)
# 4. Конфигурация LLM
llm = ChatOpenAI(
temperature=0,
model="gpt-3.5-turbo", # можно заменить на любой доступный вариант
)
# 5. Цепочка: промпт → LLM → парсер
chain = prompt_template | llm | parser
def main():
if len(sys.argv) > 1:
task_text = " ".join(sys.argv[1:])
else:
print("Введите описание задания (Ctrl-D для завершения):")
task_text = sys.stdin.read().strip()
if not task_text:
print("Пустой ввод. Завершение.")
return
# Запуск цепочки
result: TaskCard = chain.invoke({"task_text": task_text})
# Вывод валидированного объекта
print("\n=== Валидированный объект ===")
print(result.model_dump(indent=2))
# Краткая человекочитаемая сводка
summary_parts = [
f"**Название:** {result.title}",
f"**Предмет:** {result.subject}",
f"**Срок сдачи:** {result.deadline_hint}",
f"**Тип сдаваемого материала:** {result.deliverable_type}",
]
if result.grading_hints:
summary_parts.append(
f"**Критерии оценки:** {', '.join(result.grading_hints)}"
)
print("\n=== Сводка ===")
print("\n".join(summary_parts))
if __name__ == "__main__":
main()