TypeSafe AI Jev完全ガイド:型安全な意思決定の実装手順

TypeSafe AI Jevの完全ガイド。テキスト生成不要の型安全な意思決定モデルの実装手順をコード例とともに解説します。

投稿者 central
TypeSafe AI
ハイライト
  • Jevは文章を生成せず、選択肢、スコア、Yes/No確率の3種類の答えだけを返します。
  • カスタマーサポートのチケット分類では、各ラベルの確率と信頼度スコアを返すため、確信度が低い場合のみ人間にエスカレーションできます。
  • 投機的ファンアウトパターンでは、複数の意思決定を並列実行し、最も高い信頼度の結果を選択することでコスト効率を高めます。

TypeSafe AIが提供する「Jev」は、従来のLLM(大規模言語モデル)とは一線を画す、文章を一切生成しない「System One」モデルです。テキスト生成の代わりに、プログラムの状態(state)と型付きの質問を送信すると、コードが直接分岐できる選択肢、スコア、Yes/Noの確率を返します。本記事では、この型安全な意思決定システムの実装手順を、公式Python SDKの基本操作から本番運用を見据えた高度なパターンまで、コード例を交えながら徹底解説します。

Jevとは何か:テキストを生成しない新しい意思決定モデル

Jevは、TypeSafe AIが開発した最初のSystem Oneモデルです。従来のLLMがプロンプトに対する自然言語の応答を生成するのに対し、Jevは入力されたプログラム状態と型付きの質問群に対して、選択肢(Choice)、スコア(Score)、Yes/No確率(Noul)という3種類のプリミティブな答えだけを返します。これにより、出力をパースする必要がなく、型安全な形でそのままプログラムのロジックに組み込むことが可能です。

Jevの最大の特徴は、その応答が常に確率分布を伴うことです。たとえば、カスタマーサポートのチケットを「請求」「技術」「営業」のいずれかに分類する場合、単に「請求」というラベルを返すだけでなく、各ラベルの確率(例:請求=0.95、技術=0.03、営業=0.02)と信頼度スコアが返却されます。この情報を活用すれば、確信度が低い場合のみ人間のオペレーターにエスカレーションするといった、リスクに応じたルーティングが可能になります。また、文章生成を行わないため、ハルシネーション(幻覚)のリスクが構造的に低く、決定論的な動作が要求される業務システムとの親和性が非常に高い設計です。

基本セットアップ:SDKインストールとAPIキー管理

まずは公式Python SDKであるtypesafe-sdkをインストールします。チュートリアルではバージョン0.7.0に固定されており、環境変数TYPESAFE_API_KEYcodeからAPIキーを読み込みます。

APIキーの管理方法は、環境変数、Google Colabのシークレットタブ、または対話的な入力プロンプトの3つから選択できます。ノートブック上にキーがハードコードされないよう、getpasscodeモジュールを利用した隠蔽入力が推奨されています。クライアントはTypeSafeClient()codeをインスタンス化するだけで、環境変数から自動的にキーを読み取り、モデルのエイリアスjev-latestcodeに接続します。また、SDKには複数のモデルが用意されており、キーに紐づく利用可能なモデル名とリリース日を一覧表示できます。

3つのプリミティブ:Choice、Score、Noulの使い分け

JevのAPIリクエストは、分析対象の「状態」と、辞書形式で渡す「質問群」という2つの要素で構成されます。質問はそれぞれ名前を持ちますが、この名前はモデルに送信されない設計です。その代わり、各質問には命令文(instructions)と評価基準(criteria)を詳細に記述することで、モデルに意図を正確に伝えます。

Choice:カテゴリ分類の決定版

第一のプリミティブであるChoiceは、定義したラベル群から最適なものを選択するためのものです。たとえば、カスタマーサポートのチケットを「請求」「技術」「営業」のいずれかに分類する場合、各ラベルに説明文を付与してCriteriaとして渡します。応答には選択されたラベルに加えて、全ラベルの確率分布と信頼度(confidence)が含まれます。

Score:段階的な評価の実現

第二のScoreは、状態を順序付きのルーブリック(評価基準表)に当てはめるためのものです。0から始まる各レベルに説明文を定義し、モデルは確率加重平均を計算してスコアを返します。この仕組みにより、スコアが整数だけでなく、たとえば2.7のような中間値になることもあり、ニュアンスのある評価が可能です。

Noul:確率を直接扱うYes/No判定

第三のNoulは、特定の命題が真である確率を0.0から1.0の間で返します。たとえば「顧客が返金を明示的に要求している」や「ポリシーがこの状況をカバーしている」といった判定に使用します。Noulには信頼度フィールドがなく、その値自体がYesの確率を意味するため、0.5は「未決定」を示します。

これらのプリミティブは、単一のリクエスト内で並列かつ独立に評価されます。つまり、ある質問の答えが他の質問の結果に影響を与えることはありません。この独立性が後の「投機的ファンアウト」パターンの基盤となります。

状態設計の重要性:コンテキストの形状が回答を変える

Jevにとって、入力される「状態」こそが唯一の知識源です。チュートリアルでは、同じ質問「顧客は返金資格があるか」を、①文字列のみ、②会話の配列、③チケット・注文・ポリシーを含むJSONオブジェクト、という3つの異なる形状の状態に対して投げかけています。

結果は明確です。請求ポリシーや注文内容を含むオブジェクト形式の状態が最も高い確率で「返金資格あり」と判定します。これは、モデルが判断に必要な情報をすべて受け取った場合にのみ、正確な意思決定ができることを示しています。型付きのフィールド名を使用することで、命令文がticket.messages[0].textcodeのようにバックティック付きパスで特定の箇所を参照できるようになり、より精密な指示が可能になります。複数のコンテキストを持つ場合、公式ドキュメントでは名前付きフィールドの使用が強く推奨されています。

信頼度計算の数学と、あいまい入力への応答

APIが返す信頼度(confidence)は、実は応答に含まれる確率分布から再計算可能な統計量です。TypeSafeが公開する公式の計算式は以下の通りです。

信頼度 =(選択肢数 × 最大確率 − 1)÷(選択肢数 − 1)

たとえば、3つの選択肢があるChoiceでピーク確率が0.8の場合、信頼度は(3 × 0.8 − 1)÷(3 − 1)= 0.7となります。この計算式を使用すれば、独自の分析コード内で信頼度を再現でき、デバッグやモニタリングに活用できます。同様に、Scoreの期待値は各レベルとその確率の積の合計として再計算可能です。

チュートリアルでは、明確に怒りを含むメッセージと、意図的に曖昧にしたメッセージの両方を同じ質問に通すことで、信頼度の振る舞いを比較しています。曖昧なメッセージでは確率分布が平坦になり、結果として信頼度が低下します。この特性は、システムがあいまいさを認識して人間にエスカレーションするという、安全な運用設計の基礎となります。

投機的ファンアウト:10の質問を1回の呼び出しで処理する

Jevの設計上の大きな利点は、質問同士が互いに影響を与えないことです。この独立性を活用するのが「投機的ファンアウト」パターンです。将来必要になるかもしれない質問を、あらかじめまとめて1回のAPI呼び出しに含め、後から必要な回答だけを読み取ります。

チュートリアルでは、インシデントポストモーテム(事後分析レポート)に対して、根本原因、検知方法、重大度、コンプライアンス品質などの10の質問(Choice2つ、Score2つ、Noul6つ)を1回の呼び出しで実行し、その後、同じ質問をそれぞれ個別の呼び出しで実行して比較しています。結果は、1回のバッチ処理の方が約2.4倍高速で、入力トークンも約2.5倍少ないというものでした。速度とコストの差は、状態(ポストモーテム文書)を1回だけ送信すればよい点に起因します。さらに重要なのは、バッチ処理と個別処理で回答が完全に一致したことです。これは、質問が並列に評価されているという設計思想を実証しています。

信頼度ゲート付きルーティング:リスクに応じて変わるしきい値

型付きの答えの真価は、その後のコードロジックにあります。チュートリアルでは、銀行アシスタントのインテント分類を例に、信頼度ゲート付きルーティングを実装しています。

まず、ユーザーのメッセージを「残高照会」「送金承認」「請求異議」「口座解約」「その他」の5つのインテントに分類します。ここで重要なのは、各アクションに異なるリスクレベルを設定し、自動実行のための信頼度しきい値を変化させることです。

  • 残高照会:しきい値0.50(低リスク)
  • 請求異議:しきい値0.70
  • 送金承認:しきい値0.85
  • 口座解約:しきい値0.90(高リスク)

「その他」に分類された場合、または信頼度が0.50未満の場合は、常に人間のオペレーターにエスカレーションされます。また、認識されたインテントでも信頼度がしきい値に達しない場合は、ユーザーに確認を求めるフローに移行します。これらのしきい値はコード内に平文で存在するため、リスク許容度の変更はプロンプトを書き換えるのではなく、コードレビューとテストを経て実施できます。これは、金融や医療など規制の厳しい分野で決定的に重要な設計思想です。

コンポジットスコアリング:重み付けロジックをコードで保持する

複雑な評価(人材採用、プロジェクト優先順位付けなど)には、コンポジットスコアリングが有効です。これは、モデルには各次元の評価のみを依頼し、最終的な総合評価はコード側で重み付け計算するパターンです。

チュートリアルでは、4人の候補者を「Pythonの深さ」「MLシステム運用」「リーダーシップ」「コミュニケーション」という4つの次元でスコアリングしています。各次元は0から3までの4段階のルーブリックで評価され、スコアを最大レベルで割って0〜1に正規化します。その後、「シニアIC(個人貢献者)」と「チームリード」という2つの役割に対して、異なる重みベクトルを適用します。

このアプローチの利点は、再推論(API呼び出し)なしでランキングを変更できることです。たとえば、「チームリード」の役割では「リーダーシップ」の重みが0.45と高く設定されていますが、この値はコード中の辞書を変更するだけで更新できます。採用基準が変わっても、モデルへの再問い合わせは不要です。さらに、スコアの根拠をトレースできるため、人事部門が評価の理由を説明する際にも役立ちます。

型付き関数呼び出しと、Jevに適した計数方法

自然言語のコマンドをシステムの関数呼び出しに変換するのも、Jevの得意分野です。チュートリアルでは、スマートホームの制御コマンドを例に、ツールの選択と各引数の抽出をすべてChoiceプリミティブで実装しています。

  • ツール選択:「set_lights」「set_thermostat」「play_music」「none」から選択
  • ルーム指定:「living_room」「bedroom」などから選択
  • 各ツールの引数:ライトの状態(on/off/dim)、温度モード(heat/cool/eco)、音楽ジャンル(jazz/classicalなど)を個別に選択

すべての引数は投機的に1回の呼び出しで質問されます。コードは選択されたツールに属する引数のみを読み取り、複数の判断の中で最も低い信頼度をその呼び出し全体の信頼度として報告します。これにより、各引数が事前に定義された列挙値にバリデートされた上で、通常のPython関数が実行されます。

もう一つの重要なテクニックが計数方法です。Jevは単一の質問内で正確に数を数えるのが苦手という既知の制約があります。そこで、リスト内の各アイテムに対して1つずつNoul質問を生成し(例:item_0codeは果物か?)、その確率をコード側で合計することで正確な数を算出します。これは、モデルの不得意分野をAPIの設計思想に合わせて回避する良い例です。

本番運用のための実装パターン:非同期処理とエラーハンドリング

本番システムに組み込む際には、いくつかの追加パターンが必要になります。チュートリアルでは、以下の4つのポイントが示されています。

Pydanticによる型付きレスポンスモデル

SystemOneResponsecodeクラスをサブクラス化し、期待する回答の型(ChoiceAnswercode、ScoreAnswercode、NoulAnswercode)を宣言することで、応答を辞書ではなく属性としてアクセスできます。Pydanticによるバリデーションが行われるため、データ型の不一致は即座に検出されます。

asyncioによる並列処理

各リクエストが独立しているため、asyncio.gathercodeを使用して複数のリクエストを同時に送信できます。チュートリアルでは12件のチケットを並列処理し、壁時計時間を大幅に短縮しています。ノートブック環境でイベントループが既に存在する場合に備えたrun_asynccodeヘルパー関数も提供されています。

リトライポリシー

RetryPolicycodeクラスで、最大リトライ回数、バックオフの初期値、最大値、タイムアウトを設定可能です。これにより、一時的なAPIエラーやネットワーク障害からの回復が自動化されます。

型付きエラーハンドリング

エラーも型付けされています。たとえば、空の質問セットでリクエストを送信した場合は、API呼び出し前にTypeSafeErrorcodeとして検出されます。存在しないモデル名を指定した場合は、HTTPステータスコードを含むTypeSafeAPIErrorcodeがスローされます。これにより、例外処理が明確で予測可能になります。

運用コストの把握:トークン台帳による可視化

チュートリアルでは、全API呼び出しのトークン使用量を台帳(Ledger)に記録し、最後にコストを集計しています。Jevの入力トークン価格は100万トークンあたり0.042ドル(出力トークンは無料)とされ、チュートリアル全体のコストは約0.0005ドルと算出されています。これは、Jevが非常に低コストで大量の意思決定を処理できることを示しており、コストを気にせずに投機的ファンアウトパターンを利用できる実用的な利点です。

まとめ:Jevが切り開く型安全な意思決定の未来

Jevは、LLMを「文章生成ツール」ではなく「型付き判断エンジン」として再定義します。Choice、Score、Noulという3つのプリミティブは、確率分布を伴う決定論的な回答を返すため、コードは常に検証済みの値で分岐できます。信頼度ゲート、コンポジットスコアリング、投機的ファンアウトといったパターンは、いずれもJevの設計思想を最大限に活用するものです。

一方で、モデルの既知の制約(計数、算術、日付比較など)を理解し、それに合わせた実装パターンを採用することも重要です。Noulをアイテムごとに生成してコードで合計する計数方法はその良い例です。本番導入の際には、独自のデータセットで質問文、評価基準、しきい値の精度を評価し、リスクに応じた人間の介入ポイントを設計することが不可欠です。Jevは、AIの判断を信頼して自動化するための、堅牢で透明性の高い基盤を提供しています。

この記事をシェア