Pipeline steps
==============

AIパイプラインの各ステップは、その操作タイプとオプションの構成オブジェクトによって定義されます。オペレーション名を文字列として\ ``aidb.create_pipeline()``
の\ ``step_N``
パラメーターに渡し、構成をJSONBとして対応する\ ``step_N_options``
パラメーターに渡します。

.. code:: sql

   SELECT aidb.create_pipeline(
       name              => my_pipeline,
       source            => my_source_table,
       source_key_column => id,
       source_data_column => content,
       step_1            => ChunkText,
       step_1_options    => aidb.chunk_text_config(desired_length => 120, max_length => 150),
       step_2            => KnowledgeBase,
       step_2_options    => aidb.knowledge_base_config(model => bert, data_format => Text)
   );

以下で説明するヘルパーファンクションを使用して、各操作タイプの\ ``step_N_options``
値を構築します。すべてのヘルパーファンクションは、\ ``JSONB``
構成オブジェクトを結果ます。

ChunkText
---------

LLMコンテキストウィンドウ内に収まるように、テキストを小さなセグメントに分割します。

**ヘルパーファンクション** ``aidb.chunk_text_config()``

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

  `desired_length`,`INTEGER`,Required,ターゲットチャンクサイズ。単位は`strategy`に依存します。
  `max_length`,`INTEGER`,`NULL`,最大チャンクサイズ。省略した場合、`desired_length`は厳密な上限です。
  `overlap_length`,`INTEGER`,`NULL`,連続するチャンク間でオーバーラップするコンテンツの量。デフォルト0オーバーラップなし。
  `strategy`,`TEXT`,`NULL`,文字ベースの場合は`'chars'`デフォルト、ワードベースのチャンクの場合は`'words'`。

**基本的なチャンクの例**

.. code:: sql

   SELECT aidb.create_pipeline(
       name               => chunk_pipeline,
       source             => source_table,
       source_key_column  => id,
       source_data_column => content,
       step_1             => ChunkText,
       step_1_options     => aidb.chunk_text_config(
           desired_length => 100,
           max_length     => 150,
           overlap_length => 20,
           strategy       => words
       )
   );

結果
^^^^

``ChunkText`` は、 ``part_id``
列を導入することにより、データの形状を変換します。各ソース行は、チャンクごとに1つずつ、複数の出力行を生成する場合があります。

ParseHtml
---------

HTML文字列から可読テキストを抽出し、論理構造を保持しながらタグを削除します。

**ヘルパーファンクション** ``aidb.html_parse_config()``

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

  `method`,`TEXT`,`NULL`,プレーンテキスト抽出の場合は`'StructuredPlaintext'`デフォルト、または階層を保持する場合は`'StructuredMarkdown'`。

.. code:: sql

   SELECT aidb.create_pipeline(
       name               => html_pipeline,
       source             => web_data_table,
       source_key_column  => id,
       source_data_column => html_content,
       step_1             => ParseHtml,
       step_1_options     => aidb.html_parse_config(method => StructuredMarkdown),
       step_2             => ChunkText,
       step_2_options     => aidb.chunk_text_config(desired_length => 120)
   );

ParsePdf
--------

非準拠または複雑なファイルを処理するオプションを使用して、バイナリPDFデータからテキストを抽出します。

**ヘルパーファンクション** ``aidb.pdf_parse_config()``

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

  `method`,`TEXT`,`NULL`,`'Structured'` デフォルト — PDF仕様を使用してテキストブロックを識別します。
  `allow_partial_parsing`,`BOOLEAN`,`NULL`,`true`デフォルトの場合、個々のページでエラーが発生した場合に解析を続行します。

結果の\ ``part_id``
列は、各テキストブロックが抽出されたページインデックスにマップします。

.. code:: sql

   SELECT aidb.create_pipeline(
       name               => pdf_pipeline,
       source             => pdf_files_table,
       source_key_column  => id,
       source_data_column => pdf_data,
       step_1             => ParsePdf,
       step_1_options     => aidb.pdf_parse_config(
           method                => Structured,
           allow_partial_parsing => true
       ),
       step_2             => KnowledgeBase,
       step_2_options     => aidb.knowledge_base_config(model => bert, data_format => Text)
   );

.. _結果-1:

結果
^^^^

``ParsePdf``
は結果のネストを解除します。マルチページPDFはページごとに1行を生成し、それぞれにページインデックスに対応する\ ``part_id``
があります。

PerformOcr
----------

NVIDIA NIM
PaddleOCRなどのOCR対応AIモデルを使用して、画像からテキストを抽出します。

**ヘルパーファンクション** ``aidb.ocr_config()``

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

  `model`,`TEXT`,Required,使用する登録済みのOCRモデルの名前。

この手順を使用する前に、OCR対応モデルを登録します。

.. code:: sql

   SELECT aidb.create_model(
       my_paddle_ocr_model,
       nim_paddle_ocr,
       credentials => {"api_key": "<NVIDIA_NIM_API_KEY>"}::JSONB
   );

次に、パイプラインでそれを参照します。

.. code:: sql

   SELECT aidb.create_pipeline(
       name               => ocr_pipeline,
       source             => images_table,
       source_key_column  => id,
       source_data_column => image_data,
       step_1             => PerformOcr,
       step_1_options     => aidb.ocr_config(model => my_paddle_ocr_model),
       step_2             => KnowledgeBase,
       step_2_options     => aidb.knowledge_base_config(model => bert, data_format => Text)
   );

.. _結果-2:

結果
^^^^

``PerformOcr``
は結果のネストを解除します。単一の画像から、検出されたテキストブロックごとに1つずつ、複数の行が生成される場合があります。
NVIDIA NIMプロバイダーは、現在\ ``png`` および\ ``jpeg``
形式のみをサポートしています。

SummarizeText
-------------

AI言語モデルを使用して、長いテキストの一節の簡潔な概要を生成します。

**ヘルパーファンクション** ``aidb.summarize_text_config()``

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

  `model`,`TEXT`,Required,要約に使用する登録モデルの名前。
  `chunk_config`,`JSONB`,`NULL`,要約前に適用されるオプションのチャンク構成`aidb.chunk_text_config()`から 。
  `prompt`,`TEXT`,`NULL`,概要をガイドするカスタムプロンプト。省略すると標準のプロンプトを使用します。
  `strategy`,`TEXT`,`NULL`,`'append'`デフォルトはチャンクごとのサマリーを連結し、`'reduce'`は反復圧縮します。
  `reduction_factor`,`INTEGER`,`NULL`,`'reduce'`ストラテジーで使用されます。反復ごとにテキストをどの程度積極的に削減するかを制御しますデフォルトは3です。
  `inference_config`,`JSONB`,`NULL`,オプションの実行時推論設定`aidb.inference_config()`から。

.. code:: sql

   SELECT aidb.create_pipeline(
       name               => summary_pipeline,
       source             => articles_table,
       source_key_column  => id,
       source_data_column => body,
       step_1             => SummarizeText,
       step_1_options     => aidb.summarize_text_config(
           model        => my_t5_model,
           chunk_config => aidb.chunk_text_config(100, 120, 10, words),
           prompt       => Summarize the key points concisely,
           strategy     => reduce,
           reduction_factor => 3
       ),
       step_2             => KnowledgeBase,
       step_2_options     => aidb.knowledge_base_config(model => bert, data_format => Text)
   );

ナレッジベース
--------------

処理されたテキストまたは画像データをベクター埋め込みに変換し、検索可能なナレッジベースに保存します。このステップは、その出力が後続のステップで入力として使用できない\ ``VECTOR``
タイプであるため、常にパイプラインの **最後のステップ**
である必要があります。セマンティック検索またはハイブリッド検索を使用したナレッジベースの照会については、
:ref:`Knowledge bases reference <Knowledge bases reference>` を参照してください。

**ヘルパーファンクション** ``aidb.knowledge_base_config()``

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

  `model`,`TEXT`,Required,埋め込みモデルの名前。
  `data_format`,`aidb.PipelineDataFormat`,Required,`'Text'`または`'Image'`。
  `distance_operator`,`aidb.DistanceOperator`,`NULL`,類似度メトリック `L2`デフォルト `Cosine`、または`InnerProduct`
  `vector_index`,`JSONB`,`NULL`,`aidb.vector_index_hnsw_config()`などのベクターインデックスヘルパーでビルドされたベクターインデックス構成。

.. code:: sql

   SELECT aidb.create_pipeline(
       name               => kb_pipeline,
       source             => source_table,
       source_key_column  => id,
       source_data_column => content,
       step_1             => KnowledgeBase,
       step_1_options     => aidb.knowledge_base_config(
           model             => bert,
           data_format       => Text,
           distance_operator => Cosine,
           vector_index      => aidb.vector_index_hnsw_config(m => 16, ef_construction => 64)
       )
   );

複数のパイプラインを同じナレッジベースにリンクするには、代わりに\ ``aidb.knowledge_base_config_from_kb(data_format)``
を使用します。この手法は、既存のナレッジベースからモデルと距離オペレーター設定を継承します。

宛先テーブル
^^^^^^^^^^^^

KnowledgeBaseステップは、次のスキーマを使用して\ ``pipeline_<pipeline_name>``
という名前の宛先テーブルを自動的に作成します。

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

  `id`,BIGSERIAL,主キー。
  `pipeline_id`,INT,元のパイプラインへの参照。
  `source_id`,TEXT,元のソースレコードのID。
  `part_ids`,BIGINT[],データがチャンクまたは解析された場合、セグメントを追跡します。
  `value`,VECTOR,pgvector埋め込み。

マルチパイプラインのナレッジベース
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

単一のナレッジベースで、複数のパイプラインからエンベディングを集約できます。内部\ ``knowledge_base_pipeline``
ジャンクションテーブルは、これらのマッピングを管理します。
``aidb.retrieve_text()``
を介して結果を取得する場合、各行には\ ``pipeline_name``
列が含まれるため、各エンベディングを生成したパイプラインを特定できます。

ナレッジベースのビューと統計については、
:ref:`Knowledge bases reference <Knowledge bases reference>` を参照してください。

完全なエンドツーエンドのワークフローで一緒に使用されるパイプラインステップを確認するには、
:ref:`Examples <Examples>` を参照してください。
