From 50bf3f76f74b50b28d9834c56d35b30c3e0ef09c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D1=80=D0=B8=D1=8F=20=D0=91=D0=B5=D1=80=D0=B4?= =?UTF-8?q?=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2=D0=B0?= Date: Wed, 27 May 2026 08:02:04 +0000 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20solutions/69dd4221f309a98be0006b2e=5F=D1=81=D1=8B?= =?UTF-8?q?=D1=80=D0=BE=D0=B9=5F=D1=82=D0=B5=D0=BA=D1=81=D1=82=5F=D0=B7?= =?UTF-8?q?=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F=5F=5F=5F=D0=BF=D0=BB=D0=BE?= =?UTF-8?q?=D1=81=D0=BA=D0=B0=D1=8F=5F=D0=BA=D0=B0=D1=80=D1=82=D0=BE=D1=87?= =?UTF-8?q?=D0=BA=D0=B0/task=5Fparser.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../task_parser.py | 104 ++++++------------ 1 file changed, 36 insertions(+), 68 deletions(-) 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