「バグ報告」v1.13.0 知識検索ノードのメタデータフィルタリングで「変数」は無効、「定数」は正常——ソースコード

問題の説明

Dockerで自己デプロイされたDify v1.13.0において、ナレッジ検索ノードのメタデータフィルタリング機能に以下の異常があります。

  • :white_check_mark: フィルタリング値を定数に設定した場合:正常にフィルタリングされ、結果は期待通りです。

  • :cross_mark: フィルタリング値を変数に設定した場合(他のノードの出力を参照):フィルタリングが完全に機能せず、結果が正しくありません。

v1.11.4バージョンではこの機能は正常に動作していましたが、v1.13.0にアップグレード後にこの問題が発生しました。


根本原因(ソースコード分析)

v1.13.0のソースコードを分析した結果、v1.13.0ではナレッジ検索ノードがリファクタリングされ、コードが古いパスから:

Code

api/core/workflow/nodes/knowledge_retrieval/

新しいパスに移行しました:

Code

api/dify_graph/nodes/knowledge_retrieval/

問題は _extract_variable_selector_to_variable_mapping メソッドにあります。このメソッドの役割は、グラフエンジンに「このノードがどのアップストリーム変数に依存しているか」を伝えることであり、エンジンはこれに基づいて事前に変数値を variable_pool(変数プール)に注入します。

しかし、新しいバージョンのコードでは、このメソッドはクエリ変数のみを登録しており、メタデータフィルタリング条件内の変数参照を完全に漏らしています:

Python

# api/dify_graph/nodes/knowledge_retrieval/knowledge_retrieval_node.py
@classmethod
def _extract_variable_selector_to_variable_mapping(cls, *, graph_config, node_id, node_data):
    typed_node_data = KnowledgeRetrievalNodeData.model_validate(node_data)

    variable_mapping = {}
    if typed_node_data.query_variable_selector:
        variable_mapping[node_id + ".query"] = typed_node_data.query_variable_selector
    if typed_node_data.query_attachment_selector:
        variable_mapping[node_id + ".queryAttachment"] = typed_node_data.query_attachment_selector

    # ❌ ここでは metadata_filtering_conditions 内の変数参照が全く処理されていません!
    return variable_mapping

これにより、実行時に _resolve_metadata_filtering_conditions() を実行する際、variable_pool.convert_template("{{#node_id.var#}}") を呼び出しても変数プールに対応する変数が見つからず、フィルタリング条件が無効になります。

定数が正常に動作する理由は、定数値(例:"abc")が convert_template 時にテンプレート内に {{#...#}} プレースホルダーを持たず、そのまま返されるため、変数プールに全く依存しないからです。


実行フローの比較

定数 変数
保存形式 "abc" "{{#start.my_var#}}"
変数プールに依存するか いいえ、直接使用 はい、実行時にプールから値を取得
事前登録が必要か いいえ はい、_extract_variable_selector_to_variable_mapping で登録必須
v1.13.0の結果 :white_check_mark: 正常 :cross_mark: 失敗

修正案

_extract_variable_selector_to_variable_mapping メソッドにおいて、metadata_filtering_conditions 内の変数参照の登録ロジックを追加し、各 condition.value 内の {{#...#}} テンプレートを解析して、対応する変数を variable_mapping に追加してください。


環境情報

  • Dify バージョン:v1.13.0(Docker 自己デプロイ)

  • 問題バージョン比較:v1.11.4 正常、v1.13.0 異常

  • 問題のパスapi/dify_graph/nodes/knowledge_retrieval/knowledge_retrieval_node.py


公式による早急な修正を希望します。よろしくお願いいたします!

我也遇到了相同的问题,版本也是1.13.0,希望官方能尽快修复

我试了1.13.3版本可以实现传入变量元数据过滤了

感谢,我升级到新版本后可以使用元数据过滤了 :smiling_face_with_three_hearts: