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