Next.js に ローカルLLMを載せる
PythonとTypeScript(TS)のONNXモデル推論における違いは、主に以下の2点に起因します:
-
ランタイムの設計とライブラリの抽象度
Python:
• PythonではONNX Runtime(onnxruntime)やHugging FaceのTransformersライブラリが深く統合されており、高度な推論機能が標準でサポートされています。
• たとえば、AutoModelForQuestionAnsweringのような高レベルAPIは、ロジット(start_logitsやend_logits)を計算し、ユーザに対して解釈可能なデータを返すよう設計されています。
• つまり、ロジットの計算はライブラリ内で自動的に処理され、ユーザが直接操作する必要がありません。
TypeScript:
• TypeScriptの環境(onnxruntime-web)では、ONNXモデルの推論機能が低レベルに近い形で提供されます。onnxruntime-webではモデルの入出力をそのまま扱う設計であり、Hugging FaceのTransformersのような高度な後処理が自動化されていません。
• ロジットはモデルからそのまま出力され、開始位置・終了位置のスコアリングやトークンデコードなどは、ユーザが手動で実装する必要があります。 -
推論結果の解釈と後処理
Python:
• 推論後、Transformersライブラリがstart_logitsやend_logitsをもとに、回答部分を直接計算して返す仕組みを持っています(answerフィールドを生成)。
• ユーザはシンプルなAPIで結果を取得でき、モデルの内部的な処理(ロジットの計算や位置スコアリング)に直接触れる必要がない設計です。
TypeScript:
• TypeScript環境では、モデルの出力(ロジット)を基に、開始位置・終了位置を決定し、テキストをデコードするプロセスを明示的に実装する必要があります。
• そのため、start_logitsやend_logitsを直接取得し、それらを使用して最大スコアを持つトークン位置を計算する処理が必要です。
まとめ
• Pythonでは、Hugging Faceのような高レベルライブラリが後処理を抽象化してくれるため、ロジットを直接操作する必要がない。
• TypeScript(特にonnxruntime-web)では、ONNXモデルの低レベル出力を解釈するため、ロジットを直接扱い、それに基づいた後処理を実装する必要がある。
この違いは、使用しているライブラリの抽象化レベルと、各言語のエコシステムによるものです。