From a63137a25af70f69a30a576a19e20455b6666d0c 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 07:05:17 +0000 Subject: [PATCH] =?UTF-8?q?=D1=81=D1=8B=D1=80=D0=BE=D0=B9=20=D1=82=D0=B5?= =?UTF-8?q?=D0=BA=D1=81=D1=82=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=E2=86=92=20=D0=BF=D0=BB=D0=BE=D1=81=D0=BA=D0=B0=D1=8F=20?= =?UTF-8?q?=D0=BA=D0=B0=D1=80=D1=82=D0=BE=D1=87=D0=BA=D0=B0:=20extract=5Ft?= =?UTF-8?q?ask=5Fcard.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../extract_task_card.py | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 solutions/69dd4221f309a98be0006b2e_сырой_текст_задания___плоская_карточка/extract_task_card.py diff --git a/solutions/69dd4221f309a98be0006b2e_сырой_текст_задания___плоская_карточка/extract_task_card.py b/solutions/69dd4221f309a98be0006b2e_сырой_текст_задания___плоская_карточка/extract_task_card.py new file mode 100644 index 0000000..d428203 --- /dev/null +++ b/solutions/69dd4221f309a98be0006b2e_сырой_текст_задания___плоская_карточка/extract_task_card.py @@ -0,0 +1,85 @@ +from pathlib import Path +import os + +from pydantic import BaseModel, Field +from typing import List + +# ------------------------------ +# Модель карточки задания +# ------------------------------ +class TaskCard(BaseModel): + title: str = Field(..., description="Название задания") + subject: str = Field(..., description="Тема/область задачи") + deadline_hint: str = Field(..., description="Подсказка по дедлайну") + deliverable_type: str = Field( + ..., description="Тип сдачи (отчёт, код и т.д.)" + ) + grading_hints: List[str] = Field( + ..., description="Ключевые критерии оценки" + ) + +# ------------------------------ +# Интеграция с LangChain +# ------------------------------ +from langchain_openai import ChatOpenAI +from langchain_core.prompts import PromptTemplate +from langchain_core.output_parsers import PydanticOutputParser + +parser = PydanticOutputParser(pydantic_object=TaskCard) + +prompt_template = """ +You are an assistant that extracts structured information from a natural language description of a task. +Return the data in JSON format matching the following schema: +{format_instructions} +Input: {input_text} +""" + +prompt = PromptTemplate( + template=prompt_template, + input_variables=["input_text"], + partial_variables={"format_instructions": parser.get_format_instructions()}, +) + +# ------------------------------ +# Настройка LLM +# ------------------------------ +def get_llm() -> ChatOpenAI: + """ + Создаёт экземпляр модели OpenAI. + Ключ берётся из переменной окружения OPENAI_API_KEY. + """ + api_key = os.getenv("OPENAI_API_KEY") + if not api_key: + raise RuntimeError( + "Переменная окружения OPENAI_API_KEY не найдена. " + "Пожалуйста, установите ключ API." + ) + return ChatOpenAI(model="gpt-4o-mini", temperature=0.2, openai_api_key=api_key) + +# ------------------------------ +# Основная цепочка +# ------------------------------ +def build_chain() -> PromptTemplate: + llm = get_llm() + return prompt | llm | parser + +# ------------------------------ +# Тестовый запуск +# ------------------------------ +if __name__ == "__main__": + # Загрузка переменных окружения из .env, если файл существует + try: + from dotenv import load_dotenv + + load_dotenv(dotenv_path=Path(".env")) + except Exception: + pass # Если dotenv не установлен – просто продолжим + + raw_text = ( + "Сдайте к пятнице мини-отчёт по LangChain: 2 страницы, упор на агентов. " + "Оценка: за полноту и за пример кода." + ) + + chain = build_chain() + result = chain.invoke({"input_text": raw_text}) + print(result.model_dump(indent=4)) \ No newline at end of file