Решение задания: сырой текст задания → плоская карточка
This commit is contained in:
@@ -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()
|
||||||
Reference in New Issue
Block a user