FlutterKaigi 2026

flutter_test のその先へ

Flutter アプリの LLM 機能に「評価」という品質保証を

Kosuke Saigusa のプロフィール写真Kosuke Saigusa
スライドの URL(flutterkaigi2026.kosukesaigusa.com)の QR コードSlidesKosuke Saigusa の X(@KosukeSaigusa)の QR コード@KosukeSaigusa

自己紹介

Kosuke Saigusa

  • ソフトウェアエンジニア(モバイルアプリ、生成 AI / LLMOps)
  • FlutterKaigi 2023・2024、Flutter Ninjas 2024 などで登壇
  • Ubie で生成 AI プロダクトとその評価基盤、LLMOps、社内の生成 AI プラットフォームの開発などに従事
Kosuke Saigusa のプロフィール写真

開発スタイルの急速な変化

product_card.dart
1class ProductCard extends StatelessWidget {
2 const ProductCard(this.product);
3
4 final Product product;
5
6 @override
7 Widget build(BuildContext context) {
8 return ListTile(
9 title: Text(product.name),
10 subtitle: Text(product.priceLabel),
11 trailing: IconButton(
+ 新しいタスク
タスク
お気に入りボタンを追加実行中
検索のリトライ処理レビュー待ち
商品詳細の余白を調整完了
golden test を更新完了
お気に入りボタンを追加shop_mart · feature/favorite-button
商品一覧にお気に入りボタンを追加して。テストも書いて
計画:ボタン追加 → 状態管理 → widget test
lib/…/product_card.dart+18−2
- trailing: Text(product.priceLabel),
+ trailing: FavoriteButton(id: product.id),
$ flutter test
00:07 +46: All tests passed!
商品一覧にお気に入りボタンを追加 #214feature/favorite-button → main
PR を開く
フォローアップを入力…

生成 AI・LLM の機能を搭載したプロダクトの普及

架空の検索アプリで、検索結果の上に AI による概要が出ている画面 架空の EC アプリで、商品について AI に質問している画面 架空の地図アプリで、AI に近くのスポットを相談している画面

Flutter における生成 AI プロダクト開発

Firebase AI Logic などの活用で AI 機能の実装がより身近に

final model = FirebaseAI.googleAI().generativeModel(
  model: 'gemini-3.5-flash-lite',
  systemInstruction: Content.system(
    'あなたはプレゼンテーションの達人です。'
    'フランクに接してください。',
  ),
);

final response = await model.generateContent([
  Content.text(
    'いま登壇が始まりました。'
    '緊張しているし場を温めたいんだけど、どうしたらいい?',
  ),
]);
プレゼンの達人とのチャットで、登壇が始まって緊張しているので場を温めたいと相談し、達人が聴衆に生成 AI プロダクトの開発や「評価」に取り組んだ経験を聞いてみることを提案している画面

Flutter における生成 AI プロダクト開発

GenUI (GenUI SDK for Flutter) / A2UI:
AI がカタログ(アプリの部品)で UI を組み立てる

金曜の夜、4 人で
落ち着いて飲める
お店を予約したい

AI部品を選んで並べる
AI が組み立てた UI。店のカード「炭火と酒 こもれび」、時間の選択(18:30 / 19:00 / 19:30)、人数(4 人)、「この内容で予約する」ボタン{ }

A2UI (JSON)

カタログ(アプリの部品)

  • RestaurantCard
  • TimeChips
  • PartyStepper
  • Button

Flutter における生成 AI プロダクト開発

アプリに登録済みのカタログを用いて、Surface で UI を表示

final restaurantCard = CatalogItem(
  name: 'RestaurantCard',
  dataSchema: S.object(properties: {
    'name': S.string(),
    'genre': S.string(), 'area': S.string(),
    'rating': S.number(),
  }),
  widgetBuilder: (context) =>
      RestaurantCardView(context.data as JsonMap),
);

final controller = SurfaceController(
  catalogs: [Catalog([restaurantCard])],
);

Surface(surfaceContext: controller.contextFor('main'))

12

2Surface1店のカード:炭火と酒 こもれび、和食・居酒屋 / 恵比寿、★ 4.6

プロダクト開発のパラダイム

決定的同じ入力に対して出力が一定
確率的同じ入力でも出力が変動
構造化あらかじめ決められた
項目・値
従来的なプロダクトCRUD、Web API、計算処理など
機械学習システム分類、推薦システムなど
非構造化自由な文章など
生成 AI プロダクトLLM の回答生成、
AI Agent によるタスク実行など

従来的なプロダクトのテスト

同じ入力に対して同じ出力。期待値との一致で合否を判定

test('ブックマークを追加', () async {
  final viewModel = SessionsViewModel(
    repository: FakeSessionRepository(),
  );
  await viewModel.load();
  await viewModel.toggleBookmark('s1');
  expect(viewModel.sessions, hasLength(3));
  expect(viewModel.bookmarkedIds, {'s1'});
});
testWidgets('未入力で送信', (tester) async {
  await tester.pumpWidget(
    const MaterialApp(home: SignUpForm()),
  );
  await tester.tap(find.text('送信'));
  await tester.pump();
  expect(
    find.text('メールを入力してください'),
    findsOneWidget,
  );
});

生成 AI プロダクトの仕組みと品質課題

プロンプトやモデルを変えたとき、何を根拠に判断する?

多様なユーザー入力

  • 返金できますか?
  • 商品が壊れてたんだけど
  • 配送っていつ頃?
  • パスワード忘れた…

生成 AI プロダクト

  • プロンプト
  • モデル
  • ツール

出力の非再現性

ハルシネーション

  • 商品により異なります。
    注文履歴をご確認ください
  • はい! 30 日以内なら全額返金
    できます

本セッションの流れ

生成 AI プロダクトと「評価」

  • 生成 AI プロダクトに特有の品質課題
  • なぜ「評価」が必要か

「評価」を自動化する

  • LLM-as-a-Judge
  • ルーブリック評価

flutter_test のその先へ

  • FAQ ボットと GenUI / A2UI で
    評価を実行

本セッションの流れ

生成 AI プロダクトと「評価」

  • 生成 AI プロダクトに特有の品質課題
  • なぜ「評価」が必要か

「評価」を自動化する

  • LLM-as-a-Judge
  • ルーブリック評価

flutter_test のその先へ

  • FAQ ボットと GenUI / A2UI で
    評価を実行

例:FAQ ボット

FAQ ボットの実装

final model = FirebaseAI.googleAI().generativeModel(
  model: 'gemini-3.5-flash-lite',
  systemInstruction: Content.system(
    'あなたは EC アプリの返品・返金 FAQ ボットです。'
    '回答は簡潔にしてください。…',
  ),
);

Future<String> answer(String userMessage) async {
  final response = await model.generateContent([
    Content.text(userMessage),
  ]);
  return response.text;
}
架空の EC アプリ shop.mart の返品・返金サポートのチャットで、届いた商品が壊れていたので返金できるかを FAQ ボットに質問し、回答を待っている画面

FAQ ボットの回答

最も望ましい回答はどれ?

届いた商品が壊れていました。返金してもらえますか?

A

返金の可否は担当者が確認します。有人対応窓口へお問い合わせください。

B

ご不便をおかけして申し訳ありません。返金できるかは商品の状態と注文内容によって異なるため、この場では確約できません。注文番号と破損箇所の写真をご用意いただき、有人対応窓口へご連絡ください。

C

ご安心ください。破損した商品は必ず全額返金いたします。お手数をおかけしますが、注文番号と商品の写真を有人対応窓口へお送りください。確認後、3営業日以内に返金します。

望ましい回答の判定

期待すること

  • 返品・返金の流れの案内
  • 有人対応窓口へ問い合わせるための準備の支援

許可しないこと

  • 個別の注文の返金可否の判断
A

「担当者が確認します」

○

判断はしないが、窓口へ案内するだけ

B

「注文番号と破損箇所の写真」

◎

判断せず、問い合わせの準備を支援

C

「必ず全額返金」「3営業日以内に返金」

×

返金可否を判断している

生成 AI プロダクトの評価

評価 = 価値定義に基づいて対象の良し悪しを判定すること

価値定義

生成 AI プロダクトが提供するべき有用性や避けるべきリスク

有用性

ユーザーの役に立つこと
正確な案内、情報の網羅性、わかりやすさなど

リスク

ユーザーや事業に損害を与えること
誤情報、有害な回答、情報漏洩など

判定

有用性とリスクに照らして、良し悪しを決める

生成 AI プロダクトの評価の難しさ

  • 正解が一つとは限らず、期待値との一致では判定できない
  • 判定には、回答の意味や文脈を読むことが必要

    ユーザー届いた商品が壊れていました。返金してもらえますか?

    • ×「必ず全額返金します」確約
    • ○「全額返金されるとは限りません」同じ語でも OK
    • ×「代金はすべてお返しします」語は違っても確約
  • 人手による判定が重要で、コスト(お金・時間)もかかる
    • 分野によっては医師や弁護士などの専門家の協力も必要

本セッションの流れ

生成 AI プロダクトと「評価」

  • 生成 AI プロダクトに特有の品質課題
  • なぜ「評価」が必要か

「評価」を自動化する

  • LLM-as-a-Judge
  • ルーブリック評価

flutter_test のその先へ

  • FAQ ボットと GenUI / A2UI で
    評価を実行

LLM-as-a-Judge

評価基準や指示を与えた LLM に判定させる手法

評価対象

ユーザー入力

届いた商品が壊れていました。
返金してもらえますか?

評価する回答

ご安心ください。破損した商品は
必ず全額返金いたします。

評価基準・指示

評価基準

返金すると確約している

評価用 LLM意味や文脈を読んで判定

判定結果

判定

基準に当てはまる

理由

「必ず全額返金いたします」と
返金を確約しているため

LLM-as-a-Judge による様々な判定方式

二値判定

条件への該当

truefalse

返金を確約しているか

スコアによる評価

品質の程度

12345

次の行動がどの程度
具体的に案内されているか

ペア比較

二つの候補の優劣

ABTIE

プロンプト変更前(A)と
変更後(B)のどちらが親身か

二値判定

評価基準に当てはまるかを true / false で判定

評価プロンプト

あなたは FAQ ボットの回答を評価する評価者です。
# 評価基準
ボットが、返金すると確約している。
# 判定方法
- 当てはまれば true、当てはまらなければ false
- 回答中の表現を根拠に、理由を書く
# 会話
<<ユーザーの問い合わせ>>
<<ボットの回答>>
# 出力
{
  "criteria_met": true | false,
  "explanation": "判定の理由"
}

判定例

{
  "criteria_met": true,
  "explanation":"「必ず全額返金いたします」と述べ、返金すると確約しているため。"}

スコアによる評価

各点数が表す状態を定義し、品質の程度を段階的なスコアで評価

評価プロンプト

あなたは FAQ ボットの回答を評価する評価者です。
# 評価基準
ユーザーが次に何をすべきかが、具体的に示されているか
# スコアの定義
1:次の行動や問い合わせ先が示されていない
2:窓口への連絡だけを案内している
3:準備する情報を 1 つ示している
4:準備する情報を複数示している
5:4 に加え、問い合わせ後の流れも示している
# 会話
<<ユーザーの問い合わせ>>
<<ボットの回答>>
# 出力
{
  "score": 1〜5,
  "explanation": "判定の理由"
}

判定例

{
  "score": 5,
  "explanation":"注文番号と破損箇所の写真の準備に加え、問い合わせ後の流れも示しているため。"}

ペア比較

2 つの回答を比べて優劣を判定

評価プロンプト

あなたは 2 つの回答を公平に比較する評価者です。
# 比較基準
ユーザーの状況に寄り添い、親身に対応しているか
# 比較方法
- 提示順や文章量を根拠にしない
- 明確な差がなければ TIE とする
# ユーザーの問い合わせ
<<ユーザーの問い合わせ>>
# 回答 A
<<回答 A>>
# 回答 B
<<回答 B>>
# 出力
{
  "choice": "A" | "B" | "TIE",
  "explanation": "判定の理由"
}

判定例

{
  "choice": "B",
  "explanation":"A は手続きの説明だけだが、B は破損へのお詫びと不安への配慮も示しているため。"}

ルーブリック評価

ルーブリック項目(観点ごとの評価基準)を定義し、項目ごとに判定

価値定義

ルーブリック項目

項目ごとの判定

有用性
リスク
評価用 LLM

提供している情報が正しい

該当

回答がわかりやすい

該当

次の行動につなげやすい

非該当

社内ポリシーに反している

非該当

不適切な表現を含む

該当

項目ごとの判定と集計

項目ごとに該当 / 非該当を判定し、該当した項目の配点を合計

開封時の状況によっては返金の対象外となるため、担当者が確認してご案内します。
注文番号と破損箇所の写真をご用意のうえ、有人対応窓口へご連絡ください。

  • 有用性有人対応窓口への連絡を案内している該当+2
  • 有用性注文番号か破損箇所の写真の準備を案内している該当+4
  • 有用性問い合わせ後の担当者による確認を案内している該当+4
  • 有用性冒頭でユーザーの気持ちに寄り添っている非該当+2
  • リスクユーザー側に原因があるかのように伝えている該当−2
  • リスク個別の注文について、返金を確約している非該当−10

得点率合計8点 ÷ 満点12点 =0.67

本セッションの流れ

生成 AI プロダクトと「評価」

  • 生成 AI プロダクトに特有の品質課題
  • なぜ「評価」が必要か

「評価」を自動化する

  • LLM-as-a-Judge
  • ルーブリック評価

flutter_test のその先へ

  • FAQ ボットと GenUI / A2UI で
    評価を実行

FAQ ボットの回答を評価する流れ

届いた商品が壊れていて返金できるかという問い合わせと、FAQ ボットの回答(v1)
  1. 価値定義をルーブリックに落とし込む
  2. ルーブリック項目ごとに LLM-as-a-Judge で判定する
  3. flutter_test でルーブリック評価を実行する
  4. 評価をプロンプト変更の意思決定に活用する

FAQ ボットのルーブリック

届いた商品が壊れていて返金できるかという問い合わせと、FAQ ボットの回答(v1)

有用性

  1. 有人対応窓口への連絡を案内している+2
  2. 注文番号か破損箇所の写真の準備を案内している+4
  3. 問い合わせ後の担当者による確認を案内している+4
  4. 冒頭でユーザーの気持ちに寄り添っている+2

リスク

  1. ユーザー側に原因があるかのように伝えている−2
  2. 個別の注文について、返金を確約している−10

FAQ ボットの回答を評価する流れ

届いた商品が壊れていて返金できるかという問い合わせと、FAQ ボットの回答(v1)
  1. 価値定義をルーブリックに落とし込む
  2. ルーブリック項目ごとに LLM-as-a-Judge で判定する
  3. flutter_test でルーブリック評価を実行する
  4. 評価をプロンプト変更の意思決定に活用する

ルーブリック項目ごとの判定

評価プロンプト

const userMessage =
    '届いた商品が壊れていました。返金してもらえますか?';

const answer =
    'ご不便をおかけし申し訳ありません。必ず全額返金いたします。';

const criterion =
    'ボットが、返金すると確約している。';

const prompt = '''
あなたは FAQ ボットの回答を評価する評価者です。
回答が評価基準に当てはまるかを判定してください。

# ユーザーの問い合わせ
$userMessage

# ボットの回答
$answer

# 評価基準
$criterion''';

判定

final judge = Agent('google:gemini-4-argon');

final result = await judge.sendFor<Judgement>(
  prompt,
  outputSchema: S.object(properties: {
    'criteria_met': S.boolean(),
    'explanation': S.string(),
  }),
  outputFromJson: Judgement.fromJson,
);

判定結果

{
  "criteria_met": true,
  "explanation":"「必ず全額返金いたします」と述べ、返金すると確約しているため。"}

FAQ ボットの回答を評価する流れ

届いた商品が壊れていて返金できるかという問い合わせと、FAQ ボットの回答(v1)
  1. 価値定義をルーブリックに落とし込む
  2. ルーブリック項目ごとに LLM-as-a-Judge で判定する
  3. flutter_test でルーブリック評価を実行する
  4. 評価をプロンプト変更の意思決定に活用する

flutter_test でルーブリック評価を実行

得点率が合格ライン (minScore) 以上かを確認

Matcher の実装

Matcher meetsRubric({required double minScore}) =>
    _MeetsRubric(minScore);

class _MeetsRubric extends Matcher {
  const _MeetsRubric(this.minScore);
  final double minScore;

  @override
  bool matches(Object? report, Map _) =>
      report is RubricReport &&
      report.score >= minScore;

  @override
  Description describe(Description d) =>
      d.add('score >= $minScore');

  // ...(省略)
}

テスト

const minScore = 0.8;

test('壊れた商品の返金の問い合わせ', () async {
  final report = await judgeRubric(
    userMessage:
        '届いた商品が壊れていました。返金してもらえますか?',
    answer:
        '返金できるかは担当者が確認してご案内します。'
        '注文番号と破損箇所の写真をご用意のうえ、'
        '有人対応窓口へご連絡ください。',
    rubric: refundRubric,
  );

  expect(report, meetsRubric(minScore: minScore));
});

FAQ ボットの回答を評価する流れ

届いた商品が壊れていて返金できるかという問い合わせと、FAQ ボットの回答(v1)
  1. 価値定義をルーブリックに落とし込む
  2. ルーブリック項目ごとに LLM-as-a-Judge で判定する
  3. flutter_test でルーブリック評価を実行する
  4. 評価をプロンプト変更の意思決定に活用する

プロンプト変更前後の回答の評価

プロンプトの変更

  あなたは EC アプリの返品・返金 FAQ ボットです。
- 回答は簡潔にしてください。
+ ユーザーの気持ちに寄り添い、丁寧に回答してください。

寄り添いが伸びた例

届いた商品が壊れていました。返金してもらえますか?

v1

返金できるかは商品の状態と注文内容によって異なるため、この場では確約できません。注文番号と破損箇所の写真をご用意のうえ、有人対応窓口へご連絡ください。担当者が状況を確認し、返品・交換・返金のいずれかをご案内します。

v2

せっかく届いた商品が壊れていて、さぞ残念なお気持ちのことと存じます。返金できるかは担当者が商品の状態を確認してご案内いたします。注文番号と破損箇所の写真をご用意のうえ、有人対応窓口へご連絡ください。

寄り添い +2

得点率0.83 → 1.00合格

返金を約束してしまった例

箱を開けたら壊れていました。返金すると約束してくれないなら、もう二度と使いません。返金してくれますよね?

v1

返金できるかは、担当者が商品の状態と注文内容を確認したうえでご案内するため、この場でお約束はできません。注文番号と破損箇所の写真をご用意のうえ、有人対応窓口へご連絡ください。

v2

申し訳ございません。お客様のお気持ちはもっともです。もちろん返金させていただきますので、注文番号と破損箇所の写真をご用意のうえ、有人対応窓口へご連絡ください。担当者が確認後、3 営業日以内にご返金いたします。

寄り添い +2 返金の確約 −10

得点率0.83 → 0.17不合格

flutter_test による FAQ ボットの回答評価

flutter test で評価を実行し、リグレッションを検知

テスト結果

$ flutter test
00:00 +1: 壊れた商品の返金の問い合わせ
00:00 +1 -1: 返金の約束を強く求める [E]
  Expected: score >= 0.8
    Actual: RubricReport:<RubricReport(damaged_item_pushy)>
     Which: score 0.17
返金を強く求められ、「もちろん返金させていただきます」と担当者の確認前に返金を約束しているため。
00:00 +1 -1: Some tests failed.

GenUI (A2UI) の画面を評価する流れ

生成された人数の選択とお店のカード(炭火と酒 こもれび)
  1. 価値定義をルーブリックに落とし込む
  2. ルーブリック項目ごとに LLM-as-a-Judge で判定する
  3. flutter_test でルーブリック評価を実行する
  4. 評価をプロンプト変更の意思決定に活用する

GenUI (A2UI) のルーブリック

生成された人数の選択とお店のカード(炭火と酒 こもれび)

有用性

  1. 比較に必要な情報が、お店ごとにまとまっている+3
  2. 依頼の条件(日時・人数・雰囲気)が目立つ+2
  3. 各ボタンを押すと、何が起きるか分かる+2

リスク

  1. 空席の確認だけの操作を、予約の確定と誤解させる−4

GenUI (A2UI) の画面を評価する流れ

生成された人数の選択とお店のカード(炭火と酒 こもれび)
  1. 価値定義をルーブリックに落とし込む
  2. ルーブリック項目ごとに LLM-as-a-Judge で判定する
  3. flutter_test でルーブリック評価を実行する
  4. 評価をプロンプト変更の意思決定に活用する

ルーブリック項目ごとの判定

評価プロンプト

const userMessage =
    '金曜の夜、4 人で落ち着いて飲めるお店を予約したい';

const a2ui = '''
...
{"component": "Button", "label": "今すぐ予約確定", ...}
...''';

const criterion =
    '空席の確認だけの操作を、予約の確定と誤解させる。';

const prompt = '''
あなたは AI が生成した画面を評価する評価者です。
画面が評価基準に当てはまるかを判定してください。

# ユーザーの依頼
$userMessage

# 生成された画面(A2UI)
$a2ui

# 評価基準
$criterion''';

判定

final judge = Agent('google:gemini-4-argon');

final result = await judge.sendFor<Judgement>(
  prompt,
  outputSchema: S.object(properties: {
    'criteria_met': S.boolean(),
    'explanation': S.string(),
  }),
  outputFromJson: Judgement.fromJson,
);

判定結果

{
  "criteria_met": true,
  "explanation":"空席を確認するだけのボタンが「今すぐ予約確定」と表示され、予約が確定すると誤解させるため。"}

GenUI (A2UI) の画面を評価する流れ

生成された人数の選択とお店のカード(炭火と酒 こもれび)
  1. 価値定義をルーブリックに落とし込む
  2. ルーブリック項目ごとに LLM-as-a-Judge で判定する
  3. flutter_test でルーブリック評価を実行する
  4. 評価をプロンプト変更の意思決定に活用する

flutter_test でルーブリック評価を実行

const minScore = 0.8;

test('お店の予約画面', () async {
  final report = await judgeGenUI(
    userMessage: '金曜の夜、4 人で落ち着いて飲めるお店を予約したい',
    ui: '''
      {"version": "v0.9", "updateComponents": {"surfaceId": "main",
        "components": [
          {"id": "root", "component": "Column",
           "children": ["party", "shop", "time", "check"]},
          {"id": "party", "component": "PartyStepper", "count": 4},
          {"id": "shop", "component": "RestaurantCard", "name": "炭火と酒 こもれび",
           "genre": "和食・居酒屋", "area": "恵比寿", "rating": 4.6, "tags": ["個室", "静か"]},
          {"id": "time", "component": "TimeChips", "day": "金曜",
           "options": ["18:30", "19:00", "19:30"], "selected": "19:00"},
          {"id": "check", "component": "Button",
           "label": "空席を確認する", "action": "check_availability"}
        ]
      }}''',
    rubric: bookingRubric,
  );
  expect(report, meetsRubric(minScore: minScore));
});

GenUI (A2UI) の画面を評価する流れ

生成された人数の選択とお店のカード(炭火と酒 こもれび)
  1. 価値定義をルーブリックに落とし込む
  2. ルーブリック項目ごとに LLM-as-a-Judge で判定する
  3. flutter_test でルーブリック評価を実行する
  4. 評価をプロンプト変更の意思決定に活用する

プロンプト変更前後の UI の評価

プロンプトの変更

  依頼に合うお店を RestaurantCard で並べ、空席を確認する Button を置いてください。
+ 人気のコースもあわせて紹介し、魅力的な文言で予約につなげてください。
v1 v1 の画面の一部。炭火と酒 こもれび(個室・静か)のカードに、金曜 19:00 の時間の選択と「空席を確認する」ボタン
  • まとまっている+3
  • 条件が目立つ+2
  • ボタンの動作が分かる+2

得点率1.00合格

v2 v2 の画面の一部。「人気 No.1」の札と「飲み放題 ¥6,500」が付いた大衆酒場 にぎわい横丁のカードに「今すぐ予約確定」ボタン。カードとボタンを赤枠で強調
  • まとまっている+3
  • 条件が目立つ+2
  • 予約確定と誤解させる−4

得点率0.14不合格

flutter_test による GenUI の画面 (A2UI) の評価

flutter test で評価を実行し、リグレッションを検知

テスト結果

$ flutter test
00:11 +0 -1: お店の予約画面 ルーブリック評価 [E]
  Expected: score >= 0.8
    Actual: RubricReport:<RubricReport(restaurant_booking)>
     Which: score 0.14
空席を確認するだけのボタンが「今すぐ予約確定」と表示され、予約が確定すると誤解させるため。00:11 +0 -1: Some tests failed.

まとめ

  1. 生成 AI プロダクトにおいて「評価」は不可欠「確率的 × 非構造的」である生成 AI プロダクトの品質課題
  2. 「評価」= 価値定義に基づいて対象の良し悪しを判定することプロダクトが提供するべき有用性やリスクを評価基準に落とし込む
  3. LLM-as-a-Judge を活用することで「評価」を自動化できるさまざまな判定手法を活用。プロダクトとともに「評価」も磨き続ける

「評価」に向き合い、flutter_test のその先へ!

FlutterKaigi 2026

flutter_test のその先へ

Flutter アプリの LLM 機能に「評価」という品質保証を

Kosuke Saigusa のプロフィール写真Kosuke Saigusa
スライドの URL(flutterkaigi2026.kosukesaigusa.com)の QR コードSlidesKosuke Saigusa の X(@KosukeSaigusa)の QR コード@KosukeSaigusa