Compare commits
6 Commits
feature/te
...
feature/ex
| Author | SHA1 | Date | |
|---|---|---|---|
| d9b4f19af3 | |||
| d4ee76948f | |||
| cf54bc2246 | |||
| a67bdbfaa4 | |||
| f4a376ff4b | |||
| ba96b3e633 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,5 +1,5 @@
|
||||
# Local credentials and secrets
|
||||
credentials.txt
|
||||
credentials.json
|
||||
|
||||
# Python/runtime artifacts (for the upcoming bot implementation)
|
||||
__pycache__/
|
||||
|
||||
14
README.md
14
README.md
@@ -1,6 +1,6 @@
|
||||
# Акылдаш — бот-секретарь
|
||||
|
||||
Версия: `0.2.0`
|
||||
Версия: `0.2.1`
|
||||
|
||||
Бот сохраняет сообщения разрешённых тем Telegram в локальную SQLite-базу и
|
||||
выгружает обсуждения в Markdown. Внешние Python-зависимости не требуются.
|
||||
@@ -18,8 +18,10 @@ export TELEGRAM_ALLOWED_THREAD_IDS='0,2,4,6,8'
|
||||
python3 bot.py
|
||||
```
|
||||
|
||||
Доступные команды: `/help`, `/status`, `/export [дней]`, `/export все`.
|
||||
Доступные команды: `/help`, `/status`, `/export`.
|
||||
Экспорт доступен только пользователю с Telegram ID из `TELEGRAM_OWNER_ID`.
|
||||
Первый `/export` выгружает всю сохранённую тему, последующие — сообщения после
|
||||
предыдущей успешно созданной отсечки.
|
||||
Markdown публикуется в теме `TELEGRAM_REPORT_THREAD_ID`, а в исходной теме
|
||||
остаётся отсечка со ссылкой и общим хэштегом отчёта.
|
||||
|
||||
@@ -33,6 +35,12 @@ Markdown публикуется в теме `TELEGRAM_REPORT_THREAD_ID`, а в
|
||||
python3 -m unittest -v
|
||||
```
|
||||
|
||||
## Synology
|
||||
|
||||
Контейнер `akyldash-bot` работает на образе `python:3.11-slim` с политикой
|
||||
перезапуска `unless-stopped`. Постоянные данные находятся в
|
||||
`/volume1/docker/akyldash/data`.
|
||||
|
||||
---
|
||||
|
||||
Акылдаш v0.2.0
|
||||
Акылдаш v0.2.1
|
||||
|
||||
@@ -276,57 +276,59 @@ docs/
|
||||
|
||||
## 9. Этапы реализации
|
||||
|
||||
Обозначения: `[x]` — выполнено, `[ ]` — ещё не выполнено.
|
||||
|
||||
### Этап 0. Границы и правила
|
||||
|
||||
- утвердить назначение Telegram, Git, бота и ChatGPT;
|
||||
- выбрать темы, которые бот слушает;
|
||||
- определить, что можно собирать автоматически;
|
||||
- определить правила обработки персональных и конфиденциальных данных;
|
||||
- определить формат решений, задач и экспортов.
|
||||
- [x] утвердить назначение Telegram, Git, бота и ChatGPT;
|
||||
- [x] выбрать темы, которые бот слушает;
|
||||
- [x] определить, что можно собирать автоматически;
|
||||
- [x] определить правила обработки персональных и конфиденциальных данных;
|
||||
- [x] определить формат решений, задач и экспортов.
|
||||
|
||||
### Этап 1. Рабочая Telegram-группа
|
||||
|
||||
- создать супергруппу и темы;
|
||||
- подготовить закреплённые сообщения;
|
||||
- создать первоначальный FAQ;
|
||||
- согласовать правила обсуждений и фиксации решений.
|
||||
- [x] создать супергруппу и темы;
|
||||
- [x] подготовить и закрепить приветствие с навигацией;
|
||||
- [x] создать первоначальную библиотеку практик работы с ИИ;
|
||||
- [x] согласовать правила обсуждений и фиксации решений.
|
||||
|
||||
### Этап 2. Бот-архиватор
|
||||
|
||||
- реализовать приём сообщений;
|
||||
- сохранить метаданные и вложения;
|
||||
- добавить ручную отметку для экспорта;
|
||||
- сформировать Markdown-экспорт;
|
||||
- проверить работу с темами и ответами.
|
||||
- [x] реализовать приём сообщений;
|
||||
- [x] сохранять сообщения и метаданные вложений;
|
||||
- [ ] добавить ручную отметку отдельных сообщений для экспорта;
|
||||
- [x] сформировать Markdown-экспорт;
|
||||
- [x] проверить работу с темами и ответами.
|
||||
|
||||
### Этап 3. Уведомления
|
||||
|
||||
- подключить события Gitea;
|
||||
- настроить фильтрацию;
|
||||
- направлять уведомления в отдельную тему;
|
||||
- добавить напоминания о задачах и сроках.
|
||||
- [ ] подключить события Gitea;
|
||||
- [ ] настроить фильтрацию;
|
||||
- [ ] направлять уведомления в отдельную тему;
|
||||
- [ ] добавить напоминания о задачах и сроках.
|
||||
|
||||
### Этап 4. ИИ-подготовка без API
|
||||
|
||||
- добавить шаблоны запросов для анализа;
|
||||
- создавать готовые файлы для загрузки в ChatGPT;
|
||||
- добавить возврат отчёта в Telegram;
|
||||
- проверить несколько реальных обсуждений.
|
||||
- [ ] добавить шаблоны запросов для анализа;
|
||||
- [x] создавать готовые файлы для загрузки в ChatGPT;
|
||||
- [ ] добавить возврат отчёта в Telegram;
|
||||
- [ ] проверить несколько реальных обсуждений.
|
||||
|
||||
### Этап 5. Связка с Git/Gitea
|
||||
|
||||
- подготовить структуру документации;
|
||||
- настроить ссылки на задачи, PR и документы;
|
||||
- определить процесс переноса подтверждённых решений в Git;
|
||||
- добавить сценарии обновления документации через ИИ.
|
||||
- [x] подготовить структуру документации;
|
||||
- [ ] настроить ссылки на задачи, PR и документы;
|
||||
- [x] определить процесс переноса подтверждённых решений в Git;
|
||||
- [ ] добавить сценарии обновления документации через ИИ.
|
||||
|
||||
### Этап 6. Улучшение по фактическому использованию
|
||||
|
||||
- удалить невостребованные функции;
|
||||
- расширить FAQ реальными сценариями команды;
|
||||
- улучшить формат отчётов;
|
||||
- добавить новые уведомления только при наличии потребности;
|
||||
- оценить необходимость API и автоматического ИИ-анализа.
|
||||
- [ ] удалить невостребованные функции;
|
||||
- [ ] расширить библиотеку практик реальными сценариями команды;
|
||||
- [ ] улучшить формат отчётов;
|
||||
- [ ] добавить новые уведомления только при наличии потребности;
|
||||
- [ ] оценить необходимость API и автоматического ИИ-анализа.
|
||||
|
||||
---
|
||||
|
||||
@@ -393,3 +395,7 @@ Git сохраняет актуальную версию
|
||||
```
|
||||
|
||||
Цель инфраструктуры — не заставить специалистов изучать больше технологий, а сделать технологии удобным продолжением их профессиональной работы.
|
||||
|
||||
---
|
||||
|
||||
Акылдаш v0.2.1
|
||||
|
||||
61
bot.py
61
bot.py
@@ -18,7 +18,7 @@ from zoneinfo import ZoneInfo, ZoneInfoNotFoundError
|
||||
|
||||
|
||||
APP_NAME = "Акылдаш"
|
||||
APP_VERSION = "0.2.0"
|
||||
APP_VERSION = "0.2.1"
|
||||
FOOTER = f"{APP_NAME} v{APP_VERSION}"
|
||||
|
||||
|
||||
@@ -146,6 +146,29 @@ def next_update_id(connection: sqlite3.Connection) -> int:
|
||||
return int(row["value"]) if row else 0
|
||||
|
||||
|
||||
def export_checkpoint(
|
||||
connection: sqlite3.Connection, chat_id: int, thread_id: int
|
||||
) -> int:
|
||||
row = connection.execute(
|
||||
"SELECT value FROM state WHERE key = ?",
|
||||
(f"export_checkpoint:{chat_id}:{thread_id}",),
|
||||
).fetchone()
|
||||
return int(row["value"]) if row else 0
|
||||
|
||||
|
||||
def save_export_checkpoint(
|
||||
connection: sqlite3.Connection, chat_id: int, thread_id: int, message_id: int
|
||||
) -> None:
|
||||
with connection:
|
||||
connection.execute(
|
||||
"""
|
||||
INSERT INTO state (key, value) VALUES (?, ?)
|
||||
ON CONFLICT (key) DO UPDATE SET value = excluded.value
|
||||
""",
|
||||
(f"export_checkpoint:{chat_id}:{thread_id}", str(message_id)),
|
||||
)
|
||||
|
||||
|
||||
def telegram_request(
|
||||
config: Config, method: str, payload: dict, timeout: int = 65
|
||||
) -> object:
|
||||
@@ -248,10 +271,14 @@ def export_markdown(
|
||||
thread_id: int,
|
||||
days: int | None,
|
||||
now: int | None = None,
|
||||
after_message_id: int | None = None,
|
||||
) -> str:
|
||||
parameters: list[int] = [config.chat_id, thread_id]
|
||||
condition = ""
|
||||
if days is not None:
|
||||
if after_message_id is not None:
|
||||
condition = " AND message_id > ?"
|
||||
parameters.append(after_message_id)
|
||||
elif days is not None:
|
||||
condition = " AND sent_at >= ?"
|
||||
parameters.append((now or int(time.time())) - days * 86400)
|
||||
rows = connection.execute(
|
||||
@@ -263,7 +290,14 @@ def export_markdown(
|
||||
parameters,
|
||||
).fetchall()
|
||||
|
||||
period = "за всё время" if days is None else f"за последние {days} дн."
|
||||
if after_message_id is not None:
|
||||
period = (
|
||||
"с начала архива"
|
||||
if after_message_id == 0
|
||||
else "после предыдущей отсечки"
|
||||
)
|
||||
else:
|
||||
period = "за всё время" if days is None else f"за последние {days} дн."
|
||||
lines = [
|
||||
"# Обсуждение",
|
||||
"",
|
||||
@@ -328,8 +362,7 @@ def handle_command(
|
||||
message,
|
||||
"Я сохраняю обсуждения этой группы.\n"
|
||||
"/status — количество сохранённых сообщений\n"
|
||||
"/export [дней] — экспорт текущей темы за 7 дней или указанный срок\n"
|
||||
"/export все — экспорт текущей темы целиком",
|
||||
"/export — экспорт текущей темы после предыдущей отсечки",
|
||||
)
|
||||
elif command == "/status":
|
||||
topic_count = connection.execute(
|
||||
@@ -349,11 +382,22 @@ def handle_command(
|
||||
send_text(config, message, "Экспорт доступен только владельцу бота.")
|
||||
return
|
||||
try:
|
||||
days = parse_export_days(parts)
|
||||
days = parse_export_days(parts) if len(parts) > 1 else None
|
||||
except (ValueError, IndexError):
|
||||
send_text(config, message, "Использование: /export [1–3650|все]")
|
||||
return
|
||||
markdown = export_markdown(connection, config, thread_id, days)
|
||||
checkpoint = (
|
||||
None
|
||||
if len(parts) > 1
|
||||
else export_checkpoint(connection, config.chat_id, thread_id)
|
||||
)
|
||||
markdown = export_markdown(
|
||||
connection,
|
||||
config,
|
||||
thread_id,
|
||||
days,
|
||||
after_message_id=checkpoint,
|
||||
)
|
||||
stamp = datetime.now(config.timezone).strftime("%Y%m%d-%H%M")
|
||||
report_tag = f"#report_{message['message_id']}"
|
||||
report = send_document(
|
||||
@@ -373,6 +417,9 @@ def handle_command(
|
||||
f"Отчёт: {message_link(config.chat_id, report['message_id'])}\n"
|
||||
"━━━━━━━━━━━━━━━━",
|
||||
)
|
||||
save_export_checkpoint(
|
||||
connection, config.chat_id, thread_id, int(message["message_id"])
|
||||
)
|
||||
|
||||
|
||||
def run() -> None:
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
# Статус проекта
|
||||
|
||||
Последняя проверка: 2026-08-02
|
||||
Последняя проверка: 2026-08-03
|
||||
Назначение документа: быстро восстановить контекст проекта для участников команды и будущих агентов.
|
||||
|
||||
Версия приложения: `0.2.0`
|
||||
Версия приложения: `0.2.1`
|
||||
|
||||
## Краткий итог
|
||||
|
||||
Telegram-инфраструктура и первая версия бота-секретаря подготовлены. Бот сохраняет сообщения разрешённых тем в SQLite, переживает перезапуск и экспортирует обсуждения в Markdown.
|
||||
Telegram-инфраструктура и первая версия бота-секретаря подготовлены. Бот сохраняет сообщения разрешённых тем в SQLite, экспортирует обсуждения в Markdown и постоянно запущен в Container Manager на Synology.
|
||||
|
||||
Ближайшая цель — проверить полный цикл на реальном обсуждении и подготовить постоянный запуск бота.
|
||||
Ближайшая цель — 2026-08-04 зафиксировать MVP с командой, настроить резервное копирование SQLite и затем проверить полный рабочий цикл на реальном обсуждении.
|
||||
|
||||
## Уже сделано
|
||||
|
||||
@@ -27,11 +27,12 @@ Telegram-инфраструктура и первая версия бота-се
|
||||
|
||||
| Тема | `message_thread_id` | Состояние |
|
||||
|---|---:|---|
|
||||
| Общее | отсутствует | стандартная тема |
|
||||
| Общее | отсутствует | приветствие закреплено, тема закрыта |
|
||||
| MVP | `2` | подтверждено тестовым сообщением |
|
||||
| Решения | `4` | подтверждено тестовым сообщением |
|
||||
| Обсуждение | `6` | подтверждено тестовым сообщением |
|
||||
| Работа с ИИ | `8` | подтверждено тестовым сообщением |
|
||||
| Работа с ИИ | `8` | материалы опубликованы, тема закрыта |
|
||||
| Отчеты | `37` | экспорт проверен, тема закрыта |
|
||||
|
||||
### Документация и правила
|
||||
|
||||
@@ -40,28 +41,39 @@ Telegram-инфраструктура и первая версия бота-се
|
||||
- В MVP не входит автоматический вызов API языковой модели.
|
||||
- Анализ экспортов выполняется вручную в обычном ChatGPT.
|
||||
- Telegram используется как рабочий штаб, Git/Gitea — как источник утверждённых материалов.
|
||||
- Подготовлены и опубликованы краткие навыки работы с ИИ для начинающих.
|
||||
- В `Общее` опубликовано и закреплено приветствие с назначением тем и описанием бота.
|
||||
|
||||
### Доступы
|
||||
|
||||
- Локальные доступы находятся в `credentials.txt`.
|
||||
- `credentials.txt` добавлен в `.gitignore`.
|
||||
- Локальные доступы находятся в `credentials.json`.
|
||||
- `credentials.json` добавлен в `.gitignore`.
|
||||
- Секреты нельзя добавлять в Git, логи, экспорты или сообщения бота.
|
||||
|
||||
### Репозиторий и приложение
|
||||
|
||||
- Реализован бот-секретарь версии `0.2.0` без внешних Python-зависимостей.
|
||||
- Реализован бот-секретарь версии `0.2.1` без внешних Python-зависимостей.
|
||||
- Сообщения и полные Telegram-метаданные сохраняются в SQLite.
|
||||
- Добавлены команды `/help`, `/status`, `/export [дней]` и `/export все`.
|
||||
- Добавлены команды `/help`, `/status` и `/export`.
|
||||
- Экспорт доступен только владельцу, указанному в `TELEGRAM_OWNER_ID`.
|
||||
- Первый `/export` охватывает всю сохранённую тему, последующие начинаются после последней успешно созданной отсечки.
|
||||
- Отчёты публикуются в закрытой теме `Отчеты` (`message_thread_id=37`).
|
||||
- Исходное обсуждение завершается заметной отсечкой со ссылкой и хэштегом отчёта.
|
||||
- Локальный Git-репозиторий восстановлен и привязан к Gitea.
|
||||
|
||||
## Пока не сделано
|
||||
- Бот развёрнут в Container Manager на Synology; автозапуск после перезапуска менеджера проверен.
|
||||
|
||||
### Развёртывание
|
||||
|
||||
- Не настроены Docker-файлы для Synology.
|
||||
- Бот постоянно запущен на Synology в контейнере `akyldash-bot`.
|
||||
- Используется официальный образ `python:3.11-slim` и long polling.
|
||||
- Контейнер работает без root, с read-only root filesystem и политикой `unless-stopped`.
|
||||
- Код, закрытый env-файл и SQLite хранятся в `/volume1/docker/akyldash`.
|
||||
|
||||
## Пока не сделано
|
||||
|
||||
### Развёртывание и сопровождение
|
||||
|
||||
- Docker-конфигурация развёртывания не хранится в репозитории.
|
||||
- Не настроен CI/CD.
|
||||
|
||||
### Хранилище
|
||||
@@ -79,14 +91,13 @@ Telegram-инфраструктура и первая версия бота-се
|
||||
|
||||
### Группа и рабочий процесс
|
||||
|
||||
- Не подготовлены закреплённые сообщения с правилами тем.
|
||||
- Не проверены сценарии закрытия темы `MVP` после фиксации состава первой версии.
|
||||
- Не настроены уведомления Gitea.
|
||||
- Не проведён полный пользовательский тест: сообщение → сохранение → экспорт → анализ в ChatGPT → возврат отчёта.
|
||||
|
||||
## Важные неизвестные
|
||||
|
||||
Перед реализацией постоянного развёртывания нужно получить или принять решения по следующим вопросам:
|
||||
По мере реального использования нужно принять решения по следующим вопросам:
|
||||
|
||||
1. Адрес и параметры PostgreSQL для разработки и Synology.
|
||||
2. Правила хранения и удаления сообщений и вложений.
|
||||
@@ -94,24 +105,34 @@ Telegram-инфраструктура и первая версия бота-се
|
||||
|
||||
## Следующий этап
|
||||
|
||||
### Проверка бота-секретаря
|
||||
### Фиксация MVP и проверка полного цикла
|
||||
|
||||
Рекомендуемый порядок:
|
||||
|
||||
1. Запустить бота с рабочими переменными окружения.
|
||||
2. Отправить в разрешённую тему текст, ответ, правку сообщения и вложение.
|
||||
3. Проверить `/status`, `/export 1` и `/export все`.
|
||||
4. Перезапустить процесс и убедиться, что сообщения не дублируются.
|
||||
5. После проверки подготовить постоянный запуск на Synology.
|
||||
1. Настроить резервное копирование `/volume1/docker/akyldash/data`.
|
||||
2. Зафиксировать состав MVP с командой и закрыть тему `MVP`.
|
||||
3. Провести одно реальное обсуждение с ответами, правками и вложением.
|
||||
4. Экспортировать обсуждение и вручную проанализировать Markdown в ChatGPT.
|
||||
5. Вернуть подтверждённый итог в тему `Решения` и зафиксировать его в Git/Gitea.
|
||||
6. Записать обнаруженные неудобства и только после этого выбирать следующую доработку.
|
||||
|
||||
## История изменений статуса
|
||||
|
||||
### 2026-08-03
|
||||
|
||||
- Экспорт без параметров переведён с периода в семь дней на диапазон после предыдущей отсечки.
|
||||
- Бот развёрнут в Container Manager на Synology; автозапуск проверен перезапуском.
|
||||
- В теме `Работа с ИИ` опубликована первоначальная библиотека практик и отдельный материал о безопасной работе с Codex.
|
||||
- В `Общее` опубликовано и закреплено приветствие; тема закрыта для сообщений.
|
||||
- Локальный файл доступов переведён из `credentials.txt` в `credentials.json`.
|
||||
|
||||
### 2026-08-02
|
||||
|
||||
- Экспорт ограничен Telegram ID владельца бота.
|
||||
- Технические ответы на корневое сообщение темы исключены из Markdown.
|
||||
- Экспорт перенесён в тему `Отчеты`, добавлены отсечки и навигационные хэштеги.
|
||||
- Проверена живая публикация отчёта и отсечки через Telegram Bot API.
|
||||
- Бот версии `0.2.0` развёрнут в Container Manager на Synology.
|
||||
- Версия приложения обновлена до `0.2.0`.
|
||||
|
||||
### 2026-08-01
|
||||
@@ -127,3 +148,7 @@ Telegram-инфраструктура и первая версия бота-се
|
||||
- Определены ID тем: `2`, `4`, `6`, `8`.
|
||||
- Подтверждено отсутствие webhook.
|
||||
- Зафиксировано, что код бота и хранилище ещё не реализованы.
|
||||
|
||||
---
|
||||
|
||||
Акылдаш v0.2.1
|
||||
|
||||
@@ -54,9 +54,9 @@ Telegram не является хранилищем проекта, а бот и
|
||||
## Граница между ботом и ИИ
|
||||
|
||||
- Бот без обращения к API языковой модели полностью выполняет сбор сообщений, сортировку, добавление метаданных, подготовку вложений и формирование Markdown-экспорта.
|
||||
- Бот добавляет к экспорту готовую инструкцию для ручной загрузки в обычный ChatGPT.
|
||||
- На следующем этапе бот должен добавлять к экспорту готовую инструкцию для ручной загрузки в обычный ChatGPT.
|
||||
- Выделение решений, задач, рисков, противоречий и открытых вопросов выполняется в ChatGPT вручную через подписку участника.
|
||||
- Бот может принять возвращённый человеком отчёт, опубликовать его в Telegram и связать с исходным обсуждением.
|
||||
- На следующем этапе бот должен принимать возвращённый человеком отчёт, публиковать его в Telegram и связывать с исходным обсуждением.
|
||||
- Бот не выдаёт эвристический или шаблонный результат за выполненный ИИ-анализ. Поиск ключевых слов и ручные метки допустимы только как вспомогательная навигация.
|
||||
|
||||
## Техническое замечание о правах тем
|
||||
@@ -65,13 +65,17 @@ Telegram позволяет запретить пользователям отп
|
||||
|
||||
## Инфраструктурные предпосылки
|
||||
|
||||
- Доступы для настройки находятся в `credentials.txt`; секреты из этого файла нельзя включать в Git, логи CI/CD, экспорт Telegram или сообщения бота.
|
||||
- Доступы для настройки находятся в локальном `credentials.json`; секреты из этого файла нельзя включать в Git, логи CI/CD, экспорт Telegram или сообщения бота.
|
||||
- Для проекта можно создать открытый репозиторий в Gitea.
|
||||
- В Gitea необходимо настроить защиту `main`: прямые push запрещены, изменения проходят через pull request и проверки CI/CD.
|
||||
- Развёртывание бота планируется на Docker-инфраструктуре Synology.
|
||||
- Бот развёрнут в Container Manager на Synology с постоянным SQLite-томом и политикой автоперезапуска; конфигурацию развёртывания ещё предстоит зафиксировать в репозитории.
|
||||
- PostgreSQL будет использоваться как хранилище бота; параметры доступа к базе будут предоставлены отдельно.
|
||||
- Почта может использоваться как дополнительный канал доставки файлов и отчётов, но не как основное хранилище.
|
||||
|
||||
## Критерий завершения Stage 0
|
||||
|
||||
Границы MVP, состав тем и правила работы с данными подтверждены. Остаётся реализовать жизненный цикл тем и экспортов, после чего можно проектировать схему хранения и команды бота, не меняя назначение первой версии по ходу реализации.
|
||||
Критерий выполнен: границы MVP зафиксированы, темы созданы, первая версия бота и экспортов реализована. Полный рабочий цикл будет принят командой после проверки на реальном обсуждении.
|
||||
|
||||
---
|
||||
|
||||
Акылдаш v0.2.1
|
||||
|
||||
183
docs/team/ai-skills-for-beginners.md
Normal file
183
docs/team/ai-skills-for-beginners.md
Normal file
@@ -0,0 +1,183 @@
|
||||
# Важные навыки работы с ИИ для начинающих
|
||||
|
||||
Каждый раздел ниже — отдельное готовое сообщение для темы `Работа с ИИ`.
|
||||
Текст можно публиковать без заголовков этого файла: название, хэштеги и пояснение уже входят в сообщение.
|
||||
|
||||
## 1. Ставьте задачу через результат
|
||||
|
||||
#работа_с_ии #промпт #цель
|
||||
|
||||
Пишите не тему, а желаемый результат. Вместо «расскажи о договоре» — «составь краткий список рисков договора для руководителя». Чем яснее результат, тем меньше случайных ответов.
|
||||
|
||||
## 2. Давайте нужный контекст
|
||||
|
||||
#работа_с_ии #контекст #источники
|
||||
|
||||
Укажите, для кого готовится результат, что уже известно и какие файлы или сообщения использовать. Не заставляйте ИИ угадывать факты, которые можно дать сразу.
|
||||
|
||||
## 3. Называйте ограничения
|
||||
|
||||
#работа_с_ии #ограничения #точность
|
||||
|
||||
Сразу укажите важные рамки: объём, срок, язык, допустимые источники и что нельзя менять. Пример: «до одной страницы, только по приложенным документам, без вымышленных данных».
|
||||
|
||||
## 4. Задавайте формат ответа
|
||||
|
||||
#работа_с_ии #формат #результат
|
||||
|
||||
Скажите, в каком виде нужен ответ: список, таблица, письмо, план или Markdown. Укажите желаемую длину и аудиторию. Это полезнее просьбы «ответь красиво».
|
||||
|
||||
## 5. Определяйте, что значит «готово»
|
||||
|
||||
#работа_с_ии #критерии #готовность
|
||||
|
||||
Добавьте проверяемый критерий завершения: «все риски связаны с пунктами договора», «у каждой задачи есть ответственный и срок», «тесты проходят». ИИ должен понимать финиш задачи.
|
||||
|
||||
## 6. Показывайте пример хорошего результата
|
||||
|
||||
#работа_с_ии #пример #качество
|
||||
|
||||
Если важны стиль или структура, приложите короткий образец. Один хороший пример обычно работает лучше длинного описания вроде «сделай профессионально».
|
||||
|
||||
## 7. Просите уточнить неясное
|
||||
|
||||
#работа_с_ии #уточнение #вопросы
|
||||
|
||||
Если задача допускает разные трактовки, напишите: «Сначала задай до трёх важных вопросов, затем приступай». Это снижает риск получить уверенный ответ не на тот вопрос.
|
||||
|
||||
## 8. Отделяйте факты от предположений
|
||||
|
||||
#работа_с_ии #факты #проверка
|
||||
|
||||
Просите отдельно отмечать подтверждённые факты, выводы и неизвестные данные. Для актуальной информации требуйте ссылки и дату проверки. Уверенный тон не является доказательством.
|
||||
|
||||
## 9. Для сложной задачи сначала просите план
|
||||
|
||||
#работа_с_ии #план #сложная_задача
|
||||
|
||||
Сначала попросите изучить материалы и предложить короткий план. После вашего подтверждения ИИ выполняет работу. Так ошибки направления обнаруживаются до больших изменений.
|
||||
|
||||
## 10. Делите большую работу на этапы
|
||||
|
||||
#работа_с_ии #этапы #контроль
|
||||
|
||||
Разбивайте задачу на небольшие проверяемые результаты: анализ → проект → проверка → финал. Подтверждайте важные этапы отдельно, особенно перед публикацией или изменением данных.
|
||||
|
||||
## 11. Используйте персональные инструкции
|
||||
|
||||
#работа_с_ии #персональные_инструкции #настройка
|
||||
|
||||
Персональные инструкции — ваши постоянные предпочтения для всех чатов: язык, стиль, желаемая краткость и способ объяснения. Не храните там пароли и правила одного конкретного проекта.
|
||||
|
||||
## 12. Настраивайте инструкции проекта
|
||||
|
||||
#работа_с_ии #инструкции_проекта #проект
|
||||
|
||||
Для каждого проекта отдельно зафиксируйте цель, термины, источники истины, правила работы и критерии готовности. В ChatGPT используйте инструкции проекта, в Codex — репозиторный `AGENTS.md`.
|
||||
|
||||
## 13. Делайте инструкции короткими и проверяемыми
|
||||
|
||||
#работа_с_ии #инструкции #порядок
|
||||
|
||||
Пишите конкретно: «перед изменением создай ветку», а не «работай правильно». Удаляйте устаревшие и противоречивые правила. Добавляйте новое правило после повторяющейся ошибки, а не заранее.
|
||||
|
||||
## 14. Один чат — один понятный результат
|
||||
|
||||
#работа_с_ии #чат #контекст
|
||||
|
||||
В одном чате держите одну связанную цель. Для отдельной задачи начинайте новый чат; для настоящего ответвления создавайте копию или fork. Перегруженный контекст ухудшает качество.
|
||||
|
||||
## 15. Храните решения вне переписки
|
||||
|
||||
#работа_с_ии #решения #источник_истины
|
||||
|
||||
Чат помогает думать, но не должен быть единственным хранилищем решения. Подтверждённый результат переносите в документ, задачу или Git, где видны актуальная версия и история изменений.
|
||||
|
||||
## 16. Понимайте назначение агентов
|
||||
|
||||
#работа_с_ии #агенты #делегирование
|
||||
|
||||
Агенты — отдельные исполнители для ограниченных частей большой задачи. Они полезны, когда несколько независимых исследований или проверок можно выполнить параллельно.
|
||||
|
||||
## 17. Давайте агенту одну ограниченную задачу
|
||||
|
||||
#работа_с_ии #агенты #постановка_задачи
|
||||
|
||||
Каждому агенту задайте одну цель, входные материалы, границы и формат результата. Хорошо: «проверь только риски безопасности и верни пять находок со ссылками».
|
||||
|
||||
## 18. Не используйте агентов без необходимости
|
||||
|
||||
#работа_с_ии #агенты #простота
|
||||
|
||||
Для маленькой или строго последовательной задачи один исполнитель лучше. Несколько агентов тратят больше ресурсов, могут дублировать работу и конфликтовать при одновременном изменении одних файлов.
|
||||
|
||||
## 19. Оставляйте итог главному исполнителю
|
||||
|
||||
#работа_с_ии #агенты #итог
|
||||
|
||||
Агенты возвращают краткие выводы, а главный исполнитель сравнивает их, устраняет противоречия и готовит единый ответ. Не склеивайте сырые результаты без общей проверки.
|
||||
|
||||
## 20. Заранее задавайте правило остановки
|
||||
|
||||
#работа_с_ии #зацикливание #стоп
|
||||
|
||||
Для сложной задачи напишите: «После двух неудачных попыток остановись, перечисли проверенное, назови блокер и предложи другой подход». Это не даёт ИИ бесконечно повторять одно решение.
|
||||
|
||||
## 21. После неудачи меняйте метод, а не формулировку
|
||||
|
||||
#работа_с_ии #ошибка #диагностика
|
||||
|
||||
Если подход не сработал, попросите назвать причину и собрать новые доказательства. Повтор той же команды другими словами редко помогает. Нужна новая гипотеза или дополнительный источник данных.
|
||||
|
||||
## 22. Очищайте перегруженный контекст
|
||||
|
||||
#работа_с_ии #контекст #перезапуск
|
||||
|
||||
Если ИИ путает старые решения, попросите кратко зафиксировать цель, факты, принятые решения и открытый вопрос. Затем продолжите из этой сводки в новом чате.
|
||||
|
||||
## 23. Всегда проверяйте результат
|
||||
|
||||
#работа_с_ии #проверка #качество
|
||||
|
||||
Просите ИИ выполнить самопроверку, но важные утверждения проверяйте сами по первичным источникам. Для кода нужны тесты, для расчётов — пересчёт, для документов — сверка цитат и реквизитов.
|
||||
|
||||
## 24. Не передавайте лишние данные
|
||||
|
||||
#работа_с_ии #приватность #персональные_данные
|
||||
|
||||
Перед загрузкой удалите лишние ФИО, контакты, пароли, ключи и конфиденциальные сведения. Передавайте минимальный объём данных, необходимый для задачи, и учитывайте правила вашей организации.
|
||||
|
||||
## 25. Отделяйте анализ от действия
|
||||
|
||||
#работа_с_ии #безопасность #подтверждение
|
||||
|
||||
Просьба «проанализируй» не должна означать «отправь, удали или опубликуй». Для внешних и необратимых действий требуйте отдельный план, предварительный просмотр и явное подтверждение человека.
|
||||
|
||||
## 26. Подключайте только нужные инструменты
|
||||
|
||||
#работа_с_ии #инструменты #доступ
|
||||
|
||||
Давайте ИИ доступ только к тем файлам, сервисам и правам, которые нужны сейчас. Начните с чтения; разрешение на запись, отправку и удаление выдавайте отдельно.
|
||||
|
||||
## 27. Превращайте повторяемую работу в шаблон
|
||||
|
||||
#работа_с_ии #шаблон #автоматизация
|
||||
|
||||
Если удачный запрос используется регулярно, сохраните его как шаблон. Когда процесс стал стабильным и проверенным, оформите его как навык или автоматизацию. Не автоматизируйте ещё не понятный процесс.
|
||||
|
||||
## 28. Завершайте работу короткой приёмкой
|
||||
|
||||
#работа_с_ии #приемка #финальная_проверка
|
||||
|
||||
В конце спросите: «Что сделано, что проверено, что осталось и какие есть риски?» Сравните ответ с первоначальной целью и критериями готовности, прежде чем принимать результат.
|
||||
|
||||
## Справочные материалы
|
||||
|
||||
- [Prompting](https://learn.chatgpt.com/docs/prompting)
|
||||
- [Personalize ChatGPT](https://learn.chatgpt.com/docs/personalize)
|
||||
- [Subagents](https://learn.chatgpt.com/docs/agent-configuration/subagents)
|
||||
- [Custom instructions with AGENTS.md](https://learn.chatgpt.com/docs/agent-configuration/agents-md)
|
||||
|
||||
---
|
||||
|
||||
Акылдаш v0.2.1
|
||||
65
test_bot.py
65
test_bot.py
@@ -153,7 +153,7 @@ class SecretaryTest(unittest.TestCase):
|
||||
"date": 1,
|
||||
"chat": {"id": config.chat_id},
|
||||
"from": {"id": config.owner_id},
|
||||
"text": "/export все",
|
||||
"text": "/export",
|
||||
}
|
||||
|
||||
with patch("bot.send_text") as send_text, patch(
|
||||
@@ -170,6 +170,69 @@ class SecretaryTest(unittest.TestCase):
|
||||
self.assertIn("#report_12", marker)
|
||||
self.assertIn("https://t.me/c/123/99", marker)
|
||||
|
||||
def test_next_export_starts_after_previous_cutoff(self):
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
config = Config(
|
||||
token="test",
|
||||
chat_id=-100123,
|
||||
owner_id=7,
|
||||
report_thread_id=37,
|
||||
thread_ids=frozenset({2}),
|
||||
database=Path(directory) / "bot.sqlite3",
|
||||
timezone=ZoneInfo("UTC"),
|
||||
)
|
||||
connection = connect(config.database)
|
||||
|
||||
def archive(message_id, text):
|
||||
archive_update(
|
||||
connection,
|
||||
{
|
||||
"update_id": message_id,
|
||||
"message": {
|
||||
"message_id": message_id,
|
||||
"message_thread_id": 2,
|
||||
"date": message_id,
|
||||
"chat": {"id": config.chat_id},
|
||||
"from": {"id": config.owner_id},
|
||||
"text": text,
|
||||
},
|
||||
},
|
||||
config,
|
||||
)
|
||||
|
||||
archive(10, "Первое обсуждение")
|
||||
with patch("bot.send_text"), patch(
|
||||
"bot.send_document",
|
||||
side_effect=[{"message_id": 90}, {"message_id": 91}],
|
||||
) as send_document:
|
||||
handle_command(
|
||||
connection,
|
||||
config,
|
||||
{
|
||||
"message_id": 12,
|
||||
"message_thread_id": 2,
|
||||
"from": {"id": config.owner_id},
|
||||
"text": "/export",
|
||||
},
|
||||
)
|
||||
archive(13, "Второе обсуждение")
|
||||
handle_command(
|
||||
connection,
|
||||
config,
|
||||
{
|
||||
"message_id": 14,
|
||||
"message_thread_id": 2,
|
||||
"from": {"id": config.owner_id},
|
||||
"text": "/export",
|
||||
},
|
||||
)
|
||||
|
||||
first_export = send_document.call_args_list[0].args[3].decode()
|
||||
second_export = send_document.call_args_list[1].args[3].decode()
|
||||
self.assertIn("Первое обсуждение", first_export)
|
||||
self.assertNotIn("Первое обсуждение", second_export)
|
||||
self.assertIn("Второе обсуждение", second_export)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user