diff --git a/solutions/69dd4221f309a98be0006b2e_сырой_текст_задания___плоская_карточка/task_card.py b/solutions/69dd4221f309a98be0006b2e_сырой_текст_задания___плоская_карточка/task_card.py new file mode 100644 index 0000000..bd6e19a --- /dev/null +++ b/solutions/69dd4221f309a98be0006b2e_сырой_текст_задания___плоская_карточка/task_card.py @@ -0,0 +1,90 @@ +import os +import sys +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 + + +# 1. Модель карточки задания +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( + default_factory=list, + description="Ключевые критерии оценки, упомянутые в тексте", + ) + + +# 2. Парсер для гарантированного вывода модели +parser = PydanticOutputParser(pydantic_object=TaskCard) + +# 3. Шаблон промпта с инструкцией о формате +prompt_template = PromptTemplate( + template=""" +Вы — ассистент, который преобразует неформальное описание задания в структурированный объект. +Нужно вернуть только данные в следующем формате: + +{format_instructions} + +Текст задания: +"{task_text}" +""", + input_variables=["task_text"], + partial_variables={"format_instructions": parser.get_format_instructions()}, +) + +# 4. Конфигурация LLM +llm = ChatOpenAI( + temperature=0, + model="gpt-3.5-turbo", # можно заменить на любой доступный вариант +) + +# 5. Цепочка: промпт → LLM → парсер +chain = prompt_template | llm | parser + + +def main(): + if len(sys.argv) > 1: + task_text = " ".join(sys.argv[1:]) + else: + print("Введите описание задания (Ctrl-D для завершения):") + task_text = sys.stdin.read().strip() + + if not task_text: + print("Пустой ввод. Завершение.") + return + + # Запуск цепочки + result: TaskCard = chain.invoke({"task_text": task_text}) + + # Вывод валидированного объекта + print("\n=== Валидированный объект ===") + print(result.model_dump(indent=2)) + + # Краткая человекочитаемая сводка + summary_parts = [ + f"**Название:** {result.title}", + f"**Предмет:** {result.subject}", + f"**Срок сдачи:** {result.deadline_hint}", + f"**Тип сдаваемого материала:** {result.deliverable_type}", + ] + if result.grading_hints: + summary_parts.append( + f"**Критерии оценки:** {', '.join(result.grading_hints)}" + ) + print("\n=== Сводка ===") + print("\n".join(summary_parts)) + + +if __name__ == "__main__": + main() \ No newline at end of file