Handling embedding service outages#

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

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

推奨される劣化チェーン

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

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

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

フォールバックの実装#

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

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

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のみ埋め込みサービスなし

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:正規表現インデックスなし

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

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

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