from __future__ import annotations import os from typing import List from dotenv import load_dotenv from langchain_core.output_parsers import PydanticOutputParser from langchain_core.prompts import PromptTemplate from langchain_openai import ChatOpenAI from pydantic import BaseModel, Field # --------------------------------------------------------------------------- # # 1. Загрузка переменных окружения (ключи API и т.п.) # --------------------------------------------------------------------------- # load_dotenv() # загружаем .env если он есть # --------------------------------------------------------------------------- # # 2. Модель карточки задания # --------------------------------------------------------------------------- # class TaskCard(BaseModel): """ Карточка задачи, сформированная из неформального описания. """ title: str = Field( ..., description="Краткое название задачи (например, «Мини‑отчёт по LangChain»).", ) subject: str | None = Field( None, description=( "Тема или предмет, к которому относится задача. " "Если не указано – оставляем пустым." ), ) deadline_hint: str | None = Field( None, description="Указание срока сдачи в свободной форме (например, «к пятнице»).", ) deliverable_type: str | None = Field( None, description=( "Тип сдаваемого материала – отчёт, код, презентация и т.п. " "Если не указано – оставляем пустым." ), ) grading_hints: List[str] | None = Field( None, description="Список ключевых критериев оценки (например, ['полнота', 'пример кода']).", ) # --------------------------------------------------------------------------- # # 3. Настройка LLM и парсера # --------------------------------------------------------------------------- # llm = ChatOpenAI(temperature=0) # можно задать модель через переменную окружения parser = PydanticOutputParser(pydantic_object=TaskCard) prompt_template = PromptTemplate( template=""" Ниже приведено неформальное описание задания от преподавателя. Пожалуйста, извлеките из него следующую информацию и верните её в формате JSON, соответствующем модели TaskCard: {format_instructions} Описание: "{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 страницы, упор на агентов. " "Оценка: за полноту и за пример кода." ) # Выполняем цепочку result = task_chain.invoke({"input_text": example_text}) # Выводим валидированный объект print("\n=== Валидированная карточка задачи ===") print(result.model_dump(indent=2)) # Краткая человекочитаемая сводка print("\n=== Человекочитаемый вывод ===") print(f"Заголовок: {result.title}") if result.subject: print(f"Тема: {result.subject}") if result.deadline_hint: print(f"Срок сдачи: {result.deadline_hint}") if result.deliverable_type: print(f"Тип сдаваемого материала: {result.deliverable_type}") if result.grading_hints: print("Критерии оценки:") for hint in result.grading_hints: print(f"- {hint}")