Handling embedding service outages#
埋め込みサービスが利用できない場合、または最近の行の埋め込みが生成されていない場合、ハイブリッド検索クエリは失敗するか、不完全な結果を返します。 3層フォールバックを実装して、これらの状況でもアプリケーションが結果を返し続けるようにします。
フォールバックチェーンの定義#
推奨される劣化チェーン
ハイブリッド — ベクター+全文検索FTS — プライマリパス。埋め込みサービスが必要です。
FTS-only —
tsvectorを使用したキーワード検索 埋め込みサービスは必要ありません。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カバレッジが常に最新であることが保証されます。これにより、新しいコンテンツの信頼できるフォールバックになります。