---
title: "Что такое битемпоральный граф знаний"
seoTitle: "Битемпоральный граф знаний — простыми словами, с примерами"
description: "Битемпоральный граф знаний хранит на каждом факте двое часов — когда что-то было правдой и когда система об этом узнала. Разбираем, зачем нужны вторые часы и что они дают памяти AI-агента."
date: "2026-06-23"
author: "INITE Brain Team"
category: "Концепции"
tags: ["bitemporal", "граф знаний", "память", "RAG"]
directAnswer: "Битемпоральный граф знаний хранит на каждом факте две метки времени: valid time (когда факт верен в мире) и transaction time (когда система его записала). С обеими можно спросить про настоящее, воспроизвести прошлое таким, каким оно было, и исправить историю, не стирая аудит-след."
definitionSentence: "Битемпоральный граф знаний — это граф фактов, где у каждого факта есть и интервал valid time (когда он верен в реальном мире), и интервал transaction time (когда система о нём знала), так что один и тот же запрос отвечает и «что верно сейчас», и «во что мы верили на любую прошлую дату»."
faqs:
  - question: "Чем valid time отличается от transaction time?"
    answer: "Valid time — это когда факт верен в реальном мире: клиент был на тарифе starter с января по март. Transaction time — когда об этом узнала твоя система: смену тарифа могли записать через два дня после того, как она случилась. Битемпоральное хранилище держит обе оси, поэтому поздняя правка не переписывает молча то, во что ты верил на более раннюю дату."
  - question: "Зачем AI-агенту битемпоральная память?"
    answer: "Агент действует исходя из того, что знает в конкретный момент. Когда что-то пошло не так, нужно воспроизвести ровно то, что было в памяти тогда, — а не то, что лежит там сейчас, после правок. Transaction time делает такое воспроизведение точным, и это разница между отлаживаемым агентом и чёрным ящиком."
  - question: "Разве обычной версионности базы не хватит?"
    answer: "Версионное (temporal) хранилище даёт одни часы — обычно transaction time. Видно, когда строка менялась, но нельзя отделить «факт стал правдой» от «мы об этом узнали». Битемпоральность держит обе оси независимо — это и позволяет задним числом исправить валидность (valid time в прошлом), не делая вид, что узнал раньше (transaction time остаётся честным)."
  - question: "Битемпоральное хранение замедляет запросы?"
    answer: "Обычные запросы фиксируют обе оси на «сейчас» и читают активный срез — ведут себя как простой поиск. Цена появляется только когда ты специально запрашиваешь прошлый asOf и сканируешь исторический интервал. На практике это пара условий по индексу, а не другой класс запросов."
---

## Двое часов, а не одни

Большинство систем хранит на записи одну метку времени: когда её записали. Это отвечает на «когда поменялось», но не умеет отделить «когда это *стало* правдой» от «когда мы об этом *узнали*». Это два разных вопроса, и когда их смешивают, аудит-след начинает тихо врать.

Битемпоральный граф знаний держит обе:

- **Valid time** — интервал, в течение которого факт верен в реальном мире.
- **Transaction time** — интервал, в течение которого система в него верила.

Каждый факт — это маленькое утверждение с двумя штампами. «Acme на тарифе growth» верно *в мире* с 10 марта, но Brain *записал* это только 12-го.

## Проблема исправления

Вот сценарий, который ломает системы с одними часами. Клиент сменил тариф 10 марта. Система узнала об этом только 12-го.

| | Valid time | Transaction time |
| --- | --- | --- |
| starter | 1 янв → 10 мар | 1 янв → (обрезан 12 мар) |
| growth | 10 мар → сейчас | 12 мар → сейчас |

Теперь спроси: *«11 марта какой тариф мы считали у Acme?»*

Честный ответ — **starter**, потому что смену записали только 12-го. Хранилище с одними часами такой ответ дать не может. Как только ты внёс правку, выглядит так, будто ты знал всегда. Битемпоральность держит transaction time отдельно, поэтому воспроизведение 11 марта вернёт то, что ты на самом деле знал 11 марта.

## Почему это важно агентам

AI-агент принимает решения по той памяти, что есть у него в этот миг. Когда решение задним числом выглядит ошибочным, первый вопрос — «что агент знал», и единственный полезный ответ — состояние памяти *тогда*, до всех поздних правок.

- **Аудит** — доказать, что агент мог знать на момент решения.
- **Воспроизведение** — точно восстановить прошлый прогон, вместе с багами.
- **Честные правки** — задним числом поправить валидность факта, не переписывая запись о том, когда ты узнал.

Хранилище, которое затирает при исправлении, выбрасывает все три.

## Как это делает Brain

В INITE Brain у каждой строки `knowledge_fact` есть `validFrom` / `validUntil` и `recordedAt` / `retractedAt`. Обычный поиск берёт активный срез на `now/now`. Передай `asOf` — и запрос перефиксирует valid time; передай границу по транзакции — и он перефиксирует то, что было известно. Исправление вставляет новый факт и обрезает валидный интервал старого — исходная строка остаётся, поэтому таймлайн не разрушается, а только продолжается.

В этом весь смысл битемпоральности: можно передумать насчёт прошлого, не соврав о нём.
