2 ポイント 投稿者 GN⁺ 2024-12-09 | 1件のコメント | WhatsAppで共有

構造化出力

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件のコメント

 
GN⁺ 2024-12-09
Hacker Newsの意見
  • llama.cpp の gbnf 機能により、より強力な出力制約を設定できる

  • 通常のプロンプトを構造化して csv データに変換する際、不要なテキストを取り除けるので便利

  • gemma2:2b を使ってテキストを入力すると、構造化された JSON 形式の出力が得られる

    • 入力例: "You have spent 190 at Fresh Mart. Current balance: 5098"
    • 出力例: {"amount": 190, "balance": 5098, "category": "Shopping", "place": "Fresh Mart"}
  • 制約が LLM の出力品質にどう影響するのか気になるという意見がある

    • 場合によっては Markdown やプレーンテキストとしてパースする方が、より良い品質を得られることもある
  • 対応モデルで使えるのかという質問がある

    • 個人のハードウェアでは 1b-3b モデルしか安定して動かせない
  • llama.cpp と ollama が llama の構造化出力機能を活用しているのか、それとも別の方法で実装しているのか気になるという声がある

    • Meta の Llama ページでは、モデルがもともと構造化出力をサポートしていると述べられている
  • outlines と比べてどんな付加価値があるのかという質問がある

  • oobabooga を使い続けている理由は、exlv2 対応によりデュアル 3090s でより効率的な推論ができるため

  • まず curl の例が出てきた方がよい

    • Pydantic は好きだが、スキーマを直接コード化した方がプロトタイプを Go に移しやすい
  • LLM に構造化入力を与える最適な方法についての質問がある

    • 例: 100 個の文を入力し、それぞれを別の方法で分類すること
    • 構造化データを得るのは簡単だが、行番号を接頭辞として使うやり方は不自然に感じる