Решение задания: сырой текст задания → плоская карточка

This commit is contained in:
2026-05-21 15:41:05 +00:00
parent 344e49bf63
commit 5e2cd6fa12
@@ -0,0 +1,87 @@
import os
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
class TaskCard(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(
default_factory=list,
description=(
"Ключевые критерии оценки, упомянутые в тексте задачи (например, \"полнота\", \"пример кода\")"
),
)
def main():
# Инициализация модели (используем ключ из переменной окружения)
llm = ChatOpenAI(
model="gpt-4o-mini",
temperature=0,
)
parser = PydanticOutputParser(pydantic_object=TaskCard)
prompt_template = PromptTemplate(
template="""
Ниже приведено неформальное описание задания. Преобразуйте его в
структурированный объект TaskCard, заполнив все поля.
Текст задания:
{task_text}
Ответ должен быть строго в формате JSON, соответствующем полям модели.
Используйте только те ключи, которые описаны в модели: title,
subject, deadline_hint, deliverable_type, grading_hints.
Пример вывода:
{format_instructions}
""",
input_variables=["task_text"],
partial_variables={"format_instructions": parser.get_format_instructions()},
)
chain = prompt_template | llm | parser
# Пример входного текста
task_input = (
"Сдайте к пятнице мини-отчёт по LangChain: 2 страницы, упор на агентов. "
"Оценка: за полноту и за пример кода."
)
try:
result: TaskCard = chain.invoke({"task_text": task_input})
except Exception as exc:
print(f"Ошибка при обработке задания: {exc}")
return
# Вывод валидированного объекта
print("Валидированный объект:")
print(result.model_dump())
# Краткая человекочитаемая сводка
summary = (
f"Задача \"{result.title}\" по предмету {result.subject}. "
f"Срок сдачи: {result.deadline_hint or 'не указан'}. "
f"Тип сдаваемого материала: {result.deliverable_type}. "
f"Критерии оценки: {', '.join(result.grading_hints) if result.grading_hints else 'нет'}."
)
print("\nСводка:")
print(summary)
if __name__ == "__main__":
main()