Local models
============

AIDBは2種類のローカルモデルをサポートしています。どちらも外部APIを必要とせずにPostgresホストで直接実行されます。

- **ビルトインモデル** —
  AIDBは、サポートされている各モデルタイプのデフォルトバリアントをバンドルし、自動的に登録します。使用を開始するために設定は必要ありません。

- **カスタムローカルモデル** —
  別のモデルバリアント、微調整モデル、または特定のローカルパスが必要な場合は、
  ``aidb.create_model()`` を使用してカスタムバージョンを登録できます。

ビルトインモデル
----------------

次のモデルは、すべてのAIDBインストールで構成なしで使用できます。

.. csv-table::
  :header: Model name,Provider,Use
  :widths: 12,25,15
  :align: left
  :class: longtable

  `bert`,`bert_local`,Text embeddings
  `clip`,`clip_local`,Multimodal embeddings (text and image)
  `t5`,`t5_local`,Text-to-text generation
  `llama`,`llama_instruct_local`,Text-to-text generation
  `dummy`,`dummy`,Testing and development (returns zeros)

AIDB
SQLファンクションまたはパイプラインステップ構成で、名前で直接使用します。

.. code:: sql

   - - Text embedding with the built-in BERT model
   SELECT aidb.encode_text(bert, The quick brown fox);

   - - Image embedding with the built-in CLIP model
   SELECT aidb.encode_image(clip, pg_read_binary_file(/tmp/photo.jpg)::BYTEA);

   - - Text generation with the built-in T5 model
   SELECT aidb.decode_text(t5, Translate to French: Hello, world.);

カスタムローカルモデル
----------------------

別のモデルバージョン、微調整されたモデル、または特定のローカルパスが必要な場合、
``aidb.create_model()`` を使用してカスタムバリアントを登録します。

.. code:: sql

   SELECT aidb.create_model(
       name     => my_model,
       provider => <provider>,
       config   => <config_helper>(...)
   );

.. csv-table::
  :header: Parameter,Type,Description
  :widths: 12,15,25
  :align: left
  :class: longtable

  `name`,TEXT,このモデルの一意の名前。パイプラインおよびSQLファンクションで参照するために使用されます。
  `provider`,TEXT,モデルプロバイダー。 AIDBが使用する推論エンジンを決定します。
  `config`,JSONB,プロバイダー固有の構成、構成ヘルパー機能で構築されています。

BERT
^^^^

``aidb.bert_config()``
を使用して、HuggingFaceモデル識別子、オプションのリビジョン、およびオプションのローカルキャッシュディレクトリを指定します。

.. code:: sql

   SELECT aidb.create_model(
       my_bert,
       bert_local,
       config => aidb.bert_config(sentence-transformers/all-MiniLM-L6-v2)
   );

.. csv-table::
  :header: Parameter,Type,Default,Description
  :widths: 15,12,12,20
  :align: left
  :class: longtable

  `model`,TEXT,Required,モデル名またはパスHuggingFace識別子。
  `revision`,TEXT,NULL,モデルのリビジョンまたはブランチ。
  `cache_dir`,TEXT,NULL,モデルファイルをキャッシュするためのローカルディレクトリ。

クリップ
^^^^^^^^

``aidb.clip_config()``
を使用して、ジョイントテキストと画像埋め込みのCLIPベースのマルチモーダルモデルを構成します。

.. code:: sql

   SELECT aidb.create_model(
       my_clip,
       clip_local,
       config => aidb.clip_config(openai/clip-vit-base-patch32)
   );

.. csv-table::
  :header: Parameter,Type,Default,Description
  :widths: 15,12,12,20
  :align: left
  :class: longtable

  `model`,TEXT,Required,モデル名またはパスHuggingFace識別子。
  `revision`,TEXT,NULL,モデルのリビジョンまたはブランチ。
  `cache_dir`,TEXT,NULL,モデルファイルをキャッシュするためのローカルディレクトリ。

T5
^^

``aidb.t5_config()``
を使用して、T5テキスト対テキストモデルを構成します。
T5モデルは、バリアントに応じて、翻訳、要約、質問応答などのタスクをサポートします。

.. code:: sql

   SELECT aidb.create_model(
       my_t5,
       t5_local,
       config => aidb.t5_config(google/flan-t5-base)
   );

.. csv-table::
  :header: Parameter,Type,Default,Description
  :widths: 15,12,12,20
  :align: left
  :class: longtable

  `model`,TEXT,Required,モデル名またはパス。
  `model_path`,TEXT,NULL,モデルの重みへの明示的なローカルパス `model`をオーバーライドします。
  `cache_dir`,TEXT,NULL,モデルファイルをキャッシュするためのローカルディレクトリ。

ラマ
^^^^

``aidb.llama_config()``
を使用して、テキスト生成用のLlamaファミリー言語モデルを構成します。
Llamaモデルは、温度、top-pサンプリング、コンテキスト長、およびその他の生成パラメーターをサポートしています。

.. code:: sql

   SELECT aidb.create_model(
       my_llama,
       llama_instruct_local.,
       config => aidb.llama_config(
           meta-llama/Llama-3.2-3B-Instruct,
           temperature => 0.5
       )
   );

.. csv-table::
  :header: Parameter,Type,Default,Description
  :widths: 15,12,12,20
  :align: left
  :class: longtable

  `model`,TEXT,Required,モデル名またはパス。
  `cache_dir`,TEXT,NULL,モデルファイルをキャッシュするためのローカルディレクトリ。
  `model_path`,TEXT,NULL,モデルの重みへの明示的なローカルパス `model`をオーバーライドします。
  `temperature`,DOUBLE PRECISION,NULL,サンプリング温度。
  `top_p`,DOUBLE PRECISION,NULL,nucleusサンプリングしきい値。
  `seed`,BIGINT,NULL,再現可能な出力のランダムシード。

!!!注
ローカルモデルファイルはHuggingFaceからダウンロードされ、最初に使用するときにキャッシュされます。
Postgresプロセスには、ネットワークアクセスとキャッシュディレクトリへの書き込みアクセスが必要です。エアギャップ環境の場合、モデルファイルを事前ダウンロードし、
``model_path`` または\ ``cache_dir``
を使用してローカルコピーをポイントします。

ローカルモデルのダウンロード
----------------------------

ローカルモデルが初めて使用されるとき、またはそのキャッシュが欠落または破損しているとき、AIDBはHuggingFaceから構成済みの\ ``cache_dir``
にモデルファイルをダウンロードします。ダウンローダーは進行状況メッセージを発行し、一時的なネットワーク障害を自動的に再試行します。

進行状況メッセージ
^^^^^^^^^^^^^^^^^^

AIDBは、ファイルごとに、要求の開始時に\ ``downloading``
行を生成し、終了時に\ ``complete``
行を生成します。マルチギガバイトのファイルの場合、ハートビートラインは、累積バイト数と完了パーセントを約30秒ごとにレポートするため、大規模なダウンロード中にセッションがフリーズしたように見えません。

.. code:: sql

   SELECT aidb.decode_text(t5, test);
   __OUTPUT__
   NOTICE:  [t5_local] loading t5-small (rev refs/pr/15) -> /var/.../snapshots/refs/pr/15
   NOTICE:  [hf] downloading https://huggingface.co/t5-small/resolve/refs%2Fpr%2F15/config.json (expected: 1.2 KB)
   NOTICE:  [hf] complete: https://huggingface.co/t5-small/resolve/refs%2Fpr%2F15/config.json (1.2 KB) in 0.9s
   NOTICE:  [hf] downloading https://huggingface.co/t5-small/resolve/refs%2Fpr%2F15/model.safetensors (size unknown)
   NOTICE:  [hf] downloading t5-small/model.safetensors: 115.4 MB / 230.8 MB (50.0%)
   NOTICE:  [hf] downloading t5-small/model.safetensors: 216.4 MB / 230.8 MB (93.7%)
   NOTICE:  [hf] complete: https://huggingface.co/t5-small/resolve/refs%2Fpr%2F15/model.safetensors (230.8 MB) in 83.5s

デフォルトでは、これらの行は\ ``NOTICE``
レベルでクライアントに送信されます。
:ref:`aidb.download_log_level <aidb.download_log_level>` パラメーターを使用して、代わりにサーバーログにルーティングするか、完全に抑制します。

再試行と再開
^^^^^^^^^^^^

マルチギガバイトのダウンロードの途中で接続をドロップするCDNは、要求を完全に失敗しません。

- 再試行ごとに、以前の試行が停止した場所から\ ``Range``
  ヘッダーが送信されるため、進行状況はゼロからリスタートするのではなく、試行にわたって蓄積されます。

- AIDBは、「まだ新しいバイトを受信している」と「進行状況がゼロ」を区別し、
  :ref:`aidb.download_max_attempts <aidb.download_max_attempts>` 
  に対するストールした試行のみをカウントし、試行間の指数関数的なバックオフを使用します。

- ``psql`` からの\ ``Ctrl-C``
  は、現在の要求がタイムアウトするのを待機する代わりに、再試行の間に着陸します。

ファイルごとの試行の合計数は、 :ref:`aidb.download_max_attempts <aidb.download_max_attempts>` デフォルト\ ``30``
によって制限されます。

検証と自己修復
^^^^^^^^^^^^^^

AIDBは、HuggingFaceによって宣伝されるサイズとSHA-256ハッシュを使用してダウンロードされたファイルを検証し、これらの値を記録する完了した各ダウンロードの横に小さなサイドカーファイルを書き込みます。キャッシュヒットするたびに、AIDBはサイドカーに対してファイルサイズを再チェックするため、元のダウンロードの後に切り詰められたファイルは、使用される前にキャッチされます。

モデルのロード時に、キャッシュされたファイルが破損していると検出されると、AIDBは影響を受けるスナップショットをパージし、自動的に1回再ダウンロードします。

登録されたモデルを使用する
--------------------------

登録されると、モデルはAIDBファンクションで名前で参照されます。カスタムモデルとビルトインモデルは互換性があります。

.. code:: sql

   - - Use a custom BERT model for embedding
   SELECT aidb.encode_text(my_bert, Hello world);

   - - Use a custom BERT model in a pipeline step
   SELECT aidb.create_pipeline(
       name => my_pipeline,
       source => my_source_table,
       source_key_column => id,
       source_data_column => content,
       step_1 => KnowledgeBase,
       step_1_options => aidb.knowledge_base_config(model => my_bert, data_format => Text)
   );

すべてのモデル構成ヘルパーファンクションの完全なパラメーターの詳細については、
:ref:`Models reference <Models reference>` を参照してください。

AIDBのローカルプロバイダーで動作するようにテストおよび検証されたHuggingFaceモデルバリアントのリストについては、
:ref:`Support matrix <Support matrix>` を参照してください。
