Open3

Next.js に ローカルLLMを載せる

hiraokuhiraoku

PythonとTypeScript(TS)のONNXモデル推論における違いは、主に以下の2点に起因します:

  1. ランタイムの設計とライブラリの抽象度
    Python:
    • PythonではONNX Runtime(onnxruntime)やHugging FaceのTransformersライブラリが深く統合されており、高度な推論機能が標準でサポートされています。
    • たとえば、AutoModelForQuestionAnsweringのような高レベルAPIは、ロジット(start_logitsやend_logits)を計算し、ユーザに対して解釈可能なデータを返すよう設計されています。
    • つまり、ロジットの計算はライブラリ内で自動的に処理され、ユーザが直接操作する必要がありません。
    TypeScript:
    • TypeScriptの環境(onnxruntime-web)では、ONNXモデルの推論機能が低レベルに近い形で提供されます。onnxruntime-webではモデルの入出力をそのまま扱う設計であり、Hugging FaceのTransformersのような高度な後処理が自動化されていません。
    • ロジットはモデルからそのまま出力され、開始位置・終了位置のスコアリングやトークンデコードなどは、ユーザが手動で実装する必要があります。

  2. 推論結果の解釈と後処理

    Python:
    • 推論後、Transformersライブラリがstart_logitsやend_logitsをもとに、回答部分を直接計算して返す仕組みを持っています(answerフィールドを生成)。
    • ユーザはシンプルなAPIで結果を取得でき、モデルの内部的な処理(ロジットの計算や位置スコアリング)に直接触れる必要がない設計です。
    TypeScript:
    • TypeScript環境では、モデルの出力(ロジット)を基に、開始位置・終了位置を決定し、テキストをデコードするプロセスを明示的に実装する必要があります。
    • そのため、start_logitsやend_logitsを直接取得し、それらを使用して最大スコアを持つトークン位置を計算する処理が必要です。

まとめ
• Pythonでは、Hugging Faceのような高レベルライブラリが後処理を抽象化してくれるため、ロジットを直接操作する必要がない。
• TypeScript(特にonnxruntime-web)では、ONNXモデルの低レベル出力を解釈するため、ロジットを直接扱い、それに基づいた後処理を実装する必要がある。

この違いは、使用しているライブラリの抽象化レベルと、各言語のエコシステムによるものです。