diff --git a/solutions/69dd4221f309a98be0006b2e_сырой_текст_задания___плоская_карточка/solution.py b/solutions/69dd4221f309a98be0006b2e_сырой_текст_задания___плоская_карточка/solution.py new file mode 100644 index 0000000..d00935d --- /dev/null +++ b/solutions/69dd4221f309a98be0006b2e_сырой_текст_задания___плоская_карточка/solution.py @@ -0,0 +1,87 @@ +import os +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 + +class TaskCard(BaseModel): + """Модель карточки задания.""" + + title: str = Field(..., description="Краткое название задачи") + subject: str = Field(..., description="Предмет или область знаний") + deadline_hint: str | None = Field( + None, + description=( + "Указание срока сдачи в свободной форме (например, \"к пятнице\")" + ), + ) + deliverable_type: str = Field( + ..., description="Тип сдаваемого материала (отчёт, код и т.д.)" + ) + grading_hints: List[str] | None = Field( + default_factory=list, + description=( + "Ключевые критерии оценки, упомянутые в тексте задачи (например, \"полнота\", \"пример кода\")" + ), + ) + +def main(): + # Инициализация модели (используем ключ из переменной окружения) + llm = ChatOpenAI( + model="gpt-4o-mini", + temperature=0, + ) + + parser = PydanticOutputParser(pydantic_object=TaskCard) + + prompt_template = PromptTemplate( + template=""" +Ниже приведено неформальное описание задания. Преобразуйте его в +структурированный объект TaskCard, заполнив все поля. + +Текст задания: +{task_text} + +Ответ должен быть строго в формате JSON, соответствующем полям модели. +Используйте только те ключи, которые описаны в модели: title, +subject, deadline_hint, deliverable_type, grading_hints. + +Пример вывода: +{format_instructions} +""", + input_variables=["task_text"], + partial_variables={"format_instructions": parser.get_format_instructions()}, + ) + + chain = prompt_template | llm | parser + + # Пример входного текста + task_input = ( + "Сдайте к пятнице мини-отчёт по LangChain: 2 страницы, упор на агентов. " + "Оценка: за полноту и за пример кода." + ) + + try: + result: TaskCard = chain.invoke({"task_text": task_input}) + except Exception as exc: + print(f"Ошибка при обработке задания: {exc}") + return + + # Вывод валидированного объекта + print("Валидированный объект:") + print(result.model_dump()) + + # Краткая человекочитаемая сводка + summary = ( + f"Задача \"{result.title}\" по предмету {result.subject}. " + f"Срок сдачи: {result.deadline_hint or 'не указан'}. " + f"Тип сдаваемого материала: {result.deliverable_type}. " + f"Критерии оценки: {', '.join(result.grading_hints) if result.grading_hints else 'нет'}." + ) + print("\nСводка:") + print(summary) + +if __name__ == "__main__": + main()