はじめに
Convai Innovationsは、テキストとタイプ付き質問を入力すると約33ミリ秒で確率付きの回答を返す非自己回帰型の意思決定モデル「Laya」を、Apache 2.0ライセンスでHugging Faceに公開しました。本稿では、モデルカードの内容をもとに、Layaの仕組みとPythonでの実装方法について紹介します。
参考記事
- タイトル: convaiinnovations/laya(モデルカード)
- 著者: Convai Innovations
- 発行元: Hugging Face
- URL: https://huggingface.co/convaiinnovations/laya
関連記事
https://jobirun.com/mistral-shieldstral-safety-classifier/
https://jobirun.com/openai-privacy-filter-pii-detection-implementation/
https://jobirun.com/liquid-ai-lfm25-8b-a1b-on-device-guide/
要点
- Convai Innovationsは、非自己回帰型の意思決定モデル「Laya」をApache 2.0ライセンスで公開した。入力はテキストとタイプ付き質問で、約33ミリ秒で確率付きの回答を返す。
- Layaには英語特化の「laya」、100以上の言語に対応する「laya-multilingual」、4種の定型判断タスクに特化した「laya-typed-decisions」という3種のチェックポイントが用意されている。
- 質問形式はchoice(選択肢)・score(順序スコア)・noul(真偽判定)の3タイプに対応し、JSONスキーマやPydanticモデルによる指定も可能である。
- ベンチマークでは、既存の分類ツール「TypeSafe Jev」との比較で、精度・キャリブレーション・速度の各指標について優位な結果が示されている。
- pipによるインストールに対応するほか、laya-serveコマンドによるセルフホスティングも用意されている。
詳細解説
Layaとは何か——非自己回帰の「System 1」モデル
Convai Innovationsによれば、Layaは状態(テキスト、メール、チケット、JSONなど)とタイプ付き質問を受け取り、単一のフォワードパス(forward pass、モデルに入力を1回通す処理)で約33ミリ秒のうちに、数学的に較正された確率付きの回答を返す「非自己回帰(non-autoregressive)」モデルです。非自己回帰とは、ChatGPTのような大規模言語モデルが文章を1トークンずつ生成していく「自己回帰」方式とは異なり、あらかじめ用意された選択肢を直接スコアリングして答えを返す方式を指します。テキストを生成しないため、出力を後から解析(パース)する手間がなく、実在しない情報を答えてしまう「ハルシネーション」も原理上起こらないとされています。
モデル名にある「System 1」は、心理学で使われる「速い思考(直感的な判断)」を指す言葉で、時間をかけて推論するタイプのモデルではなく、瞬時に判定を返す用途を想定していることを示していると読めます。また、LayaはRLCD(Reinforcement Learning for Calibrated Decisions、較正された判断のための強化学習)という手法で訓練されており、「厳密に適切なスコアリングルール(strictly proper scoring rules)」に基づいて報酬が設計されているため、モデルが誠実な確率を報告すること自体が報酬を最大化する唯一の方法になっていると、Convai Innovationsは説明しています。
3つのチェックポイントとアーキテクチャ
Layaには用途に応じて3種類のチェックポイント(学習済みモデルの重みファイル)が用意されています。
| チェックポイント | バックボーン | パラメータ数 | コンテキスト長 | 得意領域 |
|---|---|---|---|---|
| laya(ルート) | ModernBERT-large | 421M | 512トークン | 英語テキスト、ガードレール、メール振り分け |
| laya-multilingual | mmBERT-base | 322M | 1024トークン | 100以上の言語、約2.2倍高速 |
| laya-typed-decisions | ModernBERT-large | 421M | 1024トークン | 4種の定型判断タスク |
いずれのチェックポイントも土台にはBERT系のエンコーダーモデルを採用しており、laya・laya-typed-decisionsはModernBERT-large(395Mパラメータ)、laya-multilingualはmmBERT-baseを使っています。この上に「決定ヘッド」と呼ばれる追加の層(2層のTransformer、選択肢マーカーのスコアラー、実行・エスカレーションを判断するヘッド)を載せる構成です。各選択肢は入力文中の[MASK]トークン(BERT系モデルで穴埋め問題に使うプレースホルダー)の位置でスコアリングされ、質問ごとにソフトマックス(スコアを確率に変換する処理)をかけて確率を算出します。訓練には、REINFORCE(強化学習の代表的な手法の一つ)にグループ平均をベースラインとして使うGRPO(Group Relative Policy Optimization)風の手法と、TD(λ=1.0、時間差分学習の一種)を組み合わせているとされています。
パラメータ数が300M〜400M程度というサイズは、数十億から数千億パラメータの大規模言語モデルと比べるとかなり小さく、GPU 1枚はもちろん、条件によってはCPUでも動かせる規模だと考えられます。分類・判定に特化したタスクであれば、汎用の大規模言語モデルを都度呼び出すよりも軽量な構成で済むという発想は、実務上理解しやすいポイントだと思います。
前提条件・環境構成
Layaを利用するには、Python環境とpip(Pythonのパッケージ管理ツール)が必要です。モデルカードにはPythonのバージョン要件が明記されていませんが、ModernBERTやmmBERTといった比較的新しいモデルを使う都合上、Python 3.10以上を用意しておくと安全だと考えられます。まず、手元の環境で使えるPythonのバージョンを確認します。
# インストール済みのPythonのバージョンを表示するコマンドです
python --version
注意: 複数のPythonバージョンが混在する環境では、他のプロジェクトへの影響を避けるため、仮想環境(venv、プロジェクトごとに独立したPython環境を作る仕組み)を作成してからインストールすることをおすすめします。GPU(Tesla T4など)を使うとモデルカード記載の速度に近づきますが、CPUでも動作するとみられます。
インストールと実装例(Router Mode)
インストールはpipコマンド1行で完了します。
pip install laya
Layaには大きく分けて2つの使い方が用意されています。Convai Innovationsが「推奨」としているのは、複数のチェックポイントを自動的に使い分ける「Router Mode(ルーターモード)」です。以下は、メールの内容から担当部署・緊急度・解約リスクの有無を判定する、モデルカード記載のサンプルコードです。
import laya
from laya import Router
# preload=Trueにすると、モデルの重みを事前に読み込んでおける
router = Router(preload=True)
# 判定対象となる「状態」。ここではメールの内容を想定している
state = {
"from": "[email protected]",
"subject": "Duplicate charge on invoice #4411",
"body": "Hi, we were billed twice for March..."
}
# Layaに答えさせたい「タイプ付き質問」を定義する
questions = {
"department": {
"type": "choice", # 選択肢から1つを選ばせる質問
"instructions": "Which department should handle this?",
"criteria": {
"billing": "invoices, payments, refunds",
"technical": "bugs, outages, system errors",
"sales": "pricing, new contracts",
"other": "everything else"
}
},
"urgency": {
"type": "score", # 順序のあるスコアで答えさせる質問
"instructions": "How urgent is this request?",
"criteria": ["not urgent", "soon", "critical deadline"]
},
"churn_risk": {
"type": "noul", # 真偽(Yes/No)で答えさせる質問
"instructions": "Does user threaten to cancel?"
}
}
# stateとquestionsを渡すと、質問ごとの回答が返ってくる
res = router.predict(state, questions)
print(res["answers"]["department"]["choice"])
注意: このコードはモデルカードに掲載されたサンプルをもとにしており、本稿では実際の実行確認は行っていません。実際の出力(担当部署の判定結果など)は、入力データや環境によって変わると考えられます。
Router Modeを使わず、特定のチェックポイントを直接指定する「Direct SDK Mode(ダイレクトSDKモード)」も用意されています。
import laya
# 使用するチェックポイントを明示的に指定して読み込む
agent = laya.load("convaiinnovations/laya")
result = agent.predict(state, questions)
answers = result["answers"]
print(answers["department"]["choice"])
Router Modeは複数のチェックポイントから適切なものを自動選択してくれるのに対し、Direct SDK Modeは使うモデルを固定したい場合に向いていると考えられます。
質問タイプとバッチ処理・スキーマ指定
Layaの質問(questions)は、上記のコード例にある通り3つのタイプに対応しています。
- choice: あらかじめ用意した選択肢の中から1つを選ばせる質問タイプ。criteriaに選択肢名と説明を辞書で指定する
- score: 「not urgent」から「critical deadline」のように、順序のある段階でスコアを付けさせる質問タイプ
- noul: ある条件に当てはまるかどうかをYes/No(真偽値)で判定させる質問タイプ
これらに加えて、モデルカードでは複数の状態をまとめて処理する「バッチスコアリング」機能(`predict_batch()`)、JSONスキーマやPydanticモデル(Pythonでデータの型を定義する仕組み)を使って質問セットを定義できる「スキーマ駆動」の機能、入力文の言語やスクリプト(文字体系)をミリ秒未満で自動判定する言語検出機能が紹介されています。これらについて具体的なコード例はモデルカードに記載がないため、本稿では機能の紹介にとどめます。
性能とベンチマーク——TypeSafe Jevとの比較
Convai Innovationsは、Tesla T4 GPU上での速度として、質問1件あたりlaya(英語)で39.5ミリ秒、laya-multilingualで32.8ミリ秒という数値を示しています。10件をまとめてバッチ処理した場合は、それぞれ158.6ミリ秒(1件あたり15.9ミリ秒)、72.3ミリ秒(1件あたり7.2ミリ秒)まで短縮されるとしています。
精度面では、既存の分類ツール「TypeSafe Jev 1.13.0」との比較結果も公開されています。
| 指標 | TypeSafe Jev 1.13.0 | Laya(ルーター使用) |
|---|---|---|
| typed-decisions(2,000件) | 0.727 | 0.766 |
| AG News(4ラベル) | 0.910 | 0.950 |
| DAIR Emotion(6ラベル) | 0.480 | 0.595 |
| Banking77(72 vs 77ラベル) | 0.870 | 0.425 |
| ECE(較正誤差、低いほど良い) | 0.246 | 0.081 |
| 1問あたりのp50レイテンシ | 236〜276ミリ秒 | 32.8ミリ秒 |
Convai Innovationsによれば、typed-decisionsやAG News、DAIR EmotionといったベンチマークではLayaがTypeSafe Jevを上回った一方、選択肢が72〜77個と非常に多いBanking77ではJevが上回ったとしています。良い数値だけでなく、選択肢数が多いタスクでは分が悪いという結果もあわせて併記している点は、情報として誠実な公開の仕方だと感じました。もっとも、この比較はConvai Innovations自身が公開しているベンチマークであり、第三者による検証結果ではない点には留意しておいた方がよいと考えられます。
なお、多言語対応についても、英語専用のlayaと多言語対応のlaya-multilingualを比較した結果が示されており、51言語中「ランダムな回答の3倍以上の精度」を出せた言語数は、英語専用モデルで23言語、多言語モデルで45言語だったと報告されています。状況に応じて2つのモデルを使い分ける「Router Mode」を使えば、英語では英語専用モデルの精度を、それ以外の言語では多言語モデルの精度を、それぞれ活かせる設計になっていると考えられます。
キャリブレーションと既知の制限
RLCDによる訓練の効果を示す指標として、ECE(Expected Calibration Error、予測確率と実際の正解率のずれを表す指標)が温度スケーリング適用後で0.081という数値が示されています。この数値が低いほど、モデルが出す確率がより実態に近いことを意味します。
一方で、モデルカードでは次のような制限も明記されています。
- ベースのチェックポイント(laya・laya-multilingual)は、typed-decisionsタスクへのゼロショット(追加学習なしでの)適用では、精度0.362とほぼランダムな水準にとどまる
- 選択肢が50個を超えるような質問では、1つのラベルに割り当てられるトークンが3〜4個程度に減り、精度が低下する
- score(順序スコア)タイプの質問は、他のタイプと比べて精度がやや弱い
- デフォルトの状態では自信過剰(over-confident)な傾向があり、実運用ではドメインのデータを使った温度調整(temperature fitting)が必要になる
- noul(真偽判定)タイプの質問は、入力内容そのものよりも選択肢のラベルに引っ張られて回答してしまう場合がある
- 英語専用のルートチェックポイントは英語以外の言語には弱く、多言語での利用にはlaya-multilingualを使う必要がある
これらの制限がモデルカードにまとめて明記されている点は、導入を検討する側にとって参考になる情報だと思います。特に「デフォルトでは自信過剰」という記載は、確率付きの出力をそのまま業務判断の閾値に使う場合、事前に自社データでの温度調整が必要になると考えられます。
セルフホスティングという選択肢
LayaはHugging Face上のモデルとして使うだけでなく、自前のサーバーで動かす「セルフホスティング」の仕組み(`laya-serve`)も用意されています。
# serve用のオプション付きでインストールする
pip install "laya[serve]"
# GPUを使い、起動時にモデルをあらかじめ読み込んでおく設定でサーバーを起動する
LAYA_DEVICE=cuda LAYA_PRELOAD=1 laya-serve
このコマンドを実行すると、`0.0.0.0:8000`でHTTPサーバーが立ち上がり、起動時にチェックポイントを事前読み込みしておく設定になります。エンドポイントはTypeSafe Jevと互換性のある形式で提供されているとのことで、既存のJev向け連携部分を大きく書き換えずに置き換えられる可能性があると考えられます。ソースコードはGitHub(NandhaKishorM/laya)、パッケージはPyPI(laya)でも公開されており、Hugging Face Spaces上のデモも用意されています。
注意: GPU向けの`cuda`指定はNVIDIA製GPUを使う環境向けの設定です。GPUを持たない環境では、この環境変数を省略するかCPU向けの設定に変更する必要があると考えられます。
まとめ
Layaは、テキストを生成せず確率付きの判定を高速に返す設計で、メール振り分けやガードレールなど定型判断に向くモデルだと考えられます。分類特化の軽量モデルはMistralの安全性分類器も過去記事で紹介しており、あわせてご覧ください。
