Решение задания: сырой текст задания → плоская карточка
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