Files
2026-06-02 06:36:27 +00:00

99 lines
4.0 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
Task: Convert raw assignment text into a flat card using LangChain.
The script defines a Pydantic model `TaskCard` and uses LangChain to prompt an LLM
to output the fields in a JSON format that can be parsed by
`PydanticOutputParser`. The result is printed as a validated object and a short
summary.
"""
from __future__ import annotations
import json
from typing import Any, Dict
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from langchain.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field
# ---------------------------------------------------------------------------
# 1. Define the data model for a task card.
# ---------------------------------------------------------------------------
class TaskCard(BaseModel):
title: str = Field(..., description="Task title")
subject: str | None = Field(None, description="Subject or topic of the task")
deadline_hint: str | None = Field(
None,
description="Humanreadable hint about when the task should be finished",
)
deliverable_type: str | None = Field(
None,
description="What kind of output is expected (e.g., code, report)",
)
grading_hints: str | None = Field(
None,
description="Hints for how the task will be graded",
)
# ---------------------------------------------------------------------------
# 2. Prompt template we ask the model to return a JSON object that matches
# TaskCard.
# ---------------------------------------------------------------------------
prompt_template = (
"You are an assistant that extracts structured information from a raw text.
Return only a JSON object with the following keys: title, subject,
deadline_hint, deliverable_type, grading_hints. Do not add any
surrounding text or comments.
Raw text:
{raw_text}
"
)
prompt = PromptTemplate.from_template(prompt_template)
# ---------------------------------------------------------------------------
# 3. LLM chain use OpenAI chat model via LangChain.
# ---------------------------------------------------------------------------
llm = ChatOpenAI(temperature=0, model_name="gpt-4o-mini")
parser = PydanticOutputParser(pydantic_object=TaskCard)
# The chain: prompt -> LLM -> parser
from langchain.chains import LLMChain
chain = LLMChain(llm=llm, prompt=prompt, output_parser=parser)
# ---------------------------------------------------------------------------
# 4. Example usage replace RAW_TEXT with the assignment description.
# ---------------------------------------------------------------------------
RAW_TEXT = """
## Цель
Научиться из одного пользовательского текста получить проверяемый набор полей (title, subject, deadline_hint, deliverable_type, grading_hints) без диалога и без «ручного» разбора строки в Python.
## Стек
- Python 3.10+
- langchain-core, langchain-openai, pydantic
- PydanticOutputParser для структурированного вывода
## Что нужно сделать
1. Описать Pydantic-модель карточки задания
2. Собрать цепочку: шаблон промпта → вызов LLM → парсер в BaseModel
3. В промпте попросить модель вернуть данные в формате для парсера
4. Вывести валидированный объект и краткую сводку
"""
if __name__ == "__main__":
# Run the chain
result: TaskCard = chain.run(raw_text=RAW_TEXT)
print("Validated TaskCard:\n", result.json(indent=2))
# Simple summary
summary = (
f"Title: {result.title}\n"
f"Subject: {result.subject or 'N/A'}\n"
f"Deadline hint: {result.deadline_hint or 'N/A'}\n"
f"Deliverable type: {result.deliverable_type or 'N/A'}\n"
f"Grading hints: {result.grading_hints or 'N/A'}"
)
print("\nSummary:\n", summary)
# End of file