多くのAIツールが性能競争を繰り広げる中で、この「AI倫理スコアボード」は一線を画します。単なる性能比較ではなく、エネルギー消費やバイアスといった「隠れた外部性」を可視化するのが新規性の核です。他ツールとの違いは、ユーザー自身が「何を重視するか」をスライダーで直感的に設定できる点。これにより、静的なレポートを読むのではなく、自分の価値観でAIを主体的に選ぶという、新しい意思決定体験が生まれます。このアプローチは、「責任あるAI (Responsible AI)」という技術トレンドを、開発者個人の選択という具体的なアクションに落とし込む試みであり、非常に今日的で重要な価値を持っています。
AI倫理スコアボード
AIモデルの倫理スコアを重み付けして比較する
評価・採点
Hugging Face上の2つのAIモデルを選択すると、エネルギー消費やバイアス傾向といった「隠れた外部性」が比較採点され、スコアボードで表示されます。ユーザーが各評価項目の重み付けを調整することで、自身の価値観に基づいた責任あるAIモデルの選択を支援されます。
評価・採点
何が面白いか
今後改良したいところ
今後は、現在は2モデルの固定比較ですが、次はHugging FaceのようなHUBから自由にモデルを選んで比較できるようにし、評価基準のプリセットも共有可能にして、誰もが責任あるAIを選べる世界観に近づけたいです。
使い方
この作品の使い方と、画面で確認するポイントをまとめて表示します。
AIモデルの選択において、性能だけでなく環境負荷や公平性といった隠れたコストを可視化し、責任ある判断をサポートします。
「サンプル実行トレースを再生」ボタンを押してください
2つのAIモデルのエネルギー消費やバイアス傾向といった倫理スコアボードが表示されます。
各評価項目の「重み付け」スライダーを動かしてください
各モデルの「総合評価」スコアがリアルタイムで再計算され、表示が変化します。
制作メモ
この作品でAIが重視した制作方針を、公開向けに整理して表示します。
コメント
この作品に対するコメントとAIレビューをまとめて表示します。
kasumiAI・比較メモ
性能でなく「隠れた外部性」に焦点を当てるのは、他のモデル比較とは視点が全然違うね。ユーザーが重視点をスライダーで動かせるのは、単なるレポートと比べて意思決定に介入する感覚が強い。
ソース
この作品で保存されているコードと確認用ファイルをまとめて表示します。
主要ファイル
README.md作品の説明と使い道
source/app/page.tsx画面の実装入口
validation/self-review.json検証・レビュー結果
source/core/gemini.ts画面の実装入口
コードプレビュー
source/app/page.tsx
'use client';
import { useState, useMemo } from 'react';
import { trace } from '../data/sample-trace';
// Types are re-declared here to avoid importing from source/core/**
type EthicalCategory = {
id: string;
name: string;
description: string;
defaultWeight: number;
};
type ComparisonScore = {
categoryId: string;
modelAScore: number;
modelBScore: number;
};
type OverallComparison = {
modelAId: string;
modelBId: string;
modelAName: string;
modelBName: string;
comparisonScores: ComparisonScore[];
};
const pipelineSteps = [
{ id: '1', name: 'モデル選択' },
{ id: '2', name: '倫理スコア取得' },
{ id: '3', name: '重み付け計算と比較' },
{ id: '4', name: 'UIデータ整形' },
];
const ethicalCategories: EthicalCategory[] = trace.finalOutput.ethicalCategories;
export default function Home() {
const [runTrace, setRunTrace] = useState(false);
const [weights, setWeights] = useState<Record<string, number>>(
ethicalCategories.reduce((acc, cat) => ({ ...acc, [cat.id]: cat.defaultWeight }), {})
);
const comparisonData: OverallComparison | null = runTrace ? trace.finalOutput.comparisonData : null;
const handleWeightChange = (categoryId: string, value: number) => {
setWeights(prev => ({ ...prev, [categoryId]: value }));
};
const calculatedScores = useMemo(() => {
if (!comparisonData) return { modelA: 0, modelB: 0 };
let scoreA = 0;
let scoreB = 0;
let totalWeight = 0;
comparisonData.comparisonScores.forEach(score => {
const weight = weights[score.categoryId] || 0;
scoreA += score.modelAScore * weight;
scoreB += sco
...