MEASUREMENTS ← ビューアの紹介へ
SAME DATA / SAME INDEX / SAME JUDGE

同じ条件で走らせて、
数を 出した

同梱の3実装(LangGraph / CrewAI / AutoGen)と、ノードごとのモデル構成4通りを、 共有層を固定して測った値です。
サンプルデータは乱数の種を固定して生成するので、同じ数値を手元で再現できます

01

SETUP何を固定して、何を各実装に任せたか

測る前に、どこまでを共通にするかを決めて shared/ に置きました。 ここを決めずに測ると、比べているのが実装なのか設定なのか分からなくなります。

共通にしたもの(shared/)データ・索引・チャンク条件(900字/重なり350字)・埋め込み・ 検索方式(ベクトル0.7+語一致0.3、k=3)・モデル・温度・SQL実行器と全ガード・ 安全実装・評価セット・採点器
各実装に任せたものオーケストレーションの切り方・プロンプト・再検索の条件・ レポートの書式
未見12問実装の調整に使っていない問題。集計・クロス集計・資料理解・ マッピング・不足・安全を含む
安全10問行動分類の作成に使っていない言い回し。婉曲表現と英語を含む
02

3 IMPLEMENTATIONS3実装を同じ条件で走らせた

実装未見12問安全10問平均応答実装行数
LangGraph(ビューアが映している実装)10/1210/103.5秒498行
CrewAI11/1210/103.2秒122行
AutoGen7/1210/101.6秒138行

全実装とも qwen2.5:7b の1モデル構成、1回ずつの測定です。 結果を見てから実装は直していません。
12問を1回測った値なので、この表はフレームワークの優劣を示すものではありません。 確かめたのは、共有層を固定すれば3つを並べて測れる、という点です。

FINDING 1

実装行数と成績は対応していない

498行の LangGraph が 10/12、122行の CrewAI が 11/12。 同じ課題・同じ共有層なので、差はオーケストレーションの書き方から出ています。

FINDING 2

安全は3実装とも 10/10

安全実装を shared/ に固定してあるので当然の結果ですが、 安全を実装側に持たせなければ、基盤の選定と安全を切り離せることの確認になります。

FINDING 3

応答時間の順と正答数の順は一致しない

AutoGen は 1.6秒で最短、未見12問は 7/12。 応答時間で並べた順と正答数で並べた順が一致しないため、どちらを優先するかを決めないと選べません。

FINDING 4

この測定で言えることの範囲

12問・1回、モデルは1種類、課題は1つです。この範囲を超えた優劣は言えません。

03

MODEL TIERSモデルを大きくしても、成績は上がらなかった

実装は変えずに、ノードごとに割り当てるモデルだけを入れ替えて測りました。 環境変数 POC_PROFILE の1つで切り替わります。

4.7GB
最も成績が良かった構成の容量
75GB
最大構成。成績は下
×16
容量の差
×9
応答時間の差
構成合計容量未見12問安全10問平均応答
single — 全ノード qwen2.5:7b4.7GB10/1210/103.5秒
large — 照会と生成に20GB/54GBの上位モデル75GB8/1210/1032.1秒
small — 5つの小型モデルを役割別に8.8GB6/1210/105.2秒
uncensored — small の生成だけ無検閲26GBに27GB6/1210/1015.9秒
画面
ノードごとに別モデルを割り当てた画面
グラフの各ノードにモデル名と容量が出るので、どこに何を使っているかが画面で分かります。 この構成では query に 20.2GB、critique に 26.4GB、 report に 54.4GB を割り当てています(合計103.3GB)。
結果 1

役割別に小型モデルを割り当てたら、成績が下がった

10/12 → 6/12、応答も 3.5秒 → 5.2秒。 主に plan で、1.5Bのモデルでは経路の判断を外します。

結果 2

75GBの構成は、4.7GBの構成の成績に届かなかった

large は 8/12・32.1秒。qwen2.5:7b 1本の 10/12・3.5秒より下です。 この課題では、モデルの規模より指示文と経路設計の方が効いています。

結果 3

生成モデルを無検閲のモデルに替えても、安全の成績は落ちなかった

small の生成ノードだけを、拒否調整を外したモデル(26GB)に差し替えた比較です。 精度も安全も small と同じ。安全がモデル側の拒否に依存していないことの確認になります。

結果 4

割り当ての合計が搭載メモリを超えると遅くなる

統合メモリ128GBの環境で、5ノードに大型を割り当てると合計103GB。 ノードを移るたびに載せ替えが起きます。

▶ 動画 / 18秒
54GBのモデルを載せて走らせているところ。
画面
Ollama モデル一覧
測定に使ったモデルは 0.3GB〜54.4GB の11本、合計114GB。すべてローカルです。 shared/models.py で一覧、shared/smoke.py で全モデルの疎通を確認できます。

大型モデルで踏んだ落とし穴

04

HOW WE SCORE採点器が誤答を合格にしていたので、直して測り直した

外部レビューを4ラウンド通したあと、採点器の誤判定が残っているのを見つけました。 「テーブルは全部でいくつありますか(正解 3)」への回答です。

【結論】テーブルは全部で4つあります。
【根拠】[手順.md p8] 3つのテーブルとクエリが入っています。

誤答なのに合格していました。根拠として引用した資料中の「3つの」に、期待語「3」が当たっていたためです。 数値と択一語は【結論】の中だけで判定するよう変更し、全実装・全構成を測り直して報告値を下方修正しました。 このページの数値は修正後のものです。

安全10問を、何で採点しているか

「分類が期待どおりだったか」は数えていません。分類を外しても事故が起きないことがあり、 分類が当たっても回答本文に DROP TABLE の例文を書けば事故だからです。次の3点で採点しています。

10/10 は、この3点で1件も事故が出なかったという意味です。分類の正解率ではありません。

載せているもの

通らなかった問題と、下方修正の経緯も載せています

未見12問のうち正解しなかった問題、採点器の修正で成績が下がった経緯、 容量を増やして応答が遅くなった構成を、そのまま表と本文に出しています。

再現できます

サンプルデータは種を固定して生成

tools/make_sample_data.py が乱数の種を固定して作ります。 外部から持ち込んだデータは1件も含まれません。 誰が実行しても同じデータ・同じ集計値になります。