Что даёт граф по сравнению с векторным хранилищем
Большинство агентных систем начинают с векторного хранилища, и какое-то время это работает. Документы разбиваются на фрагменты, встраиваются и извлекаются по сходству. Отказ наступает незаметно: вопросы, требующие обхода, а не поиска. «Какой поставщик был указан в отчёте об инциденте, который вызвал аудит компонента, устаревшего в прошлом квартале?» — это не задача сходства. Это задача соединения, и плоское извлечение деградирует в первую очередь именно на таких вопросах, потому что ни один фрагмент не содержит ответа. Ответ — это путь.
Граф делает путь явным. Сущности — это узлы, отношения — это рёбра, и многошаговый вопрос превращается в обход, который можно спланировать, ограничить и объяснить. Это первое, что даёт граф: форма запроса соответствует форме вопроса.
Второе — это происхождение. Когда утверждение хранится как ребро, ребро может нести собственные метаданные: какое наблюдение его породило, когда, каким агентом, по какой версии схемы. Это значит, что агент может сказать не просто «компонент устарел», а «компонент устарел согласно этому наблюдению, зафиксированному в это время». Происхождение путешествует вместе с ребром, а не реконструируется постфактум из оценок извлечения, которые плохо отражают обоснование.
Третье — изоляция записи. Несколько агентов могут писать в непересекающиеся подграфы, не перезаписывая встраивания друг друга. В векторном хранилище каждый новый документ сдвигает структуру соседства, относительно которой извлекается каждый другой документ; добавление фрагмента может изменить то, что вернёт другой запрос. В графе добавление узла и ребра в область, которую никто больше не читает, оставляет остальной граф нетронутым. Это свойство становится важнее по мере роста числа одновременных писателей.
Чего это стоит

Затраты не в слое запросов. Движки запросов для графов свойств и RDF зрелые, а обход нескольких миллионов рёбер — не исследовательская проблема. Затраты в том, чтобы граф оставался истинным.
Разрешение сущностей становится непрерывной фоновой задачей. Одна и та же организация появится как три узла с немного разными метками: один из документа, один из структурированного потока, один из вывода агента. Их дедупликация — не одноразовая миграция. Каждая новая запись — кандидат на слияние, каждое слияние — кандидат на ошибку, и задача никогда не заканчивается. Граф дрейфует в тот момент, когда задача останавливается, и дрейф не виден ни на одном дашборде, если вы не построите его специально.
Эволюция схемы — это проблема миграции. Агенты, пишущие свободные тройки, создадут граф, по которому никто не сможет делать запросы, потому что предикаты будут почти синонимами друг друга, а типы — несогласованными. Типизированный словарь — не бюрократия; это то, что делает обход планируемым. Но типизированный словарь должен меняться, а его изменение означает миграцию существующих рёбер, версионирование схемы и решение о том, что делать с читателями, которые всё ещё ожидают старую форму.
Конкуренция записи требует политики слияния, а не last-write-wins. Два агента, наблюдающие одну и ту же сущность одновременно, будут расходиться во мнениях. Last-write-wins молча отбрасывает одно наблюдение, что является худшим исходом для происхождения. Политика слияния должна решать для каждого предиката, являются ли значения однозначными, множественными или временными рядами, и создаёт ли конфликтующая запись новое ребро, заменяет старое или порождает задачу на проверку. Это проектное решение, которое нужно принять до первого конфликта, а не после.
Честный компромисс таков: граф делает обход и происхождение дешёвыми, делая согласованность дорогой. Векторное хранилище делает согласованность дешёвой, делая обход и происхождение дорогими. Ни то, ни другое не бесплатно; они отказывают в разных местах.
Рабочее разделение труда
Паттерн, который выдерживает проверку на практике, разделяет то, чт

Храните в графе сущности, отношения и происхождение. Узлы несут стабильные идентификаторы. Рёбра несут источник, временную метку и идентификатор наблюдения, которое их породило. Сырой текст не живёт в графе; он живёт в объектном хранилище и на него ссылаются по идентификатору. Это сохраняет граф достаточно малым для обхода, а текст — достаточно большим, чтобы быть полезным. Агент, которому нужен фрагмент, следует по идентификатору; агент, которому нужно отношение, читает ребро.
Ограничьте записи агентов типизированным словарём. Агенты не изобретают предикаты. Они предлагают рёбра в соответствии со схемой, которая версионируется, а изменения схемы проходят через процесс с участием человека. Звучит так, будто это замедляет агентов, и это действительно так, намеренно: альтернатива — граф, чьи предикаты так же разнообразны, как породившие их промпты. Полезный механизм здесь — валидатор записи, который отклоняет неизвестные предикаты и неизвестные типы сущностей на границе, так что плохие записи громко проваливаются при приёме, а не молча во время запроса.
Относитесь к свежести графа как к SLO с измеримой границей устаревания. Если задача разрешения отстаёт, читатели должны знать. Раскройте границу устаревания агентам, которые читают граф, чтобы читатель мог решить, доверять ли обходу или вернуться к сырому извлечению. Граф, который тихо отстаёт на три дня, хуже графа, который об этом объявляет.
Дайте одновременным писателям политику слияния для каждого предиката. Однозначные предикаты разрешаются заменой с сохранением предыдущего значения как истории. Множественные предикаты объединяются. Временные ряды добавляются. Всё неоднозначное направляется в очередь на проверку, а не разрешается по порядку поступления.
Что инструментировать
Если команда рассматривает общий граф как контекст агента, инструментирование важнее выбора базы данных. Отслеживайте очередь разрешения и её возраст. Отслеживайте отношение отклонённых записей к принятым на валидаторе. Отслеживайте количество предикатов на тип сущности, потому что его рост — ведущий индикатор распада схемы. Отслеживайте, как часто читатели возвращаются к сырому извлечению, потому что граф слишком устарел, чтобы ему доверять.
Ни одна из этих метрик не относится к слою запросов. Это метрики обслуживания, и именно они предсказывают, будет ли граф по-прежнему полезен через шесть месяцев. Слой запросов будет в порядке. Соединение — это сложная часть, и соединение поддерживается, а не строится.
