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()