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