Ollamaを活用した構造化出力
(ollama.com)構造化出力
2024年12月6日
Ollama は、JSON スキーマで定義された特定の形式にモデルの出力を制限できる構造化出力をサポートするようになった。Ollama の Python および JavaScript ライブラリも、構造化出力をサポートするよう更新された。
- 構造化出力のユースケース:
- ドキュメントからのデータ解析
- 画像からのデータ抽出
- あらゆる言語モデル応答の構造化
- JSON モードより高い信頼性と一貫性を提供
はじめに
- Ollama の最新バージョンをダウンロード
- Ollama Python または JavaScript ライブラリを最新バージョンにアップグレード
cURL
formatパラメータを使用して、モデルに構造化出力を渡すことが可能
出力
- リクエストの JSON スキーマで定義された形式で応答が返される
Python
- Ollama Python ライブラリを使用し、JSON オブジェクトとしてスキーマを
formatパラメータに渡す - Pydantic を使ってスキーマをシリアライズすることが推奨される
出力
name='Canada' capital='Ottawa' languages=['English', 'French']
JavaScript
- Ollama JavaScript ライブラリを使用し、JSON オブジェクトとしてスキーマを
formatパラメータに渡す - Zod を使ってスキーマをシリアライズすることが推奨される
出力
{ name: "Canada", capital: "Ottawa", languages: [ "English", "French" ] }
例
データ抽出
- テキストから構造化データを抽出するため、情報を表すスキーマを定義
- モデルが情報を抽出し、定義されたスキーマでデータを JSON として返す
例の出力
pets=[ Pet(name='Luna', animal='cat', age=5, color='grey', favorite_toy='yarn'), Pet(name='Loki', animal='cat', age=2, color='black', favorite_toy='tennis balls') ]
画像説明
- 構造化出力はビジョンモデルと併用可能
llama3.2-visionを使用して画像を説明し、構造化出力を返す
例の出力
summary='A palm tree on a sandy beach with blue water and sky.'objects=[ Object(name='tree', confidence=0.9, attributes='palm tree'), Object(name='beach', confidence=1.0, attributes='sand') ]scene='beach', colors=['blue', 'green', 'white'], time_of_day='Afternoon', setting='Outdoor', text_content=None
OpenAI 互換性
- OpenAI クライアントを使用して構造化出力と互換性あり
ヒント
- 構造化出力を信頼性高く使用するには:
- Pydantic(Python)または Zod(JavaScript)を使用して応答スキーマを定義
- モデルがリクエストを理解できるよう、プロンプトに「JSONで返す」を追加
- より決定論的な出力のため、temperature を 0 に設定
次のステップ
- 制御された生成のためのロジット露出
- 構造化出力のパフォーマンスと精度の改善
- サンプリングのための GPU アクセラレーション
- JSON スキーマを超える追加フォーマットのサポート
1件のコメント
Hacker Newsの意見
llama.cpp の gbnf 機能により、より強力な出力制約を設定できる
通常のプロンプトを構造化して csv データに変換する際、不要なテキストを取り除けるので便利
gemma2:2b を使ってテキストを入力すると、構造化された JSON 形式の出力が得られる
{"amount": 190, "balance": 5098, "category": "Shopping", "place": "Fresh Mart"}制約が LLM の出力品質にどう影響するのか気になるという意見がある
対応モデルで使えるのかという質問がある
llama.cpp と ollama が llama の構造化出力機能を活用しているのか、それとも別の方法で実装しているのか気になるという声がある
outlinesと比べてどんな付加価値があるのかという質問があるoobabooga を使い続けている理由は、exlv2 対応によりデュアル 3090s でより効率的な推論ができるため
まず curl の例が出てきた方がよい
LLM に構造化入力を与える最適な方法についての質問がある