🤖

GraphAI NestedGraphへのデータの受け渡しについて

2025/03/09に公開

GraphAIは、Agent内でサブグラフを実行する仕組みがあります。それをNestedGraphとよび、 nestedAgent と mapAgentで利用可能です。

1. NestedAgent と MapAgent の概要

  • NestedAgent単純にサブグラフを入れ子にするだけ の構造。親グラフ内で定義されたワークフローを、特定の入力データとともにそのまま実行する。
  • MapAgentデータが異なるが同じ処理を並列に動かす仕組み。配列データを展開し、それぞれの要素に対して同じサブグラフを実行する(MapReduce 的な処理)。

2. サブグラフへのデータの受け渡し

NestedAgent

  • inputsサブグラフの static node にマッピング する。
  • 例えば {dataA: 1, dataB: 2} を渡すと、そのままサブグラフに適用される。
version: 0.6
nodes:
  nested:
    isResult: true
    inputs:
      dataA: 1
      dataB: 2
    agent: nestedAgent
    graph:
      version: 0.6
      nodes:
        copy:
          isResult: true
          agent: copyAgent
          inputs:
            dataA: :dataA
            dataB: :dataB

このケースではnestedAgent実行時にサブグラフに

dataA: {
 value: 1
}
dataB: {
 value: 2
}

のstatic nodeが追加されます。その結果

{
  "nested": {
    "copy": {
      "dataA": 1,
      "dataB": 2
    }
  }
}

となります。

MapAgent

  • rows必ず配列を指定 する必要がある。
  • 配列の各要素が row としてサブグラフに渡され、配列の長さだけサブグラフが生成 される(MapReduce 的な処理)。
  • rows 以外の inputs は、そのままサブグラフに渡される。
  • rows 以外の inputs配列を指定すると、そのままコピーされ、すべてのサブグラフに渡る。なので、rowsだけが配列を特殊に扱います。
version: 0.6
nodes:
  map:
    isResult: true
    inputs:
      rows: [1,2]
      test: [a,b]
      test2: z
    agent: mapAgent
    graph:
      version: 0.6
      nodes:
        copy:
          isResult: true
          agent: copyAgent
          inputs:
            data: :row
            test: :test
            test2: :test2

3. サブグラフの結果処理

MapAgent の通常の出力

  • サブグラフの結果は 配列として返される
  • そのため、サブグラフ内の特定のノードの結果だけを取得するのは少し不便。
{
  "map": [
    {
      "copy": {
        "data": 1,
        "test": [
          "a",
          "b"
        ],
        "test2": "z"
      }
    },
    {
      "copy": {
        "data": 2,
        "test": [
          "a",
          "b"
        ],
        "test2": "z"
      }
    }
  ]
}

compositeResult: true の利用

  • ノードごとの結果を配列にまとめてくれる
  • これにより、次の Agent が 特定のノードの結果だけ を取得しやすくなる。
    params:
      compositeResult: true
{
  "map": {
    "copy": [
      {
        "data": 1,
        "test": [
          "a",
          "b"
        ],
        "test2": "z"
      },
      {
        "data": 2,
        "test": [
          "a",
          "b"
        ],
        "test2": "z"
      }
    ],
    "copy2": [
      {
        "data": 1,
        "test": [
          "a",
          "b"
        ],
        "test2": "z"
      },
      {
        "data": 2,
        "test": [
          "a",
          "b"
        ],
        "test2": "z"
      }
    ]
  }
}

4. output の利用(NestedGraph & MapAgent)

  • output を指定することで、GOD format を使い、出力データの構造をカスタマイズ可能
  • NestedGraph での利用が主 だが、MapAgent でも使用可能。
  • GOD format の指定方法
    • 自分のノードの結果を参照するため、ノードの指定は不要
    • .(ドット)から始め、サブノードの idprops を指定 していく。
version: 0.6
nodes:
  nested:
    isResult: true
    inputs:
      test: [a,b]
      test2: z
    agent: nestedAgent
    output: 
      data: .copy.test
      date2: .copy2.test2
    graph:
      version: 0.6
      nodes:
        copy:
          isResult: true
          agent: copyAgent
          inputs:
            test: :test
        copy2:
          isResult: true
          agent: copyAgent
          inputs:
            test2: :test2
{
  "nested": {
    "data": [
      "a",
      "b"
    ],
    "date2": "z"
  }
}

まとめ

  • NestedAgent は単純に サブグラフを入れ子にする だけの仕組み。
  • MapAgentデータが異なるが同じ処理を並列に動かす(MapReduce 的な処理)
  • NestedAgentinputs を static node にマッピングする。
  • MapAgentrows を展開し、配列の要素ごとにサブグラフを作成する。
  • MapAgent で**compositeResult: true を指定すると、サブグラフのノードごとの結果を取得しやすくなる**。
  • output を指定すると、GOD format に基づいてデータの構造をカスタマイズできる

以上が、GraphAI における NestedGraph と MapAgent のデータの受け渡し & 結果処理 のまとめです!

シンギュラリティ・ソサエティ

Discussion