Kaynağa Gözat

fix: constrain v2 demand itemsets to element-backed patterns

SamLee 3 hafta önce
ebeveyn
işleme
762d2bc3ed

+ 3 - 1
examples/demand/demand.md

@@ -79,6 +79,7 @@ $system$
 
 - **本次 MVP 最终可写入的 DemandItem 只允许 `source_kind="pattern_itemset"`**。不要把 `element` / `category` / `co_occurrence` 作为最终 `evidence_refs.source_kind`,这些只能用于探索,不能用于创建需求。
 - Pattern 证据源是 PG Pattern V2,最终只允许使用 `pattern_itemset.scope="topic"` 的分类 Pattern;`topic_element`、script、paragraph、group scope 都不能作为最终证据。
+- 只能选择能闭合到真实点位证据的 itemset:优先使用 `dimension_mode="substance_form_only"` 的结果。不要选择 `dimension_mode="需求"`、`target_depth="all_ancestors"` 或 items 里 `dimension="需求"` 的 itemset;这类 itemset 不能稳定生成 `query_seed_points`。
 - `source_tool` 必须填写 `get_itemset_detail`,因为最终证据必须来自项集详情。
 - `itemset_ids` 必须来自 `get_frequent_itemsets` 返回的真实项集 ID,并且在创建需求前必须用 `get_itemset_detail` 查询过。
 - 每条 DemandItem 只能绑定一个 `itemset_id`。
@@ -143,10 +144,11 @@ $user$
 请按以下顺序工作:
 
 1. 先用 `get_weight_score_topn` / 分类树 / 搜索工具理解「%merge_level2%」的高价值元素和分类。
-2. 再用 `get_frequent_itemsets` 查找能支撑这些需求的频繁项集。
+2. 再用 `get_frequent_itemsets(dimension_mode="substance_form_only")` 查找能支撑这些需求的频繁项集。
 3. 对准备采用的每个项集,必须调用 `get_itemset_detail(itemset_ids=[...])`。
 4. 只从 `get_itemset_detail` 返回的详情中选择需求证据:
    - `itemset_ids`: 当前项集 ID。
+   - `items`: 只能选择 `dimension` 属于 `实质/形式/意图` 的项集;不要选择 `需求` 维度项集。
    - `source_post_id`: 从该项集 `post_ids` 中选择一个真实帖子。
    - 不要填写 `seed_terms`,代码会从该项集 `items` 里的分类路径、分类名或元素名提取。
 5. 调用 `create_demand_item` 或 `create_demand_items` 时,每条必须使用如下结构:

+ 3 - 1
examples/demand/demand_mysql.md

@@ -15,6 +15,7 @@ $system$
 ## 硬约束
 
 - 只允许基于 PG Pattern V2 的 `scope="topic"` 频繁项集生成需求。
+- 只能选择能闭合到真实点位证据的 itemset:优先使用 `dimension_mode="substance_form_only"` 的结果。不要选择 `dimension_mode="需求"`、`target_depth="all_ancestors"` 或返回 items 里 `dimension="需求"` 的 itemset;这类 itemset 不能稳定生成 `query_seed_points`。
 - 每个 DemandItem 都必须带 `evidence_refs`。
 - `evidence_refs.source_kind` 固定为 `"pattern_itemset"`。
 - `evidence_refs.source_tool` 固定为 `"get_itemset_detail"`。
@@ -27,7 +28,7 @@ $system$
 ## 执行步骤
 
 1. 可先调用 `get_weight_score_topn` 查看当前品类下高权重元素/分类,用于辅助判断哪些方向值得生成需求。
-2. 调用 `get_frequent_itemsets(top_n=%count% * 3, min_support=5, sort_by="absolute_support")`。工具会自动按当前 `merge_leve2/platform` 过滤支撑帖。
+2. 调用 `get_frequent_itemsets(top_n=%count% * 3, min_support=5, sort_by="absolute_support", dimension_mode="substance_form_only")`。工具会自动按当前 `merge_leve2/platform` 过滤支撑帖。
 3. 从返回结果中挑选语义清晰、彼此尽量不重复的 itemset,数量尽量接近 %count%。
 4. 调用一次 `get_itemset_detail(itemset_ids=[...])` 查询这些 itemset 的详情。
 5. 调用一次 `create_demand_items(demand_items=[...])` 批量创建需求。
@@ -56,6 +57,7 @@ $system$
 ## 选择标准
 
 - 优先选择 `absolute_support` 高、分类组合语义明确的 itemset。
+- 只选择 items 里的 `dimension` 属于 `实质/形式/意图` 的 itemset;不要选择 `需求` 维度 itemset。
 - 过滤纯形式、过于抽象、难以表达用户需求的组合。
 - 如果候选不足 %count% 条,可以少于 %count%,不要编造需求。
 - 不要重复创建语义相同的需求。

+ 7 - 0
examples/demand/demand_pattern_tools.py

@@ -207,6 +207,13 @@ def get_frequent_itemsets(
     execution_id = TopicBuildAgentContext.get_execution_id()
     merge_leve2 = _resolve_scope_arg(merge_leve2, "merge_leve2")
     platform = _resolve_scope_arg(platform, "platform")
+    if _is_mysql_demand_content_entrypoint():
+        # V2 evidence needs exact PG element bindings and query_seed_points.
+        # The PG "需求" mining configs map to category nodes but often do not
+        # have source element rows, so keep the generation funnel on topic
+        # itemsets that can close through 实质/形式/意图 elements.
+        if not dimension_mode or str(dimension_mode).strip() == "需求":
+            dimension_mode = "substance_form_only"
     params = {
         "execution_id": execution_id, "top_n": top_n,
         "category_ids": category_ids, "dimension_mode": dimension_mode,