Knowledge bases
===============

ナレッジベースKBには、エンベディングとその構成モデル、距離演算子、ベクトルインデックスが保存されます。パイプラインはそれに書き込み、
:ref:`promoteb.retrieve_text() <promoteb.retrieve_text()>` または :ref:`promoteb.retrieve_key() <promoteb.retrieve_key()>` を使用して名前で照会します。

ナレッジベースは、単一のパイプラインと :ref:`ナレッジベース <ナレッジベース>` 
から始まります。同じナレッジベースに追加のパイプラインを接続できます。さまざまなソースまたは処理チェーンをすべて、1つの照会可能なベクトルテーブルへのエンベディングに貢献させます。

.. csv-table::
  :header: Page,What it covers
  :widths: 10,30
  :align: left
  :class: longtable

  :ref:`Multi-pipeline knowledge bases<Multi-pipeline knowledge bases>` ,Attach multiple pipelines to one KB; compatibility rules and deletion semantics
  :ref:`Hybrid search<Hybrid search>` ,Combining semantic search with relational filters and full-text search
  :ref:`Examples<Examples>` ,End-to-end worked examples for table and volume sources

取得ファンクション
------------------

パイプラインが実行されたら、 ``aidb.retrieve_text()``
または\ ``aidb.retrieve_key()``
を使用してナレッジベースを照会します。どちらもベクトルの類似度を使用して、正確なキーワードではなく意味に基づいて結果を検索し、クエリ入力として\ ``TEXT``
と\ ``BYTEA`` の両方をサポートしています。

検索機能の流れ
^^^^^^^^^^^^^^

取得ファンクションが呼び出されると、システムは内部で次の手順を実行します。

- **埋め込み**
  入力クエリテキストまたは画像は、そのナレッジベース用に構成された特定の埋め込みモデルを使用してベクトルに変換されます。

- **類似性検索**
  ベクトル類似性検索は、ナレッジベースの内部ベクトルテーブルに対して実行され、上位Kの最近傍を見つけます。

- **ソースルックアップテキストのみ** ``retrieve_text``
  の場合、システムはソーステーブルを識別し、一致したキーに対応する生のコンテンツを取得します。

promoteb.retrieve_text()
^^^^^^^^^^^^^^^^^^^^^^^^

このファンクションは、最も近いベクトル一致に関連付けられた実際のソーステキストを取得する必要がある場合に使用します。

- **プロセス**
  ファンクションはクエリーを埋め込み、類似性検索を実行して、第2フェーズを実行して、\ ``pipeline_id``
  を使用して元のテーブルからソーステキストをルックアップします。

- **戻り値** 以下を含む列のセット

- **key** ソーステーブルの識別子

- **value** 実際のソーステキスト

- **distance** 類似性スコア。通常、低い値は、より近い一致を示します。

- **part_ids** 一致した特定のチャンクまたはパーツを示すIDの配列。

- **pipeline_name** データを提供したパイプラインの名前。

- **intermediate_steps**
  :ref:`intermediate_destination <Pipeline steps>` で構成されたステップ、ナレッジベースの前に発生するステップからのデータを含むJSONB列たとえば、ChunkText。パイプライン内のステップで中間ストレージが有効になっていない場合は空。これが\ ``deduplicate``
  とどのように相互作用するかについては、以下の :ref:`重複排除と中間結果 <重複排除と中間結果>` を参照してください。

promoteb.retrieve_key()
^^^^^^^^^^^^^^^^^^^^^^^

このファンクションは、完全なソースコンテンツではなく、一致の一意の識別子のみが必要な高パフォーマンスの検索に使用します。

- **戻り値** 以下を含む列のセット

- **key** ソーステーブルからの識別子

- **distance** 類似度スコア。通常、低い値は、より近い一致を示します。

- **part_ids** 一致した特定のチャンクまたはパーツを示すIDの配列。

- **pipeline_name** データを提供したパイプラインの名前。

高度なクエリー 中間ステップの結合
---------------------------------

ChunkTextやParseHtmlなどの中間変換を含むパイプラインの場合、
``part_ids``
列を使用して取得結果を中間パイプラインテーブルと結合することにより、特定の変換済みセグメントにアクセスできます。これは、\ ``intermediate_steps``
列の手動代替であり、 :ref:`エンドツーエンドの例 中間ストレージを使用したマルチステップパイプライン <エンドツーエンドの例 中間ストレージを使用したマルチステップパイプライン>` が有効になっているステップで\ ``aidb.retrieve_text()``
が既に自動的に返しています。中間テーブルの追加列への結合など、\ ``intermediate_steps``
が提供しないものが必要な場合にのみ手動結合に手を伸ばします。

構文の例
^^^^^^^^

次のクエリは、取得結果を中間ステップテーブルと結合して、特定のチャンク値にアクセスします。

.. code:: sql

   SELECT 
       r.key, 
       r.value, 
       r.distance, 
       r.part_ids, 
       int_step.value AS chunked_content
   FROM aidb.retrieve_text(my_kb, search query, 5) AS r
   JOIN pipeline_my_pipeline_step_1 AS int_step
     ON int_step.source_id = r.key
     AND int_step.part_ids = (r.part_ids)[:1];

``intermediate_steps``
と同様に、この結合は1つの行のみを参照します\ ``deduplicate`` 通過します
— 次のセクションを参照してください。

重複排除と中間結果
------------------

``deduplicate`` ``aidb.retrieve_key()`` と\ ``aidb.retrieve_text()``
の両方のデフォルト\ ``true`` は、 ``ChunkText``
のようなステップがレコードをいくつかの独立した埋め込み部分に分割し、それらの部分のうちの複数の部分がクエリーと一致する場合でも、取得結果をソースレコードごとに1行に折りたたみます。
1つの部分のみが「勝ち」クエリーに最も近いものであり、その\ ``part_ids``
および\ ``intermediate_steps``
は、そのソースレコードに対して返される唯一の部分です。

これは、チャンクまたは解析ステップで :ref:`エンドツーエンドの例 中間ストレージを使用したマルチステップパイプライン <エンドツーエンドの例 中間ストレージを使用したマルチステップパイプライン>` を有効にするとすぐに重要になります。デフォルトの\ ``deduplicate => true``
では、複数のチャンクが一致した場合でも、ソースレコードごとに一致するチャンクの中間コンテンツは
**one**
のみが表示されます。一致するすべての部分とそれぞれ独自の\ ``intermediate_steps``
エントリーを表示するには、 ``deduplicate => false``
で取得を呼び出します。

たとえば、パイプラインは、 ``intermediate_destination``
を有効にして動物に関する一連の短い記事をチャンク化するため、各チャンクのテキストは\ ``intermediate_steps``
で利用できます。デフォルトの重複排除で\ ``'ocean'``
を照会すると、\ ``whale``
記事の最も一致するチャンクが勝ち、2番目のチャンクも一致した場合でも、他の\ ``whale``
チャンクは表示されません。

.. _knowledge-bases-1:

Knowledge bases
===============

経験則として
ソースレコードごとに1つの代表的な結果が必要な場合は\ ``deduplicate => true``
デフォルトのままで、同じソースレコードから一致するすべてのチャンクまたは部分が必要な場合は常に\ ``deduplicate => false``
を使用します。たとえば、長い文内のすべてのパッセージを表示する場合単一の最適なドキュメントだけでなく、クエリーにマッチしたドキュメント。

.. toctree::
  :maxdepth: 3

  knowledge-bases--multi-pipeline
  knowledge-bases--hybrid-search--index
  knowledge-bases--example
