temporality
Изменить страницу↗
Инженерные документы

Knowledge Extraction из агентских траекторий

#1. Цель

Реализовать механизм автоматического выделения кандидатов в знания из реальной работы агентов в Temporality.

Сейчас Temporality умеет:

При этом большая часть содержательной работы агента — исследование, обсуждение, принятие решений, обнаружение причин, формирование выводов — не приводит к появлению knowledge.

В результате реальный агентский run может содержать большое количество полезной информации, но после его завершения в Knowledge Layer не появляется ни одного кандидата.

Необходимо добавить отдельный механизм:

Agent trajectory
       ↓
Knowledge Extraction
       ↓
0..N knowledge candidates
       ↓
knowledge.proposed
       ↓
confirmation / rejection / correction
       ↓
persistent knowledge

#Основной принцип

Не каждое событие является знанием. Но содержательная агентская работа должна иметь механизм выделения потенциально полезных знаний.


#2. Что не является целью

В рамках задачи не требуется:

Knowledge Extraction должен порождать кандидатов, а не самостоятельно объявлять их истиной.


#3. Целевая модель

Источником данных остаётся event stream.

Knowledge является производным представлением, построенным на основании событий.

                         Event Stream
                              │
             ┌────────────────┴────────────────┐
             │                                 │
        Runtime events                  Knowledge events
             │                                 │
             │                         ProjectKnowledge
             │
             ▼
       Agent trajectory
             │
             ▼
    Knowledge Extraction
             │
             ▼
    knowledge.proposed
             │
      ┌──────┼────────┐
      ▼      ▼        ▼
 confirmed rejected challenged
      │
      ▼
   Knowledge

Extraction не должен становиться вторым source of truth.

Все результаты extraction должны выражаться через существующую событийную модель Temporality.


#4. Основной сценарий

После завершения содержательной работы агента система должна иметь возможность проанализировать trajectory и определить:

  1. что было установлено;
  2. какие гипотезы были подтверждены или опровергнуты;
  3. какие решения были приняты;
  4. какие причины проблем были обнаружены;
  5. какие ограничения или закономерности были выявлены;
  6. какие результаты могут быть полезны будущему агенту.

Пример.

Агент исследовал проблему:

Почему WebAuthn не работает в Tauri WebView на macOS?

В ходе run:

исследование
→ проверка Safari
→ проверка Firefox
→ проверка Tauri WebView
→ эксперимент
→ анализ результата
→ вывод

После завершения extraction может предложить:

knowledge.proposed

kind: claim

proposition:
"WebAuthn работает в Safari/Firefox, но не работает
в текущем macOS WebView runtime Tauri."

evidence:
[
  event-123,
  event-127,
  event-131
]

Это не означает автоматического подтверждения знания.

Оно становится кандидатом:

proposed

и далее проходит существующий lifecycle.


#5. Два типа знания

Extraction должен различать как минимум два типа.

#5.1 Observation

Объективный результат действия.

Примеры:

pytest завершился с exit code 0
HTTP endpoint вернул status 200
файл X существует
конфигурация содержит параметр Y

Observation желательно формировать автоматически там, где результат непосредственно следует из события.


#5.2 Claim

Вывод, сделанный на основании нескольких событий.

Примеры:

Проблема возникает только в WebView.
Причиной ошибки является несовместимость X и Y.
Для этого проекта нельзя использовать механизм Z.
Изменение A необходимо делать до B.

Claim обязательно должен иметь evidence, на основании которого он был сформирован.


#6. Источники extraction

На первом этапе extraction должен работать с завершёнными run.

run.completed
      ↓
Knowledge Extraction

Это является обязательным MVP.

В будущем extraction может запускаться и на промежуточных этапах содержательной работы, но это не является обязательным требованием первой реализации.


#7. Extraction должен анализировать trajectory, а не только chat

В extraction необходимо передавать релевантный контекст run:

Необходимо избегать передачи модели полного необработанного event log без необходимости.

Должен существовать механизм формирования компактного extraction context.


#8. Контракт extractor

Extractor должен возвращать 0..N кандидатов.

Минимальная структура кандидата:

kind: observation | claim
proposition: "..."
evidence:
  - event_id

Дополнительно extractor может возвращать:

confidence: ...

если такое поле поддерживается моделью knowledge.

#Важное требование

Не делать обязательным заполнение:

topics
entities
tags
categories

агентом или extractor-моделью. В текущей реализации extractor заполняет topics/entities (0–3 нормализованных значений) — это контекст для retrieval, не обязательная часть knowledge creation.

Если они необходимы для retrieval, они вычисляются из самого knowledge и нормализуются судейским проходом (карта областей).


#9. Evidence

Каждый автоматически созданный claim должен иметь ссылки на исходные события.

Например:

knowledge.proposed
    proposition:
      "X вызывает Y"
    evidence:
      - event-123
      - event-127
      - event-131

Evidence должен позволять:

Knowledge без понятного происхождения не должен считаться полноценным результатом extraction.


#10. Не создавать knowledge из каждого run

Extractor должен уметь вернуть:

[]

если в run не было знаний, которые имеют ценность за пределами текущей задачи.

Это нормальный результат.

Например:

прочитал файл
→ поменял переменную
→ запустил тест
→ всё прошло

не обязательно должно создавать отдельный claim.

В то же время:

исследовал проблему
→ проверил несколько гипотез
→ обнаружил систематическую причину
→ сформировал решение

должно иметь возможность породить knowledge candidate.


#11. Критерий полезности

Extractor должен ориентироваться не на вопрос:

Что произошло в этом run?

а на вопрос:

Что из произошедшего может быть полезно будущему агенту при похожей работе?

Особенно ценны:


#12. Связь с remember

Существующий remember сохранить.

Он должен рассматриваться как явный канал утверждения знания агентом:

Agent
  ↓
remember
  ↓
knowledge.proposed

Но remember не должен быть единственным способом создания knowledge.

Целевая модель:

             ┌── remember ───────────────┐
             │                           │
Agent work ──┼── successful observations ┤
             │                           │
             └── Knowledge Extraction ──┘
                                         ↓
                                knowledge.proposed

При этом существующее правило:

успешные тесты не нужно повторно записывать через remember

сохранить.


#13. Автоматические observations

Существующую эвристику успешных test/build/lint команд сохранить.

Она является специализированным быстрым producer'ом:

successful verification
        ↓
knowledge.proposed
kind: observation

Knowledge Extraction не должен дублировать уже существующие observations.

Extractor должен видеть их как evidence/контекст и избегать создания второго knowledge с тем же смыслом.


#14. Deduplication

Необходимо предусмотреть защиту от повторного создания одного и того же знания.

Например:

Run 1:
"pytest tests/foo passes"

Run 2:
"pytest tests/foo passes"

Run 3:
"pytest tests/foo passes"

не должны создавать бесконечное количество одинаковых knowledge nodes.

Для этого необходимо использовать существующий механизм identity/deduplication knowledge либо добавить минимальный deterministic fingerprint.

Особенно важно различать:

новое знание

и:

повторное подтверждение существующего знания

Повторное подтверждение должно по возможности усиливать evidence существующего knowledge, а не создавать новый узел.


#15. Связывание знаний

Если extraction выявляет несколько связанных выводов, необходимо иметь возможность создавать связи:

knowledge.linked

Например:

knowledge A:
"WebAuthn не работает в текущем WebView"

knowledge B:
"Safari использует другой browser runtime"

knowledge A
    └── related_to ──> knowledge B

При этом создание связей не должно быть обязательным для каждого knowledge candidate.

Минимальный MVP мог начать только с:

knowledge.proposed
    + evidence

а linking — отдельным этапом. Сейчас linking реализован: contradicts создаёт вызов опровержения, куратор отношений подтверждает/отклоняет связи (knowledge.relation_confirmed/dismissed).


#16. Confirmation

Extraction не подтверждает knowledge автоматически только потому, что его предложила LLM. Исключение — ре-деривация: повторное извлечение уже известного утверждения подтверждает его (execution-reverification/extraction-reverification), а последующие — фиксируют использование (knowledge.used). И отдельно: judged-подсказка hint.outcome: helpful подтверждает proposal прямо из проекции.

После:

knowledge.proposed

должен использоваться существующий механизм подтверждения.

Подтверждение может происходить:


#17. Human-in-the-loop

Для MVP желательно предусмотреть возможность просмотра кандидатов человеком.

Интерфейс должен позволять:

┌──────────────────────────────────────────┐
│ Новый кандидат в знания                  │
│                                          │
│ WebView macOS не поддерживает ...        │
│                                          │
│ Evidence: 3 события                      │
│                                          │
│ [ Подтвердить ] [ Отклонить ] [ Изменить ]│
└──────────────────────────────────────────┘

При этом пользователь не должен редактировать YAML/JSON.

Редактирование knowledge должно происходить через обычный UI.


#18. Extraction prompt

Для extractor должен быть отдельный системный prompt.

Он должен явно задавать:

#Нужно

#Нельзя


#19. Контекст существующих знаний

Extractor желательно должен видеть релевантные существующие knowledge.

Это необходимо для определения:

новое знание

против:

подтверждение существующего знания

против:

Например:

Existing:
"X работает через Y"

Current run:
"X работает через Z"

Это должно потенциально приводить не к новому независимому knowledge, а к:

knowledge.challenged

или соответствующему механизму correction.


#20. Retrieval для extractor

Не нужно передавать extractor всю базу знаний.

Передавать следует только релевантные существующие knowledge:

trajectory
    ↓
candidate concepts / terms
    ↓
existing relevant knowledge
    ↓
extractor

Это одновременно:


#21. Пилот на реальных задачах

Статус: проведён — extractor v4 работает в проде (topics/entities, contradicts, hint_outcomes, ре-деривация).

До реализации сложной схемы необходимо проверить гипотезу на уже выполненных реальных run.

Взять несколько существующих задач Temporality, в которых:

Для каждого run:

existing trajectory
        ↓
prototype extractor
        ↓
candidate knowledge
        ↓
human review

Необходимо оценить:

  1. сколько кандидатов создаётся на run;
  2. сколько кандидатов действительно полезны;
  3. сколько являются дубликатами;
  4. сколько являются обычным шумом;
  5. достаточно ли evidence;
  6. какие типы knowledge реально встречаются;
  7. какие знания стоит сохранять;
  8. какие знания следует отклонять.

#22. Критерии успешности пилота

Пилот считается успешным, если на реальных задачах extractor способен:

Количественные пороги определить после первого пилота, а не задавать заранее.


#23. Что делать с topics и entities

Не делать их обязательными входными параметрами remember или extractor на первом этапе.

После пилота определить:

Если они нужны, предпочтительный вариант:

knowledge
    ↓
enrichment
    ↓
topics/entities

а не:

agent
    ↓
обязательное заполнение topics/entities

#24. Наблюдаемость extraction

Сам extraction должен быть наблюдаемым через Temporality.

Необходимо фиксировать как минимум:

knowledge.extraction.started
knowledge.extraction.completed

и результат:

candidates_count
proposed
strengthened
challenged
aged
duplicates_skipped
invalid_skipped
duration_ms
model

(фактические поля knowledge.extraction.completed; knowledge.extraction.failed — отдельное событие сбоя.)

Extraction не должен быть «магией», которую невозможно диагностировать.


#25. Failure handling

Ошибка extraction не должна ломать основной run.

agent run
    │
    ├── completed
    │
    └── extraction failed
             │
             └── logged / observable

Run считается завершённым независимо от результата extraction.

Повторный extraction должен быть возможен.


#26. Idempotency

Повторный запуск extraction для одной и той же trajectory не должен порождать бесконечные дубликаты.

Необходимо определить стабильный идентификатор extraction:

extraction_id =
hash(
    trajectory_id,
    extraction_version
)

При изменении prompt/schema допускается новая версия extraction.

Например:

trajectory-123 / extraction-v1
trajectory-123 / extraction-v2

Это позволит эволюционировать extractor без потери истории.


#27. Версионирование

Extractor должен иметь версию.

Например:

knowledge-extractor.v1

В knowledge event желательно сохранять информацию о producer/version.

Это необходимо для последующего анализа:


#28. Минимальный MVP

В первый этап включить только:

#Producer

run.completed
    ↓
Knowledge Extraction

#Output

knowledge.proposed

с:

kind
proposition
evidence

#Поддержать

#Не включать в MVP


#29. Что сделано из «следующего этапа»

  1. enrichment topics/entities — ✅ (плюс судейская нормализация областей);
  2. automatic linking — ✅ (contradicts, куратор отношений);
  3. challenge/correction существующих знаний — ✅ (opровержения, aging sweep, переходы состояний от hint.outcome);
  4. human review — ✅ через supervisor-кейсы (knowledge_hygiene, knowledge_contradiction) и ручные действия в Explorer;
  5. автоматическое подтверждение observations — ✅ (ре-деривация);
  6. промежуточный extraction после содержательных блоков и quality metrics — остаётся будущим.

#30. Ожидаемый результат

После реализации реальный run должен выглядеть примерно так:

User task
   ↓
Agent work
   │
   ├── tool events
   ├── observations
   ├── decisions
   ├── experiments
   └── conclusions
          │
          ▼
      run.completed
          │
          ▼
   Knowledge Extraction
          │
          ├── candidate A
          ├── candidate B
          └── candidate C
                  │
                  ▼
        knowledge.proposed
                  │
          ┌───────┴────────┐
          ▼                ▼
     verification       rejection
          │
          ▼
   knowledge.confirmed
          │
          ▼
      future run
          │
          ▼
      knowledge.used

Главный результат задачи:

Temporality начинает фиксировать не только то, что делал агент, но и то, что агентская работа позволила узнать.

При этом event stream остаётся источником истины, а knowledge остаётся производным, проверяемым и эволюционирующим представлением.