diff --git a/main.py b/main.py new file mode 100644 index 0000000..7706319 --- /dev/null +++ b/main.py @@ -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="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