diff --git a/solutions/сырой текст задания → плоская карточка/solution.py b/solutions/сырой текст задания → плоская карточка/solution.py new file mode 100644 index 0000000..50b1bfd --- /dev/null +++ b/solutions/сырой текст задания → плоская карточка/solution.py @@ -0,0 +1,65 @@ +from typing import List +from pydantic import BaseModel, Field +from langchain_core.prompts import PromptTemplate +from langchain_core.output_parsers import PydanticOutputParser +from langchain_openai import ChatOpenAI + + +class AssignmentCard(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() -> None: + output_parser = PydanticOutputParser(pydantic_object=AssignmentCard) + + template = PromptTemplate( + template=( + "Прочитай описание учебного задания и заполни все поля карточки.\n\n" + "Описание:\n{raw_text}\n\n" + "Верни ответ строго в JSON без лишних пояснений.\n" + "{format_instructions}" + ), + input_variables=["raw_text"], + partial_variables={ + "format_instructions": output_parser.get_format_instructions() + }, + ) + + model = ChatOpenAI(model="gpt-4o-mini", temperature=0) + + chain = template | model | output_parser + + sample = ( + "Сдайте к пятнице мини-отчёт по LangChain: 2 страницы, упор на агентов. " + "Оценка: за полноту и за пример кода." + ) + + card: AssignmentCard = chain.invoke({"raw_text": sample}) + + print("Валидированный объект:") + print(card.model_dump()) + + print("\nСводка:") + print( + f"Задание «{card.title}» по теме «{card.subject}». " + f"Сдать: {card.deliverable_type}. " + f"Дедлайн: {card.deadline_hint or 'не указан'}. " + f"Оценивается: {', '.join(card.grading_hints) if card.grading_hints else 'критерии не указаны'}." + ) + + +if __name__ == "__main__": + main() \ No newline at end of file