2018년에 저는 아이오와 기술 커뮤니티에서 제 시간을 어디에 투자해야 할지 파악하기 위해 네트워크 모델을 구축했습니다. 이 모델은 기업, 단체, 인물, 도시, 연결성 등 약 10,000개의 요소로 확장되었습니다. 저는 고유벡터 중심도(eigenvector centrality)를 활용해, 저와는 연결되어 있지 않으면서도 다른 곳과의 연결성이 높은 노드들을 찾아냈습니다. 이 모델은 실제 결정에 영향을 미쳤습니다. 저는 TAI 이사회에 합류했고, 존재조차 몰랐던 커뮤니티들을 발견했으며, 디모인과 해안 지역 생태계 간의 밀도 차이를 분석했습니다.

그 모델은 제 머릿속에 깊이 각인되었습니다. Brale에서 근무한 수년 동안, 힘 기반(force-directed) 관계 그래프는 끊임없이 등장했습니다. 발행자를 자산과 레일에 매핑하고, 프로그램 운영자를 그들이 운영하는 블록체인과 연결하는 식이었죠. 매번 누군가가 시각적 언어를 새롭게 재창조합니다. 색상은 무엇을 의미할까요? 굵은 선은 무엇을 나타낼까요? 기업, 개인, 사건을 구분하는 모양은 무엇일까요? 이러한 결정들은 프로젝트마다 새롭게 내려집니다. 그래프를 여는 다음 사람은 내용을 파악하기 전에 이 모든 것을 역설계해야만 합니다.

작년, CSF(Commons Stablecoin Format)는 자금 흐름을 그리는 방식을 표준화했습니다. 사양을 LLM에 붙여넣고 ‘stablecoin’ 자금 흐름을 요청하면, 매번 그 형식을 따릅니다. 저는 관계 그래프에 대해서도 같은 방식을 원했습니다. 그래서 ‘그래핑 표준 형식(Graphing Standard Format, GSF)’을 작성했습니다. 이는 유형이 형태를 결정하고, 가중치가 크기를 결정하며, 밀도 수준이 공개되는 정보를 제어하는 방식을 정의하는 간단한 문법입니다.

다음은 GSF로 렌더링된 제 네트워크입니다:

밀도
GSF v0.5.2

원은 사람입니다. 둥근 사각형은 조직입니다. 삼각형은 이벤트로, 이를 주최하는 회사와는 별개입니다. 마름모는 장소입니다. 육각형은 개념입니다. 알약 모양은 시스템입니다. 노드를 클릭하면 해당 프로필 카드를 볼 수 있습니다. 'Medium'으로 전환하면 색상을 확인할 수 있습니다. 이 모든 것을 직접 결정할 필요는 없었습니다. GSF가 알아서 처리했습니다.

다음은 GSF를 처음 사용하는 방법을 보여주는 동영상입니다. 꽤 잘 해냈네요!

GSF와 CSF

CSF GSF
출력 머메이드 시퀀스 다이어그램 D3 관계 그래프
정답 값이 A에서 B로 순서대로 어떻게 이동하는지 무엇이 존재하며 어떻게 연결되어 있는지
자연 시간적, 단계별 순서 구조적, 비시간적
수준 가볍음 / 중간 / 무거움 경량 / 중량 / 중대

두 모델 모두 ValueType, TransferType, Exchange와 같은 동일한 값 계층 프리미티브를 구현합니다. 그래프는 비시간적이기 때문에 CSF에서 GSF로 전환할 때 유일한 손실은 시퀀스 순서입니다.

표준

GSF는 시각화 자체를 정의하는 것이 아니라 시각화를 위한 규칙을 추상화합니다. 이를 사용하면 표시할 내용을 정의하면, 포맷이 표시 방식을 처리합니다. 기준은 프로젝트 전반에 걸쳐 일관성을 유지합니다.

세 가지 사항:

  • GSF는 규칙 집합입니다. 절대 시각화되지 않습니다.
  • 데이터셋은 {view, nodes, links} GSF를 준수하는 인스턴스입니다. 이것이 렌더링되는 대상입니다.
  • 렌더러는 규칙과 데이터셋을 받아 그림을 그립니다.

네 가지 기본 요소. 렌더러에 필요한 모든 것:

  1. 관계 – 정확히 두 개체 간의 연결입니다. 이러한 연결이 그래프를 형성합니다.
  2. 유형(Type) – 질적 분류자입니다. 모양과 색상을 결정합니다.
  3. 변수 – 세부 정보를 담는 용기입니다. 유형이 다루지 않는 모든 것을 포함합니다.
  4. 가중치 – 양적 크기. 크기와 너비를 결정합니다.

인코딩 규칙: 값(value) 대 값들(values). 하나의 정량적 값(숫자로, weight)는 크기와 너비를 결정합니다. 질적 값(범주, 상태, 레이블)은 모양, 색상, 그룹화, 그리고 마우스를 올렸을 때 표시되는 내용을 결정합니다.

특히 주목할 만한 디자인 선택 사항 하나: 관계 유형은 개방형 문자열입니다. 고정된 목록은 없습니다. 데이터셋은 필요한 유형을 자유롭게 정의합니다 – 위의 그래프에서는 founder, cofounder, spinoutoperates를 사용했는데, 이 중 어느 것도 사양에 포함되어 있지 않습니다. 그래도 문제없이 렌더링되었습니다. GSF는 인코딩(유형이 어떻게 모양과 색상으로 변환되는지)을 수정할 뿐, 어휘(사용할 수 있는 유형)는 수정하지 않습니다.

밀도

CSF와 동일한 조절 장치입니다. 렌더러가 드러내는 세부 정보와 색상의 양:

  • 낮음 – 흑백. 도형은 유형을, 선 스타일은 관계 클래스를(실선 = 값, 파선 = 데이터, 점선 = 파생값), 선 두께는 크기를, 화살표 머리는 방향을 나타냅니다. 색상은 없습니다. 인쇄용입니다.
  • 중간 – 오버레이, 범례, 마우스 오버 시 표시되는 변수 형태로 색상을 추가합니다.
  • 상세 – 전체 기록. 모든 변수, 전송 종단점, 확장 가능성.

단 하나의 규칙: ‘Light’ 모드는 흑백으로도 읽혀야 합니다. 색상은 절대 유일한 신호가 되어서는 안 됩니다.

형식

링크에는 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_typetransfer_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. 포크하고, 사용하고, 기여해 주세요.

구조는 자유롭습니다.