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()