Большинство ИИ-ассистентов работают по принципу "использовал и забыл". Исправьте привычку сегодня — завтра он повторит ту же ошибку; объясните на прошлой неделе особенности процесса вашей команды — на этой неделе он ведёт себя так, будто слышит о них впервые. Каждая беседа начинается с нуля, и какой бы умной ни была модель, это всё ещё умный человек с амнезией.
Orkas стремится к другому: дать агенту возможность учиться на повседневной работе, обобщать повторяющийся опыт и самостоятельно применять его в следующий раз. Проще говоря, чем больше вы им пользуетесь, тем полезнее он становится, причём эта полезность развивается в направлении вас, ваших предпочтений и вашей предметной области, а не того, что поставщик модели заранее определил для всех.
В статье разбирается устройство этого механизма. Это сложнее, чем "заставить модель запомнить беседу": за ним стоит полный цикл — наблюдать за собой → решить, нужен ли самоанализ → провести самоанализ → записать выводы в пригодном для повторного использования виде → применить их в следующий раз. Разберём всё по частям.
Сначала самое важное: всё описанное ниже — наблюдение, запись и самоанализ — происходит целиком на вашем устройстве. Данные запусков, навыки, представление агента о себе — всё хранится локально в обычных файлах. Ничего не загружается на серверы Orkas и не используется для анализа данных разных пользователей или обучения моделей. «Саморазвитие» означает, что программа локально читает записи о своих запусках и локально улучшает себя, а не собирает ваши данные. Этот опыт никогда не покидает компьютер и служит только вам, на этом компьютере.
Полный цикл
реальная работа, снова и снова
│ локально записывается: вызванные инструменты, наличие ошибок и исправлений
▼
накапливаются сигналы
│ сигналы извлекаются из разговора на месте и остаются на устройстве
▼
решение о необходимости рефлексии
│ взвешенная оценка сигналов; запуск только выше порога, сетевые сбои не учитываются
▼
рефлексия в фоне
│ не каждый ход, а периодически, с выбором подходящих агентов
▼
выделяются два результата
│ ① повторно используемые "навыки" ② "понимание" себя
▼
автоматически добавляются в следующий ход
└──────────► обратно к началу, цикл продолжаетсяУ каждого шага этого цикла есть тонкости. Легче всего ошибиться именно в двух шагах, которые на первый взгляд кажутся простейшими: когда проводить самоанализ и что после него записывать. Начнём с начала.
Шаг 1: наблюдение за собой почти без затрат
Чтобы учиться на опыте, сначала нужен опыт, который можно изучить. В конце каждого запуска агента программа локально, на месте, подсчитывает несколько простых фактов: примерно сколько инструментов вызвано за ход, были ли ошибки, были ли они временными (например, сетевыми) или настоящими, исправлял ли пользователь агента прямо по ходу работы. Всего несколько счётчиков и флагов, вычисляемых на компьютере, без вызова модели и без отправки куда-либо.
Это важно, потому что не требует никаких расходов на модель. Всё подсчитывается прямо по записи текущего хода беседы; дополнительный вызов модели для "самоанализа" не нужен. Если бы каждый ход требовал ещё одного вызова модели для рефлексии, стоимость и задержки стали бы неприемлемыми, и механизм никогда не дошёл бы до выпуска.
Признак «исправляли или нет» заслуживает внимания. Это чисто эвристическая локальная оценка по совпадению с несколькими формулировками в сообщении на вашем устройстве: китайскими вроде "不对" / "应该是" / "重新", английскими вроде wrong, actually, instead. Она не претендует на точность: это лишь сигнал, а не вердикт. Редкие ложные срабатывания допустимы, потому что далее этот признак взвешивается вместе с другими; сам по себе он ничего не решает.
Шаг 2: когда самоанализ действительно оправдан
На мой взгляд, именно здесь лучше всего видно мастерство проектирования всего механизма.
Наивный подход — "проводить самоанализ после накопления N случаев". Но это слишком грубо: три сетевых тайм-аута подряд и три исправления пользователя подряд явно не одно и то же и не должны обрабатываться одинаково. Orkas использует взвешенную оценку нескольких сигналов: каждое заслуживающее внимания явление — сигнал с весом; веса сработавших за ход сигналов суммируются, и самоанализ проводится только при превышении порога (по умолчанию 0,7).
Основные сигналы выглядят примерно так:
| Сигнал | Вес | Условие срабатывания |
|---|---|---|
| Исправление пользователя | 0,9 | В этом ходе обнаружено исправление от пользователя |
| Неэффективный навык | 0,85 | Навык загружен, но ход всё равно завершился ошибкой |
| Восстановление после ошибки | 0,8 | Возникла ошибка, но в итоге удалось исправить ситуацию |
| Проявилась известная слабость | 0,7 | Задача затронула слабое место, отмеченное в самооценке |
| Сложность задачи | 0,5 | Число вызовов инструментов превысило определённое значение |
Например, ход с исправлением пользователя (0,9) и некоторой сложностью (0,5) даёт сумму 1,4, заметно выше 0,7, поэтому запускается самоанализ. Ход, который лишь немного сложен (0,5), не достигает порога и пропускается. Веса тоже отражают суждение: прямое исправление пользователя получает наивысший вес — 0,9, потому что это обратная связь с самым высоким отношением сигнала к шуму. Пользователь прямо сказал, что вы ошиблись, и это, скорее всего, стоит записать.
Одно критически важное исключение
Во всей логике оценки есть правило, которое, на мой взгляд, определяет, будет ли механизм "учиться правильному": временные ошибки никогда не учитываются.
Сетевые тайм-ауты, обрывы соединения, ограничения частоты запросов — проблемы среды, а не недостатки способностей агента. Если их не исключить, произойдёт плохое: инструмент выдаст ошибку из-за случайного сетевого сбоя, а механизм самоанализа запишет "этот инструмент ненадёжен, использовать реже" или даже испортит либо удалит совершенно хороший навык. Так агент усвоит неверный урок, и ошибка останется с ним.
Поэтому сигналы «восстановление после ошибки», «неэффективный навык» и «проявилась известная слабость» явно исключают чисто временные ошибки. Промпт самоанализа тоже напоминает: сетевые ошибки относятся к среде, не записывай их как слабости и не трогай связанные навыки. Самоулучшающаяся система должна больше всего бояться не медленного обучения, а обучения в неверном направлении. Именно от этого и защищает исключение.
Шаг 3: самоанализ в фоне, а не у вас на глазах
В ловушку легко попасть: как только обнаружено, что "пора подумать", остановиться и заняться этим сразу. Тогда агент будто периодически запинается и уходит "размышлять о жизни", что неудобно для пользователя.
Orkas переносит самоанализ в фон и запускает его с фиксированной периодичностью. Правила планирования примерно такие:
- Запускать цикл самоанализа через определённые интервалы (скажем, порядка дюжины с лишним часов).
- Выдерживать минимальную паузу между двумя самоанализами одного агента (несколько часов), чтобы не запускать их слишком часто.
- Но если самоанализа не было слишком долго (например, больше недели), запустить его принудительно, чтобы не откладывать бесконечно.
- Ограничить число агентов в одном цикле, чтобы не распылять ресурсы сразу на всех.
Мне нравится одно небольшое решение под названием проверка наличия изменений: в начале цикла сначала проверяется, появилось ли у агента что-то новое после последнего самоанализа — новые сигналы или обновлённые записи бесед. Если изменений совсем нет, на этот раз агент пропускается, чтобы не тратить вызов модели на самоанализ. Просто, но на практике экономит много.
Шаг 4: как на самом деле проходит самоанализ
Когда время действительно пришло, процесс таков: сначала недавняя активность собирается в "пакет", затем вместе с тщательно написанным промптом передаётся модели для чтения и обобщения.
У пакета есть бюджет: взять не больше нескольких недавних бесед, добавить несколько классов системных событий, расположить их хронологически и ограничить общий объём числом токенов (скажем, десятью с лишним тысячами). Всю историю туда не сгружают: она не поместится, а отношение сигнала к шуму будет низким.
Особой тщательности требует промпт. Он требует от модели не "описаний", а исполнимых предписаний. Разница кажется небольшой, но имеет огромное значение. Сравните:
✗ "Ответы агента иногда слишком многословны; следует быть внимательнее."
✓ "При ответах на вопросы семейного офиса никогда не используй больше 5 пунктов списка."
✗ "Похоже, пользователь предпочитает краткие ответы."
✓ "В контексте семейного офиса всегда сначала давай главный вывод, затем обоснование."
Промпт явно направляет модель к конструкциям "никогда / всегда / если — то" с конкретными условиями срабатывания. Причина практическая: заметка "помни о краткости" не подсказывает агенту конкретного действия при следующем чтении, а "никогда не превышай 5 пунктов" можно исполнить напрямую. Чтобы самоулучшение было полезным, итогом должна быть действенная инструкция, а не верная банальность.
После самоанализа модель может сделать несколько вещей: создать или изменить навык, обновить представление о себе либо, если за этот период действительно нечего записать, просто сказать "нечего сохранять". Разрешение ничего не делать — тоже важное решение: не нужно принуждать к результату обучения, иначе накопится куча бесполезного шума.
Два вида результата
Результат самоанализа попадает в два места.
Первое — навыки. Каждый навык — документ Markdown с метаданными: блоком frontmatter, где записаны имя, описание, время создания и обновления, число внесённых правок и время последнего использования, за которым следуют сами шаги или ключевые положения:
---
name: "Weekly Report Export"
description: "Compile this week's data into the standard weekly-report format"
createdAt: "2025-01-01T00:00:00Z"
updatedAt: "2025-01-08T00:00:00Z"
patchCount: 2
lastUsedAt: "2025-01-09T10:00:00Z"
---
## Steps
1. ...
2. ...Хранение навыков в файлах — практичный выбор: человек может напрямую читать и редактировать их, они не заперты в непрозрачной базе данных.
Второе — представление о себе. Это похоже на заметку агента самому себе из двух частей: одна фиксирует "что у меня хорошо получается и где я обычно ошибаюсь", другая — "приёмы, которые я выработал для этого пользователя и этой предметной области". Обе ограничены по длине, чтобы оставаться краткими: лучше не длиннее, а точнее. В начале следующей беседы это содержимое добавляется в системный промпт, и агент вступает в неё с "представлением о себе".
Навыки не только записываются
Если лишь создавать навыки, со временем накопится свалка. Поэтому у навыков есть полный жизненный цикл.
Помимо создания, гораздо чаще выполняется точечное исправление: изменение небольшого фрагмента существующего навыка, а не его полное переписывание. Каждая правка увеличивает счётчик и обновляет время изменения. Так навык постепенно растёт вместе с опытом, вместо того чтобы целиком переписываться на каждом ходе.
Есть и предел количества. Общее число навыков ограничено (скажем, 200); когда лимит достигнут, добавление нового вытесняет старый по принципу LRU (давнее всего не использовавшийся), освобождая место. У вытеснения есть приоритет: сначала удаляются навыки, ни разу не использованные после создания. Навык, который никогда не читали, скорее всего, изначально был неудачно сформулирован, и ему лучше уступить место.
Каждое чтение навыка агентом обновляет время его последнего использования. Эта метка времени помогает LRU выбирать, что вытеснить, и позволяет локальному механизму отличать действительно используемые навыки от тех, которые просто занимают место.
Как понять, действительно ли навык полезен
Многие системы "автообучения" лениво пропускают этот шаг: что-то выучено, но есть ли в этом польза? Orkas превращает это в несколько локальных метрик. Они вычисляются для самого механизма развития на устройстве — чтобы решать, какой навык исправить или удалить, — и тоже никогда не покидают компьютер.
Механизм таков: в начале каждого хода доступные навыки появляются в индексе системного промпта — это один "показ"; если агент действительно прочитал навык в этом ходе, это один "вызов". Их соотношение даёт первую метрику:
- Частота вызовов = вызовы / показы. Если навык день за днём никому не нужен, частота вызовов низкая: он либо бесполезен, либо описан так, что непонятно, когда его применять.
- Доля ручных правок после применения = доля случаев, когда навык был вызван, но затем пользователь вручную изменил результат. Высокое значение означает, что результат навыка не вполне соответствует предпочтениям пользователя.
- Доля неэффективных применений = доля случаев, когда навык был вызван, но ход завершился невременной ошибкой. Высокое значение указывает на возможную проблему в самом навыке.
Здесь снова проявляется то самое исключение: при расчёте неэффективности временные ошибки не учитываются, как и ходы, которые пользователь остановил вручную. Нельзя ставить плохую оценку совершенно хорошему навыку из-за одного сетевого сбоя.
С этими несколькими числами навыки перестают быть "тем, что копится в чёрном ящике", и становятся "тем, что можно оценивать и улучшать". Решение, какой навык исправить или удалить, больше не принимается наугад.
Замыкание цикла
Если соединить всё описанное, полный цикл выглядит так:
Агент выполняет реальные задачи, локально записывает данные запусков и по ходу отмечает сигналы. Когда наступает фоновый цикл самоанализа, он выбирает агентов с новой активностью, для которых истекла пауза, собирает недавнюю активность каждого в пакет и просит модель сопоставить её с текущим представлением о себе: объединить то, что следует объединить, удалить устаревшее и выделить то, что стоит оформить в новые навыки. Результат анализа становится навыками и представлением о себе. В следующей беседе навыки попадают в индекс промпта, а представление о себе — в системный промпт, и агент возвращается с усвоенным в прошлый раз. Затем новый цикл порождает новые метрики и сигналы, которые возвращаются к началу.
Цикл повторяется снова и снова. Не каждый виток приносит резкий скачок, но направление одно: лучше понимать вас и реже повторять одни и те же ошибки.
Несколько компромиссов, о которых стоит сказать
Если оглянуться назад, несколько решений в этом механизме оказываются ключевыми.
Самонаблюдение должно быть дешёвым. Наблюдение за собой использует метрики без затрат на модель; действительно дорогой самоанализ вынесен в фон, выполняется редко и сначала проходит проверку наличия изменений. Жёстко ограничьте дорогую часть — и весь механизм сможет реально работать.
Лучше не научиться, чем научиться неверному. Исключение временных ошибок, возможность "ничего не сохранять", запись исполнимых предписаний вместо расплывчатых описаний — всё ведёт к одному выводу: для самоулучшающейся системы обучение в неверном направлении гораздо опаснее медленного обучения.
Усвоенное должно быть видимым, редактируемым и находиться под вашим контролем. Навыки — обычные текстовые файлы, представление о себе — текстовая заметка, эффективность навыков проверяется метриками. Все эти файлы находятся на вашем компьютере, а не в облаке. Никакого чёрного ящика: человек может открыть и поправить их в любой момент.
Обучению нужны тормоза. Лимиты количества, вытеснение по LRU, ограничения длины — без них "непрерывное обучение" рано или поздно становится "непрерывным разрастанием". Забывать, отбрасывать и сокращать так же важно, как запоминать.
В заключение
Саморазвитие Orkas по сути добавляет агенту медленный цикл: быстрый — это немедленный ответ в каждой беседе; медленный — периодический взгляд назад и преобразование опыта в то, что пригодится в следующий раз. Сложность не в том, чтобы "заставить модель запомнить", а в инженерных решениях, которые легко упустить: как определить, какой опыт стоит записать, как не сбиться из-за случайной ошибки, как сделать усвоенное действительно исполнимым и как сократить его до того, как оно разрастётся.
Вместе эти решения превращают фразу "чем больше пользуетесь, тем полезнее" из маркетингового лозунга в работающий механизм. Ассистент, который учится у вас и не усваивает неверных уроков, возможно, ближе к тому, чего большинство людей действительно хочет, чем ассистент, который просто умнее.