Przeglądaj źródła

how agent update

liuzhiheng 2 dni temu
rodzic
commit
23202e7825

+ 3 - 39
examples_how/overall_derivation/derivation_main.md

@@ -60,44 +60,6 @@ $system$
    - `failed_points = []`(已失败选题点列表,初始为空)
    - `consecutive_zero_rounds = 0`(连续零匹配轮数,初始为 0)
 
-### 推导流程图:
-```plantuml
-@startuml
-start
-:步骤一:策略决策;
-note right
-  判断广召回/收敛阶段
-  检查 failed_points 列表
-  确定本轮推导方法与参数组合
-end note
-:步骤二:执行推导;
-note right
-  调用工具,按推导路径产出候选选题点
-  每条路径只用一种方法、调用一次工具
-end note
-:步骤三:匹配判断;
-note right
-  从工具返回的「帖子选题点匹配」中
-  判断各推导点是否匹配成功
-  (信息搜索产出点调用 point_match 工具)
-end note
-:步骤四:写入日志 + 更新集合;
-note right
-  写推导日志与评估日志
-  更新已推导成功集合 + failed_points
-end note
-if (连续 5 轮匹配率 = 0% ?) then (是)
-    end
-  else (否)
-    if (已达 15 轮上限 ?) then (是)
-      end
-    else (否)
-      :回到步骤一;
-    endif
-  endif
-endif
-@enduml
-```
 
 ### 推导主循环
 
@@ -117,6 +79,7 @@ endif
 **步骤四:写入日志 + 更新集合(每轮必须执行,不可省略)**  
 - 将本轮推导路径按**推导日志**格式写入 `output/{account_name}/推导日志/{帖子ID}/{log_id}/{轮次}_推导.json`
 - 将步骤三的匹配判断结果按**评估日志**格式写入 `output/{account_name}/推导日志/{帖子ID}/{log_id}/{轮次}_评估.json`
+- 直接调用工具写入文件即可,不需要创建目录
 - 根据匹配结果更新已推导成功选题点集合:将 `is_matched=true` 的 `matched_post_point`(帖子选题点名称)加入集合(详见「已推导成功选题点的更新规则」)
 - 根据匹配结果更新 failed_points 列表:将 `is_matched=false` 的推导选题点记录在案,后续推导中**原则上不得再次输出**该名称;若确有必要重新推导,须换用完全不同的推导方法与输入组合
 
@@ -342,7 +305,8 @@ endif
 
 4. **工具调用规则**:
    - `find_tree_constant_nodes`、`find_tree_nodes_by_conditional_ratio`、`find_pattern` 三个工具的返回数据中已内置帖子选题点匹配,主 agent 直接读取「帖子选题点匹配」字段即可,**无需**额外调用 `point_match` 工具对这三种方法的产出点进行匹配。
-   - **信息搜索(方法四)分为两个阶段**:步骤二中通过 `agent(task="...", agent_type="derivation_search")` 执行搜索获取候选点;步骤三匹配判断时,单独调用 `point_match` 工具对搜索产出的候选点进行匹配——两者职责不同,不可混淆。
+   - `point_match` 工具只能和 信息搜索方法配对使用,禁止对 人设常量、账号pattern复用、人设推导 方法返回的数据使用 `point_match` 工具匹配,更加禁止联想扩展一些词进行匹配。
+   - **信息搜索(方法四)分为两个阶段**:步骤二中通过 `agent(task="...", agent_type="derivation_search")` 执行搜索获取候选点;步骤三匹配判断时,单独调用 `point_match` 工具对搜索产出的候选点进行匹配——两者职责不同,不可混淆。**注意**:获取到候选点后只能调用一次 `point_match` 工具进行匹配,不要用`point_match`进行多次匹配探索 
    - **禁止**主 agent 直接调用 `search_posts` 工具。信息搜索的执行**只能**通过 `agent(task="...", agent_type="derivation_search")` 完成,任何情况下不得例外。
 
 

+ 1 - 1
examples_how/overall_derivation/generate_visualize_data.py

@@ -341,5 +341,5 @@ def main(account_name, post_id, log_id):
 if __name__ == "__main__":
     account_name="家有大志"
     post_id = "68fb6a5c000000000302e5de"
-    log_id="20260309180228"
+    log_id="20260310005446"
     main(account_name, post_id, log_id)

Plik diff jest za duży
+ 271 - 295
examples_how/overall_derivation/input/家有大志/match_data/68fb6a5c000000000302e5de_匹配_all.json


+ 0 - 6
examples_how/overall_derivation/presets.json

@@ -1,10 +1,4 @@
 {
-  "evaluate_derivation": {
-    "max_iterations": 30,
-    "temperature": 0.2,
-    "skills": ["planning", "derivation_eval"],
-    "description": "选题点推导评估子 Agent,调用 point_match 获取匹配结果并整理为规定 JSON,判断是否需下一轮推导"
-  },
   "derivation_search": {
     "max_iterations": 15,
     "temperature": 0.2,

+ 6 - 0
examples_how/overall_derivation/tools/find_pattern.py

@@ -269,6 +269,12 @@ async def find_pattern(
                 item["帖子选题点匹配"] = (
                     pattern_matches if distinct_post_points >= 2 else "无"
                 )
+
+
+        # [临时] 仅保留有帖子选题点匹配的记录(distinct_post_points>=2),方便后续删除
+        items = [x for x in items if isinstance(x.get("帖子选题点匹配"), list)]
+
+
         if not items:
             output = f"未找到条件概率 >= {conditional_ratio_threshold} 的 pattern"
         else:

+ 6 - 0
examples_how/overall_derivation/tools/find_tree_node.py

@@ -301,6 +301,12 @@ async def find_tree_nodes_by_conditional_ratio(
             for item in items:
                 matches = node_match_map.get(item["节点名称"], [])
                 item["帖子选题点匹配"] = matches if matches else "无"
+
+
+        # [临时] 仅保留有帖子选题点匹配的记录(过滤掉「无」),方便后续删除
+        items = [x for x in items if isinstance(x.get("帖子选题点匹配"), list)]
+
+
         if not items:
             output = f"未找到条件概率 >= {conditional_ratio_threshold} 的节点"
         else:

+ 1 - 1
examples_how/overall_derivation/tools/point_match.py

@@ -26,7 +26,7 @@ except ImportError:
 _BASE_INPUT = Path(__file__).resolve().parent.parent / "input"
 
 # 默认匹配阈值
-DEFAULT_MATCH_THRESHOLD = 0.8
+DEFAULT_MATCH_THRESHOLD = 0.78
 
 
 def _post_topic_file(account_name: str, post_id: str) -> Path:

+ 28 - 12
examples_how/overall_derivation/utils/similarity_calc.py

@@ -72,32 +72,48 @@ class SimilarityItem(TypedDict):
 
 # 批量提示词模板(LLM 打分用)。占位符:{count}、{pairs_list};JSON 内大括号已转义
 DEFAULT_BATCH_PROMPT_TEMPLATE = """
-请从语意角度判断以下{count}对短语的相似度,每对从0-1打分,输出格式如下(必须是一个JSON数组):
+# 角色
+你是一个语言学家、信息学家,能够理解、区分、辨别不同词语、词汇之间所表达的语义信息量的细微差异。
+
+# 任务
+从语义相似程度的角度,对以下{count}对短语的语义相似度进行打分,两者的语义越相近得分越高。
+
+# 核心打分规则:
+1. 打分时必须严格区分“语义相似”与“语义关联”两种关系,语义"相似"≠语义"关联",不能混淆:
+- ✅ 语义相似(高分):两个词语表达的核心含义高度重叠,可以在相近语境中互相替换。例如:"快乐"与"开心"。
+- ❌ 语义关联(低分):两个词语有逻辑/功能/字形上的联系,但各自指代的事物或概念本身并不相同,不能互相替换。
+2. 禁止因为两个短语共享汉字或词根就给高分。字形相近 ≠ 语义相近。
+3. 当一个短语**包含另一个短语**作为组成部分时,复合后的语义范围已发生显著变化,应根据语义实际差距给分,不得因"包含"关系而虚高打分。
+4. 给每对短语进行打分时,将每对短语的打分都当做是完全独立的事件来判断打分,不同对的短语之间打分没有关联,当做自己看不到别的短语,**禁止**参考其它对短语的打分结果。
+
+# 打分量化参考(分值范围 0.00 - 1.00,最小颗粒度 0.01)
+- **[0.90 - 1.00] 极度相似 / 同义替换**:核心概念完全一致,仅表述习惯不同。
+- **[0.80 - 0.89] 高度相似 / 细微差异**:核心概念一致,但在范围、颗粒度、或侧重点上有轻微区别。
+- **[0.50 - 0.79] 中度相似 / 修饰偏离**:共享部分核心概念,但其中一个多出了强烈的修饰语或限定条件,导致语义重心发生偏移。
+- **[0.20 - 0.49] 低度相似 / 类别偏移**:字面有重合或场景高度相关,但**核心类别(词性或实体类型)已经改变**。
+- **[0.00 - 0.19] 毫不相干**:语义完全无关。
+
+# 输出格式(必须是一个JSON数组):
 ```json
 [
     {{
         "text_1": "",
         "text_2": "",
-        "score": 0.0,
+        "score": 0.00,
         "reason": "简明扼要说明理由"
     }},
-    {{
-        "text_1": "",
-        "text_2": "",
-        "score": 0.0,
-        "reason": "简明扼要说明理由"
-    }}
+    ...
 ]
 ```
 
-短语对列表:
+# 短语对列表:
 {pairs_list}
 """.strip()
 
 # Embedding 相似度 API
 EMBEDDING_SIMILARITY_URL = "http://61.48.133.26:8187/cartesian_similarity"
 # LLM 模型
-LLM_MODEL = "google/gemini-3-flash-preview"
+LLM_MODEL = "google/gemini-3.1-flash-lite-preview"
 
 
 def _phrase_pairs(phrases_a: List[str], phrases_b: List[str]) -> List[Tuple[str, str]]:
@@ -339,8 +355,8 @@ async def test_similarity_matrix() -> None:
     """集成测试:调用 embedding + LLM 得到相似度对象列表。use_llm_cache 可控制是否使用 LLM 缓存。"""
     # use_llm_cache = True
     use_llm_cache = False
-    phrases_a = ["犬", "猫咪", "夸张"]
-    phrases_b = ["狗", "手机", "夸张堆叠"]
+    phrases_a = ["柴犬形象", "鞋子", "夸张"]
+    phrases_b = ["柴犬主角", "鞋架", "夸张堆叠"]
     items = await similarity_matrix(phrases_a, phrases_b, use_llm_cache=use_llm_cache)
     for item in items:
         print(item)

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików