メインコンテンツまでスキップ
バージョン: 2025-11-14

3. ネットワーク計算サービス仕様 (NetworkXMCP)

前提知識レベル:

  • マイクロサービスの概念
  • NetworkXライブラリに関する知識
  • FastAPIに関する開発経験

NetworkXMCPは、ネットワークに関する計算処理と、その結果の永続化に特化したステートフルなマイクロサービスです。

3.1. 役割​

  • APIサービスからCPU負荷の高い計算処理をオフロードする。
  • データベースに直接接続し、計算結果(レイアウト座標、中心性指標など)を、ネットワークの永続的な属性として型別に分離されたテーブル(node_float_attribute_valuesなど)に永続化する。
  • 属性が未計算の場合のみNetworkXライブラリを利用して計算を実行する。
  • LLMが定義した動的なリクエストに基づき、属性計算、レイアウト計算、視覚マッピングを一度に実行し、最終的なレンダリングデータを生成して返す。
  • 様々な形式のGraphMLファイルをシステムで一貫して扱える標準形式に変換・正規化する。

3.2. APIエンドポイント一覧​

APIサービスから内部的に呼び出される、主要なツールエンドポイントです。

MethodPath説明
GET/healthサービスのヘルスチェックを行う。
GET/tools/list_attributesネットワークに存在する属性(計算済みまたは元から存在)の一覧を返す。
POST/tools/calculate_centrality中心性指標を計算し、その結果の値をnode_float_attribute_values等のテーブルに、定義をnode_attributes等のテーブルに保存する。
POST/tools/change_layoutネットワークレイアウトを計算し、ノードの座標の値をnode_float_attribute_values等のテーブルに、定義をnode_attributes等のテーブルに保存する。GraphMLアップロード時の初期レイアウト計算にも使用される。
POST/tools/generate_visualization**【新設】**レイアウト、ノードサイズ、ノードカラー等の視覚的割り当てに関するすべてのパラメータを受け取り、最終的なレンダリングデータを動的に生成して返す。
POST/tools/convert_graphmlアップロードされたGraphMLファイルを解析・修正し、正規化されたGraphMLを返す。(ステートレス)
正規化には、属性名の標準化、特定のデータ型への変換、欠損値の処理、およびシステムで一貫して扱えるGraphML形式への変換が含まれます。

3.3. API詳細​

/tools/calculate_centrality​

  • Request Body:
{
"network_id": "net_12345",
"centrality_type": "degree"
}
  • Response Body (Success):
{
"status": "success",
"message": "Degree centrality calculated and saved as 'degree_centrality' attribute."
}

/tools/generate_visualization​

  • Request Body:
{
"network_id": "net_12345",
"layout_config": {
"name": "spring",
"params": { "k": 0.1 }
},
"node_size_config": {
"attribute": "degree_centrality",
"scale_type": "LINEAR",
"min_size": 3,
"max_size": 25
},
"node_color_config": {
"attribute": "community_id",
"scale_type": "CATEGORICAL",
"color_map": {
"0": "#ff6384",
"1": "#36a2eb",
"2": "#ffce56"
}
}
}
  • Response Body (Success):
{
"nodes": [
{
"id": "node1",
"label": "Node 1",
"x": 0.123,
"y": 0.456,
"size": 15.2,
"color": "#ff6384"
}
],
"links": [
{
"source": "node1",
"target": "node2",
"width": 1,
"color": "#cccccc"
}
]
}

/tools/change_layout​

  • Request Body:
{
"network_id": "net_12345",
"layout_name": "spring"
}
  • Response Body (Success):
{
"status": "success",
"message": "Layout calculated and node positions saved as attributes."
}

3.4. 設計思想: 動的なレンダリングデータ生成への責務集約​

本システムは、LLMのFunction Calling(ツール呼び出し)機能を最大限に活用するため、アーキテクチャを大きく変更しました。

旧設計では、「計算」と「視覚ルールの永続化」をNetworkXMCPが担い、「レンダリングデータの組み立て」をBackendが担うという、責務が分散した設計でした。これは状態管理を複雑にし、LLMの動的な指示に柔軟に対応する上での足枷となっていました。

新設計では、NetworkXMCPが「最終的なレンダリングデータを動的に生成する」という責務を一手に担います。

LLMは、ユーザーの「次数が多いノードを大きく、コミュニティごとに色分けして」といった指示を解釈し、一度のツール呼び出しで、レイアウト、ノードサイズ、ノードカラーの割り当て方法をすべて指定します。NetworkXMCPの/tools/generate_visualizationエンドポイントは、この指示書(リクエストボディ)に基づき、必要な属性計算(キャッシュがあれば利用)、マッピング処理、スタイル計算をすべて実行し、フロントエンドが直接描画できる最終的なJSONを返します。

この責務集約により、以下の利点が生まれます。

  • ステートレス化: 視覚ルールを永続化しないため、データベースの状態がシンプルになります。
  • 柔軟性の向上: LLMが対話の都度、最適な視覚表現をゼロベースで考案・指示できるため、より文脈に応じたインタラクティブな分析が可能になります。
  • シンプル化: Backendは、LLMからのツールコールをNetworkXMCPに中継し、結果をフロントエンドに流すだけの単純なプロキシとなり、システム全体のデータフローが大幅に簡潔になります。