This commit is contained in:
2026-06-02 06:36:27 +00:00
parent f719ee5747
commit 25312ebb38
+98
View File
@@ -0,0 +1,98 @@
"""
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