сырой текст задания → плоская карточка: task_card.py
This commit is contained in:
+90
@@ -0,0 +1,90 @@
|
|||||||
|
import os
|
||||||
|
import sys
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
# 1. Модель карточки задания
|
||||||
|
class TaskCard(BaseModel):
|
||||||
|
title: str = Field(..., description="Краткое название задачи")
|
||||||
|
subject: str = Field(..., description="Предмет или область знаний")
|
||||||
|
deadline_hint: str = Field(
|
||||||
|
..., description="Указание срока сдачи в свободной форме"
|
||||||
|
)
|
||||||
|
deliverable_type: str = Field(
|
||||||
|
...,
|
||||||
|
description="Тип сдаваемого материала (отчёт, код, презентация и т.д.)",
|
||||||
|
)
|
||||||
|
grading_hints: List[str] = Field(
|
||||||
|
default_factory=list,
|
||||||
|
description="Ключевые критерии оценки, упомянутые в тексте",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# 2. Парсер для гарантированного вывода модели
|
||||||
|
parser = PydanticOutputParser(pydantic_object=TaskCard)
|
||||||
|
|
||||||
|
# 3. Шаблон промпта с инструкцией о формате
|
||||||
|
prompt_template = PromptTemplate(
|
||||||
|
template="""
|
||||||
|
Вы — ассистент, который преобразует неформальное описание задания в структурированный объект.
|
||||||
|
Нужно вернуть только данные в следующем формате:
|
||||||
|
|
||||||
|
{format_instructions}
|
||||||
|
|
||||||
|
Текст задания:
|
||||||
|
"{task_text}"
|
||||||
|
""",
|
||||||
|
input_variables=["task_text"],
|
||||||
|
partial_variables={"format_instructions": parser.get_format_instructions()},
|
||||||
|
)
|
||||||
|
|
||||||
|
# 4. Конфигурация LLM
|
||||||
|
llm = ChatOpenAI(
|
||||||
|
temperature=0,
|
||||||
|
model="gpt-3.5-turbo", # можно заменить на любой доступный вариант
|
||||||
|
)
|
||||||
|
|
||||||
|
# 5. Цепочка: промпт → LLM → парсер
|
||||||
|
chain = prompt_template | llm | parser
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
if len(sys.argv) > 1:
|
||||||
|
task_text = " ".join(sys.argv[1:])
|
||||||
|
else:
|
||||||
|
print("Введите описание задания (Ctrl-D для завершения):")
|
||||||
|
task_text = sys.stdin.read().strip()
|
||||||
|
|
||||||
|
if not task_text:
|
||||||
|
print("Пустой ввод. Завершение.")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Запуск цепочки
|
||||||
|
result: TaskCard = chain.invoke({"task_text": task_text})
|
||||||
|
|
||||||
|
# Вывод валидированного объекта
|
||||||
|
print("\n=== Валидированный объект ===")
|
||||||
|
print(result.model_dump(indent=2))
|
||||||
|
|
||||||
|
# Краткая человекочитаемая сводка
|
||||||
|
summary_parts = [
|
||||||
|
f"**Название:** {result.title}",
|
||||||
|
f"**Предмет:** {result.subject}",
|
||||||
|
f"**Срок сдачи:** {result.deadline_hint}",
|
||||||
|
f"**Тип сдаваемого материала:** {result.deliverable_type}",
|
||||||
|
]
|
||||||
|
if result.grading_hints:
|
||||||
|
summary_parts.append(
|
||||||
|
f"**Критерии оценки:** {', '.join(result.grading_hints)}"
|
||||||
|
)
|
||||||
|
print("\n=== Сводка ===")
|
||||||
|
print("\n".join(summary_parts))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Reference in New Issue
Block a user