Files
2026-05-28 11:12:20 +00:00

112 lines
4.2 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Пример преобразования неформального описания задания в структурированный объект.
Используем:
* LangChain (core + OpenAI)
* Pydantic для типизации и проверки результата
"""
import os
from pathlib import Path
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field
# ------------------------------------------------------------------
# 1. Модель карточки задания (Pydantic)
# ------------------------------------------------------------------
class AssignmentCard(BaseModel):
title: str = Field(..., description="Краткое название задачи")
subject: str = Field(
..., description="Предмет/тема, к которой относится задание"
)
deadline_hint: str | None = Field(
None,
description="Указание дедлайна в свободной форме (например, «к пятнице»)",
)
deliverable_type: str = Field(
...,
description=(
"Тип сдачи: отчёт, код, презентация и т.п. "
"(если однотипное – перечислите без пунктов)"
),
)
grading_hints: list[str] | None = Field(
None,
description="Ключевые критерии оценки (список строк)",
)
# ------------------------------------------------------------------
# 2. Парсер и промпт
# ------------------------------------------------------------------
parser = PydanticOutputParser(pydantic_object=AssignmentCard)
prompt_template = """
Пожалуйста, преобразуйте следующее описание задания в JSON‑объект,
соответствующий схеме:
{format_instructions}
Текст задания:
"{input_text}"
"""
prompt = PromptTemplate(
template=prompt_template,
input_variables=["input_text"],
partial_variables={"format_instructions": parser.get_format_instructions()},
)
# ------------------------------------------------------------------
# 3. Модель LLM
# ------------------------------------------------------------------
llm = ChatOpenAI(temperature=0, model="gpt-4o-mini") # можно поменять модель
# Создаём цепочку: Prompt → LLM → Parser
chain = prompt | llm | parser
# ------------------------------------------------------------------
# 4. Функция «обработки» одной строки
# ------------------------------------------------------------------
def parse_assignment(text: str) -> AssignmentCard:
"""Возвращает валидированную модель из текста."""
return chain.invoke({"input_text": text})
# ------------------------------------------------------------------
# 5. Тестовый пример (можно заменить на любой другой)
# ------------------------------------------------------------------
if __name__ == "__main__":
example = (
"Сдайте к пятнице мини‑отчёт по LangChain: "
"2 страницы, упор на агентов. Оценка: за полноту и за пример кода."
)
card = parse_assignment(example)
# Выводим модель в виде JSON
print("\n=== Валидация ===")
print(card.model_dump(indent=4))
# Краткая человекочитаемая сводка
print("\n=== Сводка ===")
print(f"Тема: {card.subject}")
print(f"Название: {card.title}")
if card.deadline_hint:
print(f"Дедлайн: {card.deadline_hint}")
print(f"Сдача: {card.deliverable_type}")
if card.grading_hints:
print("Критерии оценки:")
for h in card.grading_hints:
print(f"{h}")
# ────────────────────── End of file ─────────────────────