99 lines
4.0 KiB
Python
99 lines
4.0 KiB
Python
"""
|
||
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="Human‑readable 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
|