В 2018 году я построил сетевую модель, чтобы определить, куда лучше всего вкладывать своё время в технологическом сообществе Айовы. Модель разрослась до примерно 10 000 элементов — компаний, организаций, людей, городов и связей между ними. Я использовал центральность по собственному вектору, чтобы выявить узлы, с которыми я не был связан, но которые имели высокую связность с другими узлами. Это повлияло на реальные решения: я вошел в совет директоров TAI, обнаружил сообщества, о существовании которых не знал, и отобразил различия в плотности между экосистемами Де-Мойна и прибрежных регионов.

Эта модель осталась со мной. На протяжении многих лет работы в Brale я постоянно сталкиваюсь с графами взаимосвязей, построенными с помощью метода силового притяжения: сопоставление эмитентов с активами и транспортными маршрутами, связывание операторов программ с блокчейнами, на которых они работают. Каждый раз кто-то заново изобретает визуальный язык. Что означает тот или иной цвет? Что символизирует толстая линия? Какая форма отличает компанию от человека и от события? Эти решения принимаются заново в каждом проекте. Следующий человек, открывающий этот граф, вынужден проводить обратный инжиниринг всего этого, прежде чем сможет понять содержание.

В прошлом году CSF (Commons Stablecoin Format) стандартизировал способ отображения потоков средств. Вставьте спецификацию в LLM, запросите поток средств в формате «stablecoin», и он каждый раз будет соответствовать этому формату. Я хотел добиться того же самого для графов отношений. Поэтому я разработал Graphing Standard Format — GSF — небольшую грамматику, которая определяет, как тип определяет форму, как вес определяет размер и как уровни плотности контролируют то, что раскрывается.

Вот моя сеть, отображённая в формате GSF:

плотность
GSF v0.5.2

Круги — это люди. Скругленные прямоугольники — организации. Треугольники — события, отличные от компаний, которые их организуют. Ромбы — места. Шестиугольники — концепции. Таблетки — системы. Нажмите на любой узел, чтобы увидеть его профиль. Переключитесь на режим «Средний», чтобы увидеть цвет. Вам не нужно было ничего из этого выбирать. GSF сделал это за вас.

Вот видео, демонстрирующее использование GSF в первый раз. Получилось довольно неплохо!

GSF и CSF

CSF GSF
Результат Диаграммы последовательностей Mermaid Графики связей D3
Ответы Как значение переходит от A к B, по порядку Что существует и как это связано
Природа Временные, упорядоченные по шагам Структурное, вневременное
Уровни Легкий / Средний / Тяжелый Легкий / Средний / Тяжелый

Оба реализуют одни и те же примитивы уровня значений: ValueType, TransferType, Exchange. Единственная потеря при переходе от CSF к GSF — это порядок последовательности, поскольку графы являются невременными.

Стандарт

GSF определяет правила визуализации, а не саму визуализацию. Его использование означает, что вы определяете, что показывать, а формат решает, как это показывать. Базовая линия остается единой для всех проектов.

Три момента:

  • GSF — это набор правил. Он никогда не визуализируется.
  • Набор данных — это {view, nodes, links} экземпляр, соответствующий GSF. Именно он подвергается рендерингу.
  • Рендерер принимает правила и набор данных и рисует изображение.

Четыре примитива. Всё, что нужно рендереру:

  1. Отношение — связь между ровно двумя сущностями. Связи формируют граф.
  2. Тип — качественный классификатор. Определяет форму и цвет.
  3. Переменные — набор деталей. Содержит всё, что не входит в тип.
  4. Вес — количественная величина. Определяет размер и ширину.

Правило кодирования: значение против значений. Одно количественное значение (число, передаваемое в weight) определяет размер и ширину. Качественные значения (категория, статус, метка) определяют форму, цвет, группировку и то, что отображается при наведении курсора.

Один дизайнерский выбор, заслуживающий особого упоминания: типы отношений представляют собой открытые строки. Закрытого списка нет. Набор данных сам определяет, какие типы ему нужны — в моей схеме выше используются founder, cofounder, spinout, и operates, ни один из которых не указан в спецификации. Отобразилось нормально. GSF определяет кодировку (как типы превращаются в формы и цвета), а не словарь (какие типы разрешено использовать).

Плотность

Тот же регулятор, что и в CSF. Насколько подробно и с каким цветом отображает данные рендерер:

  • «Светло» — черно-белый режим. Форма обозначает тип, стиль линии — класс связи (сплошная = значение, пунктирная = данные, точечная = производная), толщина — величину, наконечник стрелки — направление. Цвет отсутствует. Готово к печати.
  • Средний — добавляет цвет в виде наложения, легенду и переменные при наведении курсора.
  • Насыщенный — полная запись. Все переменные, конечные точки передачи, возможности расширения.

Одно правило: вариант «Легкий» должен быть читаем в чёрно-белом варианте. Цвет никогда не является единственным сигналом.

Формат

Ссылке необходимо source, destination, и type. Всё остальное необязательно:

{
  "format": "gsf",
  "version": "0.5.2",
  "renderer": "d3-force",
  "view": { "level": "light", "hops": 1, "focus": ["Person A"] },
  "links": [
    { "source": "Person A", "destination": "Person B", "type": "message" }
  ]
}

Для графиков уровня значений объекты конечных точек несут value_type и transfer_type с каждой стороны. Если они различаются, это сигнализирует об обмене — и via обозначает обменщик:

{
  "format": "gsf",
  "version": "0.5.2",
  "renderer": "d3-force",
  "view": { "level": "heavy", "hops": 1, "focus": ["Brale"] },
  "nodes": [
    { "id": "Sender", "type": "org" },
    { "id": "Brale", "type": "org", "variables": { "sub_type": "exchange" } },
    { "id": "Recipient Wallet", "type": "system", "variables": { "sub_type": "wallet" } }
  ],
  "links": [
    {
      "source": { "id": "Sender", "value_type": "USD", "transfer_type": "wire" },
      "destination": { "id": "Recipient Wallet", "value_type": "USDC", "transfer_type": "solana" },
      "type": "transfers_via",
      "via": "Brale",
      "weight": 1000,
      "variables": { "exchange": "USD -> USDC", "rate": 1.0 }
    }
  ]
}

Использование

Вставьте файл gsf-0.5.2.json в LLM и попросите его преобразовать исходный материал в набор данных GSF. Он всегда следует этому формату — так же, как и CSF. Блок llm_instructions Блок в спецификации предназначен для непосредственного использования машиной. Последнюю версию можно найти в репозитории GSF.

Стандарт является открытым исходным кодом: github.com/benmilne-com/standards/gsf. Создавайте форки, используйте его, вносите свой вклад.

Структура бесплатна.