Handling embedding service outages
==================================

埋め込みサービスが利用できない場合、または最近の行の埋め込みが生成されていない場合、ハイブリッド検索クエリは失敗するか、不完全な結果を返します。
3層フォールバックを実装して、これらの状況でもアプリケーションが結果を返し続けるようにします。

フォールバックチェーンの定義
----------------------------

推奨される劣化チェーン

1. **ハイブリッド** — ベクター+全文検索FTS —
   プライマリパス。埋め込みサービスが必要です。

2. **FTS-only** — ``tsvector`` を使用したキーワード検索
   埋め込みサービスは必要ありません。

3. **Regex** — ``ILIKE``
   パターンマッチ最後の手段、インデックスは必要ありません。

フォールバックの実装
--------------------

埋め込みステップから接続エラーをキャッチし、適切なフォールバックにルーティングすることにより、アプリケーションコードに、または
``CASE``
式またはラッパーファンクションを使用してSQLにこのストラテジーを実装します。以下の3つのクエリーは、各層のビルディングブロックです。

**プライマリ:ハイブリッドベクター+ネイティブFTS**

.. code:: sql

   WITH semantic AS (
       SELECT source_id,
              (2.0 - (value <=> aidb.kb_query_encode(public.pipeline_docs, :query)::vector)) / 2.0 AS vec_score
       FROM public.pipeline_docs
       ORDER BY value <=> aidb.kb_query_encode(public.pipeline_docs, :query)::vector
       LIMIT 50
   ),
   keyword AS (
       SELECT id::TEXT AS source_id,
              ts_rank_cd(search_vector, plainto_tsquery(english, :query)) AS fts_score
       FROM my_docs
       WHERE search_vector @@ plainto_tsquery(english, :query)
       LIMIT 50
   )
   SELECT COALESCE(s.source_id, k.source_id) AS id,
          0.6  *COALESCE(s.vec_score, 0) + 0.4*  COALESCE(k.fts_score, 0) AS score
   FROM semantic s
   FULL OUTER JOIN keyword k ON s.source_id = k.source_id
   ORDER BY score DESC
   LIMIT 10;

**フォールバック1FTSのみ埋め込みサービスなし**

.. code:: sql

   SELECT id, title,
          ts_rank_cd(search_vector, plainto_tsquery(english, :query)) AS score
   FROM my_docs
   WHERE search_vector @@ plainto_tsquery(english, :query)
   ORDER BY score DESC
   LIMIT 10;

**フォールバック2:正規表現インデックスなし**

.. code:: sql

   SELECT id, title
   FROM my_docs
   WHERE title ILIKE % || :query || %
      OR body  ILIKE % || :query || %
   LIMIT 10;

正規表現フォールバックは、完全なシークエンシャル
スキャンを実行し、大規模なテーブルにスケーリングしません。緊急使用または小規模なデータセット用に予約し、アプリケーションにタイムアウトガードを追加して、長時間実行されるクエリを防止します。

!!!note :ref:`Setting up native PostgreSQL FTS <Setting up native PostgreSQL FTS>` で説明されている\ ``tsvector``
トリガーパターンにより、エンベディングが生成される前に到着した行であっても、FTSカバレッジが常に最新であることが保証されます。これにより、新しいコンテンツの信頼できるフォールバックになります。
