diff --git a/solutions/69dd4221f309a98be0006b2e_сырой_текст_задания___плоская_карточка/task_parser.py b/solutions/69dd4221f309a98be0006b2e_сырой_текст_задания___плоская_карточка/task_parser.py new file mode 100644 index 0000000..07e9f2d --- /dev/null +++ b/solutions/69dd4221f309a98be0006b2e_сырой_текст_задания___плоская_карточка/task_parser.py @@ -0,0 +1,111 @@ +from __future__ import annotations + +import os +from typing import List + +from dotenv import load_dotenv +from langchain_core.output_parsers import PydanticOutputParser +from langchain_core.prompts import PromptTemplate +from langchain_openai import ChatOpenAI +from pydantic import BaseModel, Field + +# --------------------------------------------------------------------------- # +# 1. Загрузка переменных окружения (ключи API и т.п.) +# --------------------------------------------------------------------------- # +load_dotenv() # загружаем .env если он есть + + +# --------------------------------------------------------------------------- # +# 2. Модель карточки задания +# --------------------------------------------------------------------------- # +class TaskCard(BaseModel): + """ + Карточка задачи, сформированная из неформального описания. + """ + + title: str = Field( + ..., + description="Краткое название задачи (например, «Мини‑отчёт по LangChain»).", + ) + subject: str | None = Field( + None, + description=( + "Тема или предмет, к которому относится задача. " + "Если не указано – оставляем пустым." + ), + ) + deadline_hint: str | None = Field( + None, + description="Указание срока сдачи в свободной форме (например, «к пятнице»).", + ) + deliverable_type: str | None = Field( + None, + description=( + "Тип сдаваемого материала – отчёт, код, презентация и т.п. " + "Если не указано – оставляем пустым." + ), + ) + grading_hints: List[str] | None = Field( + None, + description="Список ключевых критериев оценки (например, ['полнота', 'пример кода']).", + ) + + +# --------------------------------------------------------------------------- # +# 3. Настройка LLM и парсера +# --------------------------------------------------------------------------- # +llm = ChatOpenAI(temperature=0) # можно задать модель через переменную окружения + +parser = PydanticOutputParser(pydantic_object=TaskCard) + +prompt_template = PromptTemplate( + template=""" +Ниже приведено неформальное описание задания от преподавателя. +Пожалуйста, извлеките из него следующую информацию и верните её в формате JSON, +соответствующем модели TaskCard: + +{format_instructions} + +Описание: +"{input_text}" +""", + input_variables=["input_text"], + partial_variables={"format_instructions": parser.get_format_instructions()}, +) + +# --------------------------------------------------------------------------- # +# 4. Цепочка: промпт → LLM → парсер +# --------------------------------------------------------------------------- # +task_chain = prompt_template | llm | parser + + +# --------------------------------------------------------------------------- # +# 5. Демонстрация работы +# --------------------------------------------------------------------------- # +if __name__ == "__main__": + # Пример входного текста (можно заменить на любой другой) + example_text = ( + "Сдайте к пятнице мини‑отчёт по LangChain: 2 страницы, упор на агентов. " + "Оценка: за полноту и за пример кода." + ) + + # Выполняем цепочку + result = task_chain.invoke({"input_text": example_text}) + + # Выводим валидированный объект + print("\n=== Валидированная карточка задачи ===") + print(result.model_dump(indent=2)) + + # Краткая человекочитаемая сводка + print("\n=== Человекочитаемый вывод ===") + print(f"Заголовок: {result.title}") + if result.subject: + print(f"Тема: {result.subject}") + if result.deadline_hint: + print(f"Срок сдачи: {result.deadline_hint}") + if result.deliverable_type: + print(f"Тип сдаваемого материала: {result.deliverable_type}") + if result.grading_hints: + print("Критерии оценки:") + for hint in result.grading_hints: + print(f"- {hint}") \ No newline at end of file