сырой текст задания → плоская карточка: README.md
This commit is contained in:
+59
-105
@@ -1,20 +1,22 @@
|
|||||||
# Task Card Extractor
|
# Сырой текст задания → Плоская карточка
|
||||||
|
|
||||||
A lightweight Python utility that transforms informal task descriptions into a **flat JSON card** containing the following fields:
|
## Описание
|
||||||
|
Данный проект реализует конвертацию «сырого» текста задания в формат **плоской карточки** (flat card). Карточка представляет собой упрощённую, визуально чистую версию исходного документа, пригодную для быстрого просмотра и дальнейшего использования в системах управления задачами или в качестве шаблона для презентаций.
|
||||||
|
|
||||||
| Field | Description |
|
## Структура проекта
|
||||||
|-------|-------------|
|
```
|
||||||
| `title` | Название задания |
|
project/
|
||||||
| `subject` | Тема/область задачи |
|
├── src/
|
||||||
| `deadline_hint` | Подсказка по дедлайну |
|
│ ├── main.py # Точка входа – скрипт конвертации
|
||||||
| `deliverable_type` | Тип сдачи (отчёт, код и т.д.) |
|
│ ├── utils.py # Вспомогательные функции (парсинг, форматирование)
|
||||||
| `grading_hints` | Ключевые критерии оценки |
|
│ └── templates/ # Шаблоны карточек в формате Markdown / HTML
|
||||||
|
├── tests/
|
||||||
|
│ └── test_main.py # Юнит‑тесты
|
||||||
|
├── requirements.txt # Зависимости проекта
|
||||||
|
└── README.md # Это файл
|
||||||
|
```
|
||||||
|
|
||||||
The extractor uses **LangChain** with an OpenAI model to parse the raw text and output a validated `TaskCard` Pydantic object.
|
## Установка зависимостей
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📦 Установка зависимостей
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Создайте виртуальное окружение (рекомендуется)
|
# Создайте виртуальное окружение (рекомендуется)
|
||||||
@@ -25,113 +27,65 @@ source .venv/bin/activate # Windows: .\.venv\Scripts\activate
|
|||||||
pip install -r requirements.txt
|
pip install -r requirements.txt
|
||||||
```
|
```
|
||||||
|
|
||||||
`requirements.txt`:
|
`requirements.txt` содержит только необходимые библиотеки, например:
|
||||||
|
|
||||||
```text
|
```text
|
||||||
langchain-core>=0.2.0
|
Jinja2>=3.0 # для шаблонизации карточек
|
||||||
langchain-openai>=0.1.0
|
Markdown>=3.4 # при необходимости конвертации Markdown в HTML
|
||||||
pydantic>=2.0
|
|
||||||
openai>=1.0 # для ChatOpenAI
|
|
||||||
```
|
```
|
||||||
|
|
||||||
> **Важно**:
|
## Запуск
|
||||||
> Установите переменную окружения `OPENAI_API_KEY` с вашим ключом OpenAI, иначе модель не сможет работать.
|
|
||||||
|
### Конвертация одного файла
|
||||||
|
```bash
|
||||||
|
python src/main.py path/to/raw_task.txt --output path/to/card.md
|
||||||
|
```
|
||||||
|
- `path/to/raw_task.txt` – путь к исходному файлу с «сырым» текстом задания.
|
||||||
|
- `--output` (необязательно) – куда сохранить результат. Если не указано, вывод будет в stdout.
|
||||||
|
|
||||||
|
### Конвертация всех файлов из каталога
|
||||||
|
```bash
|
||||||
|
python src/main.py path/to/raw_tasks/ --recursive --output-dir path/to/cards/
|
||||||
|
```
|
||||||
|
- `--recursive` обрабатывает все `.txt` файлы внутри указанного каталога и его подпапок.
|
||||||
|
- `--output-dir` – каталог, куда будут сохранены карточки.
|
||||||
|
|
||||||
|
## Пример использования
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
export OPENAI_API_KEY="sk-..."
|
# Предположим, у нас есть файл task1.txt со следующим содержанием:
|
||||||
# Windows:
|
#
|
||||||
set OPENAI_API_KEY=sk-...
|
# # Задача 1
|
||||||
|
# Описание: Написать скрипт, который конвертирует сырой текст в плоскую карточку.
|
||||||
|
# Требования:
|
||||||
|
# - Использовать Python 3.8+
|
||||||
|
# - Сохранять результат в Markdown
|
||||||
|
|
||||||
|
python src/main.py task1.txt --output card_task1.md
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
После выполнения будет создан файл `card_task1.md` со следующим содержимым:
|
||||||
|
|
||||||
## 📁 Структура проекта
|
```markdown
|
||||||
|
# Задача 1
|
||||||
|
|
||||||
| Файл | Описание |
|
**Описание:**
|
||||||
|------|----------|
|
Написать скрипт, который конвертирует сырой текст в плоскую карточку.
|
||||||
| `extract_task_card.py` | Основной скрипт, содержащий модель `TaskCard`, конфигурацию LangChain и пример запуска. |
|
|
||||||
|
|
||||||
---
|
## Требования
|
||||||
|
- Использовать Python 3.8+
|
||||||
|
- Сохранять результат в Markdown
|
||||||
|
```
|
||||||
|
|
||||||
## 🚀 Запуск
|
## Тесты
|
||||||
|
|
||||||
### 1️⃣ Простой запуск через CLI
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python extract_task_card.py "Напиши задание по теме «Алгоритмы сортировки». Дедлайн – завтра. Сдача: код + отчёт. Оценка по точности, читаемости и эффективности."
|
pytest tests/
|
||||||
```
|
```
|
||||||
|
|
||||||
Вывод будет в формате JSON:
|
Все тесты находятся в каталоге `tests/` и проверяют корректность парсинга, форматирования и генерации карточек.
|
||||||
|
|
||||||
```json
|
## Лицензия
|
||||||
{
|
MIT License – см. файл `LICENSE`.
|
||||||
"title": "Алгоритмы сортировки",
|
|
||||||
"subject": "Тема «Алгоритмы сортировки»",
|
|
||||||
"deadline_hint": "завтра",
|
|
||||||
"deliverable_type": "код + отчёт",
|
|
||||||
"grading_hints": [
|
|
||||||
"точность",
|
|
||||||
"читаемость",
|
|
||||||
"эффективность"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2️⃣ Запуск из кода
|
|
||||||
|
|
||||||
```python
|
|
||||||
from pathlib import Path
|
|
||||||
import os
|
|
||||||
|
|
||||||
# Импортируем модель и функцию извлечения
|
|
||||||
from extract_task_card import TaskCard, extract_from_text
|
|
||||||
|
|
||||||
raw = """
|
|
||||||
Напиши задание по теме «Алгоритмы сортировки». Дедлайн – завтра.
|
|
||||||
Сдача: код + отчёт. Оценка по точности, читаемости и эффективности.
|
|
||||||
"""
|
|
||||||
|
|
||||||
card = extract_from_text(raw)
|
|
||||||
print(card.json(indent=2))
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📚 Пример использования
|
|
||||||
|
|
||||||
```python
|
|
||||||
from extract_task_card import TaskCard, extract_from_text
|
|
||||||
|
|
||||||
raw_description = """
|
|
||||||
Создать программу, которая генерирует случайный массив из 1000 чисел,
|
|
||||||
сортирует его методом быстрой сортировки и выводит время выполнения.
|
|
||||||
Дедлайн – через неделю. Сдача: код + краткое описание алгоритма.
|
|
||||||
Оценка по скорости, корректности и читаемости кода.
|
|
||||||
"""
|
|
||||||
|
|
||||||
task_card = extract_from_text(raw_description)
|
|
||||||
|
|
||||||
print("Title:", task_card.title)
|
|
||||||
print("Subject:", task_card.subject)
|
|
||||||
print("Deadline hint:", task_card.deadline_hint)
|
|
||||||
print("Deliverable type:", task_card.deliverable_type)
|
|
||||||
print("Grading hints:", ", ".join(task_card.grading_hints))
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔧 Настройка модели
|
|
||||||
|
|
||||||
- **Модель**: по умолчанию используется `gpt-4o-mini`. При необходимости можно изменить в коде:
|
|
||||||
```python
|
|
||||||
llm = ChatOpenAI(model="gpt-4o", temperature=0.2)
|
|
||||||
```
|
|
||||||
- **Температура**: регулирует креативность ответа (по умолчанию 0.2).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📜 Лицензия
|
|
||||||
|
|
||||||
MIT License – свободно используйте и модифицируйте по своему усмотрению.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
Reference in New Issue
Block a user