2018年,我构建了一个网络模型,旨在确定在爱荷华州科技圈中应将时间投入到哪些领域。该模型最终扩展至约10,000个要素——包括公司、组织、个人、城市以及连接关系。 我利用特征向量中心性,筛选出那些与我未建立联系、但在其他地方连接度较高的节点。这一模型影响了我的实际决策:我加入了TAI董事会,发现了此前未曾知晓的社区,并绘制了得梅因与沿海生态系统之间的连接密度差异图。

那个模型一直萦绕在我心头。在Brale工作的这些年里,基于力导向的关联图不断出现——将发行方映射到资产再到交易通道,将项目运营商与他们运行的区块链连接起来。 每次,总有人在重新定义这种可视化语言。某种颜色代表什么?粗线象征什么?哪种形状能区分公司、个人和事件?这些决策在每个项目中都要从头开始。下一个打开该图的人,必须先对所有元素进行逆向工程分析,才能读懂其中的内容。

去年,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. 类型——定性分类器。决定形状和颜色。
  3. 变量——细节容器。包含类型未涵盖的所有内容。
  4. 权重——定量指标。决定大小和宽度。

编码规则:值与值们。那个定量值(一个数字,由 weight)决定大小和宽度。定性值(类别、状态、标签)则决定形状、颜色、分组以及悬停时显示的内容。

值得特别指出的一项设计选择:关系类型是开放字符串。不存在封闭列表。数据集可自行定义所需的任何类型——我上文中的图表使用了 founder, cofounder, spinoutoperates,这些均未出现在规范中。渲染效果良好。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_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。欢迎分叉、使用并贡献代码。

结构是自由的。