Files

5.3 KiB
Raw Permalink Blame History

Сырой текст задания → плоская карточка

Описание проекта

В рамках курса по созданию ассистента для учебного процесса данная программа принимает неформальное описание задачи (например, сообщение преподавателя в чате или короткий абзац из сайта) и преобразует его в структурированный объект TaskCard.
Полученный объект содержит ключевые поля, которые можно использовать дальше в пайплайне: фильтрацию, хранение, передачу другим модулям.

Стек технологий

  • Python 3.10+
  • langchain-core, langchain-openai – взаимодействие с LLM
  • pydantic – типизация и валидация выходных данных
  • python-dotenv (необязательно) – загрузка переменных окружения

Установка зависимостей

# Создайте виртуальное окружение (рекомендовано)
python -m venv .venv
source .venv/bin/activate   # Windows: .venv\Scripts\activate

# Установите пакеты
pip install langchain-core langchain-openai pydantic python-dotenv

Важно
Для работы с LLM необходимо задать ключ API. Самый простой способ – создать файл .env в корне проекта:

OPENAI_API_KEY=sk-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

или экспортировать переменную окружения напрямую:

export OPENAI_API_KEY="sk-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

Как запустить

Файл task.py содержит всю логику.
Пример использования в интерактивном режиме:

# task_demo.py
from task import TaskCard, parser, llm  # импортируем готовый LLM и парсер

raw_text = """
Нужно написать отчёт по теме «Алгоритмы сортировки». Сдача до следующей недели. Оценка будет по структуре и корректности кода.
"""

# Формируем запрос к модели
prompt_template = parser.get_prompt()
prompt = prompt_template.format(input=raw_text)

# Получаем ответ от LLM
response = llm.invoke(prompt)

# Парсим в объект TaskCard
task_card = parser.parse(response)
print(task_card.json(indent=2))

Запуск:

python task_demo.py

Вывод будет примерно таким:

{
  "title": "Отчёт по алгоритмам сортировки",
  "subject": "Алгоритмы сортировки",
  "deadline_hint": "до следующей недели",
  "deliverable_type": "отчёт",
  "grading_hints": [
    "структура",
    "корректность кода"
  ]
}

Пример использования в пайплайне

# pipeline.py
from task import TaskCard, parser, llm

def process_task(raw_description: str) -> TaskCard:
    prompt = parser.get_prompt().format(input=raw_description)
    response = llm.invoke(prompt)
    return parser.parse(response)

if __name__ == "__main__":
    raw = "Написать презентацию по теме «Машинное обучение» до 15.09."
    card = process_task(raw)
    print(card.title)          # Презентация по теме «Машинное обучение»

Что делает код

  1. TaskCard – Pydantic‑модель, описывающая структуру карточки задания.
  2. PydanticOutputParser – обёртка, которая формирует запрос к LLM и парсит JSON‑ответ в TaskCard.
  3. Внутри task.py создаётся объект LLM (ChatOpenAI) с использованием ключа из переменных окружения.
  4. При вызове parser.parse() модель генерирует ответ в формате, совместимом с Pydantic, и парсер преобразует его в экземпляр TaskCard.

Тесты

Для быстрой проверки можно написать простые unit‑тесты:

pip install pytest
pytest tests/

(В проекте пока нет тестов – их добавьте по необходимости.)

FAQ

Вопрос Ответ
Как изменить модель? Измените параметры ChatOpenAI в task.py.
Что делать, если LLM не возвращает валидный JSON? Попробуйте добавить в шаблон более строгие инструкции или использовать parser.get_prompt() с параметром strict=True.
Можно ли использовать другую LLM (например, Gemini)? Да – замените импорт и объект ChatOpenAI на соответствующий клиент.

Лицензия

MIT © 2026