сырой текст задания → плоская карточка: README.md

This commit is contained in:
2026-05-27 06:44:18 +00:00
parent d36c1a6d9f
commit 89ada56d82
@@ -1,104 +1,124 @@
# Сырой текст задания → плоская карточка # Сырой текст задания → плоская карточка
## Описание проекта ## 📖 Описание проекта
Проект реализует **модуль разбора одной формулировки задачи** в компактную сводку (`AssignmentCard`). В рамках курса «Ассистент по учёбе» вы разрабатываете модуль, который принимает **неформальное описание задачи** (например, сообщение преподавателя в чате) и преобразует его в структурированный объект. Полученный объект можно дальше фильтровать, сохранять или передавать следующему шагу пайплайна.
Он принимает неформальное описание задания (строку или короткий абзац) и возвращает объект с полями:
| Поле | Тип | Описание | ### Что делает программа?
|------|-----|----------| - Принимает одну строку/абзац с формулировкой задания.
| `title` | `str` | Краткое название задачи | - С помощью LLM (OpenAI, Azure, Anthropic и т.д.) извлекает ключевые поля:
| `subject` | `str` | Область знаний / предмет | - `title` – название задачи
| `deadline_hint` | `str | None` | Указание срока сдачи в свободной форме (например, «к пятнице»). Если не найдено – `None`. | - `subject` – предмет / тема
| `deliverable_type` | `str` | Тип сдаваемого материала (отчёт, код, презентация и т.д.) | - `deadline_hint` – подсказка о сроке сдачи (строка в свободной форме)
| `grading_hints` | `List[str]` | Ключевые критерии оценки, перечисленные в тексте. Если не найдено – пустой список. | - `deliverable_type` – тип сдаваемого материала (отчёт, код, презентация и т.п.)
- `grading_hints` – список строк с упоминаниями оценивания
Модель работает без диалога: она получает один запрос и выдаёт один ответ. ### Почему это важно?
- Позволяет быстро структурировать входные данные без ручного парсинга.
- Делает дальнейшую обработку более надёжной и предсказуемой.
## ⚙️ Стек и установка
| Пакет | Версия (рекоменд.) |
|-------|--------------------|
| `langchain-core` | 0.2.x |
| `langchain-openai` | 0.1.x |
| `pydantic` | 2.x |
| `python-dotenv` | любой |
## Установка зависимостей
```bash ```bash
# Создайте виртуальное окружение (рекомендуется) # Создайте виртуальное окружение (рекомендовано)
python -m venv .venv python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate source .venv/bin/activate # Windows: .venv\Scripts\activate
# Установите пакеты # Установите зависимости
pip install langchain-core langchain-openai pydantic python-dotenv pip install langchain-core langchain-openai pydantic python-dotenv
``` ```
> **Важно** > **Важно**:
> Для работы с LLM необходимо задать переменные окружения: > 1. Создайте файл `.env` в корне проекта и добавьте ключи доступа к LLM, например:
> ```bash > ```dotenv
> export OPENAI_API_KEY="ваш_ключ" > OPENAI_API_KEY=sk-...
> ``` > ```
> (или добавить в `.env` файл). > 2. Если используете другую модель (Azure, Anthropic), настройте соответствующие переменные окружения согласно документации `langchain-openai`.
## Как запустить ## 📂 Структура проекта
### 1. `task_parser.py` ```
Файл содержит всю логику: модель Pydantic, шаблон запроса и функцию `parse_assignment`. project/
├── .env # Переменные окружения
```python ├── main.py # Точка входа – пример использования
from task_parser import parse_assignment ├── task_parser.py # Модуль с Pydantic‑моделью и функцией парсинга
└── README.md # Это файл
raw_text = """
Нужно написать отчёт по теме «Влияние квантовых вычислений на криптографию» до следующей среды.
Критерии оценки: оригинальность идеи, корректность расчётов, оформление в формате LaTeX.
"""
card = parse_assignment(raw_text)
print(card.json(indent=2))
``` ```
Запуск: ## 🚀 Запуск
### 1. Пример запуска через `main.py`
```bash ```bash
python - <<'PY' python main.py
from task_parser import parse_assignment
raw_text = """
Нужно написать отчёт по теме «Влияние квантовых вычислений на криптографию» до следующей среды.
Критерии оценки: оригинальность идеи, корректность расчётов, оформление в формате LaTeX.
"""
card = parse_assignment(raw_text)
print(card.json(indent=2))
PY
``` ```
### 2. Тесты (если есть) `main.py` содержит пример входного текста и выводит распарсенный объект.
```bash > **Вывод**
pytest tests/ > ```text
``` > Task(title='Составить отчёт по проекту', subject='Информатика', deadline_hint='до 15.09', deliverable_type='отчёт', grading_hints=['проверка структуры, логики и оформления'])
> ```
## Пример использования ### 2. Использование как библиотеки
```python ```python
>>> from task_parser import parse_assignment from task_parser import parse_task_text, Task
>>> raw = "Сдать презентацию по «Машинное обучение» к пятнице, оценка по структуре и содержанию." text = "Напиши код для решения задачи по алгоритмам до 20.10."
>>> card = parse_assignment(raw) task: Task = parse_task_text(text)
>>> print(card.title) print(task.title) # → 'Написать код'
Сдать презентацию по «Машинное обучение» print(task.grading_hints) # → ['проверка корректности кода', ...]
>>> print(card.subject)
«Машинное обучение»
>>> print(card.deadline_hint)
к пятнице
>>> print(card.deliverable_type)
презентация
>>> print(card.grading_hints)
['структуре', 'содержанию']
``` ```
## Что дальше ## 🧩 Как работает `parse_task_text`
- Добавить более сложные правила извлечения (например, распознавание дат).
- Интегрировать в пайплайн ассистента по учёбе.
- Писать unit‑тесты для разных сценариев.
--- 1. **Формирование запроса** – создаётся prompt, в котором описывается формат ответа (JSON).
2. **Вызов LLM** через `langchain-openai` отправляется запрос и получает JSON‑строку.
3. **Проверка схемы** – строка парсится в `pydantic.BaseModel`, гарантируя типизацию и наличие обязательных полей.
**Автор:** *[Ваше имя]* Если модель не может распарсить ответ, выбрасывается исключение с подробным сообщением.
**Дата:** 27 мая 2026 г.
## 📄 Пример входного текста
```text
"Пожалуйста, подготовьте презентацию по теме «Машинное обучение» до 30 сентября. В оценке учитываются оригинальность и глубина анализа."
```
### Ожидаемый результат (JSON)
```json
{
"title": "Подготовка презентации",
"subject": "Машинное обучение",
"deadline_hint": "до 30 сентября",
"deliverable_type": "презентация",
"grading_hints": [
"оригинальность",
"глубина анализа"
]
}
```
## 📚 Полезные ссылки
- [LangChain Docs OpenAI](https://langchain.com/docs/integrations/providers/openai)
- [Pydantic v2.0](https://docs.pydantic.dev/latest/)
- [Pythondotenv](https://pypi.org/project/python-dotenv/)
## 🤝 Вклад
Если хотите улучшить проект:
1. Форкните репозиторий.
2. Создайте ветку с вашим изменением.
3. Откройте Pull Request и опишите, что было сделано.
---
**Happy parsing!**