ホームへ戻る

GitHub Repo

Dify、Qdrantのトランザクション修正をマージ 初回のアノテーション回答有効化時にバインディングが見つからない問題を解消

10月5日に報告されたDify 1.16.1の事例では、Qdrantでアノテーション回答を初期化する際、データベースセッションの不整合により失敗する可能性が指摘された。上流では10月6日に修正がマージされたが、正式リリースに含まれるかどうかは確認が必要だ。

The original uploader was Ggia at Greek Wikipedia. · CC BY-SA 2.5 · Image source
zh-Hant

Difyは10月6日、Qdrantの使用時に「アノテーション回答」を初めて有効化すると失敗する可能性がある問題に対処する修正 #43543 をmainにマージした。前日の報告はセルフホスト版Dify 1.16.1で発生したもので、指定した埋め込みプロバイダーとモデルに対応するアノテーションコレクションのバインディングがまだ存在しない場合、バックグラウンドジョブがバインディングを見つけられないエラーを投げる一方、同じ環境で通常のナレッジベースのインデックス作成は正常に動作していたという。問題報告、マージ記録

アノテーション回答では、開発者が人手で整理した質問と回答を保存し、埋め込みベクトルを使って新しい質問と照合できる。類似度がしきい値を超えると、モデルによる生成を省略して標準の回答を直接返す。このため、初期化の障害は実運用に影響する。カスタマーサポートやナレッジサービスに人手で用意した回答があっても、優先マッチング機能を有効にできない可能性がある。Dify機能ドキュメント

報告者は原因をトランザクションの境界にあると分析した。有効化ジョブは、明示的に渡されたSQLAlchemy sessionを使ってコレクションのバインディングを作成し、flush()を実行する。一方、ベクターファクトリーはそのsessionをバックエンドの初期化メソッドに渡さず、その後Qdrant連携がdb.sessionを使って検索していた。追加されたデータはまだコミットされていないため、別のsessionからはレコードを見つけられず、初期化が失敗してトランザクションがロールバックされた。これは報告者による仕組みの分析であり、SQLAlchemyの公式ドキュメントでも、flushはトランザクション内で行われ、トランザクションを確定するcommitとは別の手順だと説明されている。技術分析、SQLAlchemyドキュメント

マージされた修正は、呼び出し元のsessionを使ってQdrantのアノテーションバインディングを検索する方針を採用している。マージページには43件のチェックが通過したと表示されている。これは上流で対応が行われた証拠だが、すべてのデプロイ済みバージョンで修正済みとは限らず、他のベクターバックエンドにも同じ影響があることを示すものでもない。修正状況

エンジニアリングチームは、監視上の見落としにも注意が必要だ。報告によると、有効化ジョブは例外を捕捉した後に再送出しないため、機能が有効になっていないにもかかわらず、Celery上では成功と表示されることがある。そのため受け入れ確認では、初回のバインディング作成、実際の有効化状態、アノテーションのヒット結果を検証する必要がある。今後は、この修正を含む正式リリースと、エラーを再送出しない挙動が別途改善されるかどうかを追跡したい。報告の詳細

出典

  1. Annotation Reply fails with Qdrant: Dataset Collection Bindings does not exist!
  2. fix: use caller session for Qdrant annotation bindings
  3. Annotation Reply
  4. Session Basics — SQLAlchemy 2.1 Documentation