liuzhiheng vor 2 Tagen
Ursprung
Commit
a65c62aefd

+ 7 - 0
knowledge_v2/execution_collector.py

@@ -64,6 +64,13 @@ class ExecutionCollector:
         }
         
         try:
+            # 0. Call Default Hot Tool
+            default_hot_tool_detail = self._read_json(cache_dir, 'function_knowledge', 'default_hot_tool_result.json')
+            if default_hot_tool_detail:
+                execution_record["execution"]["call_default_hot_tool"] = default_hot_tool_detail
+                if default_hot_tool_detail.get("cached"):
+                    execution_record["metadata"]["cache_hits"].append("call_default_hot_tool")
+
             # 1. Generate Query
             query_detail = self._read_json(cache_dir, 'function_knowledge', 'generated_query.json')
             if query_detail:

+ 95 - 22
knowledge_v2/function_knowledge.py

@@ -24,7 +24,7 @@ sys.path.insert(0, root_dir)
 
 from utils.qwen_client import QwenClient
 from utils.gemini_client import generate_text
-from knowledge_v2.tools_library import call_tool, save_tool_info, get_all_tool_infos, get_tool_info, get_tool_params
+from knowledge_v2.tools_library import call_tool, save_tool_info, get_all_tool_infos, get_tool_info, get_tool_params, default_call_hot_tool
 from knowledge_v2.multi_search_knowledge import get_knowledge as get_multi_search_knowledge
 from knowledge_v2.cache_manager import CacheManager
 
@@ -59,6 +59,83 @@ class FunctionKnowledge:
         with open(prompt_path, 'r', encoding='utf-8') as f:
             return f.read().strip()
 
+    def call_default_hot_tool(self, combined_question: str, input_info: str) -> str:
+        """
+        调用默认的热榜工具
+        :param combined_question: 组合问题
+        :param input_info: 输入的需求信息
+        :return: 热榜数据分析结果
+        """
+        logger.info(f"[步骤0] 调用默认热榜工具...")
+        
+        try:
+            # 尝试从缓存获取
+            if self.use_cache:
+                cached_data = self.cache.get(combined_question, 'function_knowledge', 'default_hot_tool_result.json')
+                if cached_data:
+                    result = cached_data.get('analysis_result', cached_data.get('result', ''))
+                    logger.info(f"✓ 使用缓存的热榜分析结果")
+                    return result
+
+            # 加载提取参数prompt
+            extract_params_prompt = self._load_prompt("function_default_hot_tool_extract_params_prompt.md")
+            extract_params_prompt = extract_params_prompt.replace('{input_info}', input_info)
+            
+            # 调用大模型生成参数
+            logger.info("  → 调用Gemini提取热榜工具参数...")
+            params_text = generate_text(prompt=extract_params_prompt)
+            params_json_str = self.extract_and_validate_json(params_text)
+            
+            if not params_json_str:
+                logger.error("✗ 默认热榜工具参数提取失败")
+                return "默认热榜工具参数提取失败"
+            
+            # 解析参数
+            params = json.loads(params_json_str)
+            category = params.get('category', '全部')
+            rankDate = params.get('rankDate')
+            
+            logger.info(f"✓ 提取参数成功: category={category}, rankDate={rankDate}")
+            
+            # 调用默认热榜工具
+            logger.info("  → 调用默认热榜工具...")
+            hot_data = default_call_hot_tool(category=category, rankDate=rankDate)
+            
+            if not hot_data or (isinstance(hot_data, str) and len(hot_data.strip()) == 0):
+                logger.warning("⚠ 热榜工具返回数据为空")
+                return "热榜工具返回数据为空,无法进行分析"
+            
+            logger.info(f"✓ 获取热榜数据成功,数据长度: {len(hot_data)} 字符")
+
+            # 分析热榜数据
+            logger.info("  → 调用Gemini分析热榜数据...")
+            analyze_prompt = self._load_prompt("function_default_hot_tool_result_analzye_prompt.md")
+            analyze_prompt = analyze_prompt.replace('{input_info}', input_info).replace('{hot_data}', hot_data)
+            
+            analysis_result = generate_text(prompt=analyze_prompt)
+            analysis_result = analysis_result.strip()
+            
+            logger.info(f"✓ 热榜数据分析完成")
+
+            # 保存到缓存
+            if self.use_cache:
+                cache_data = {
+                    "extract_params_prompt": extract_params_prompt,
+                    "params": params,
+                    "hot_data": hot_data,
+                    "analyze_prompt": analyze_prompt,
+                    "analysis_result": analysis_result
+                }
+                self.cache.set(combined_question, 'function_knowledge', 'default_hot_tool_result.json', cache_data)
+            
+            return analysis_result
+            
+        except Exception as e:
+            logger.error(f"✗ 调用默认热榜工具失败: {e}")
+            import traceback
+            logger.error(traceback.format_exc())
+            return f"调用默认热榜工具失败: {str(e)}"
+    
     def generate_query(self, question: str, post_info: str, persona_info: str) -> str:
         """
         生成查询语句
@@ -436,6 +513,10 @@ class FunctionKnowledge:
         combined_question = input_info
         
         try:
+            # 步骤0: 调用默认的热榜工具
+            default_hot_result = self.call_default_hot_tool(combined_question, input_info)
+            logger.info(f"✓ 默认热榜工具结果: {default_hot_result}")
+
             # 步骤1: 生成Query
             # query = self.generate_query(question, post_info, persona_info)
             
@@ -556,27 +637,19 @@ class FunctionKnowledge:
 if __name__ == "__main__":
     # 测试代码
     
-    input_info = """1.已知信息账号人设:
--账号的品类:宠物表情包账号
--人设里能和该贴匹配的点:
-鼓励式猫咪表情包-猫咪考试祝福
-推广饮品品牌-推广餐饮品牌
-互动粉丝-互动特点人群
-拟人化猫咪形象-拟人化猫咪形象
-表情包式图文-表情包式视觉风格
-情景化植入-强关联场景植入
--账号聚出来的pattern模式:
-模式1: 拟人化穿搭+趣味分享意图, 萌宠主题内容+拟人化主体,视觉构图版式....
-模式2:校园学生人设+商业推广意图,商业产品推厂+场景化产品植入
-模式3:日常生活演绎+萌宠主题内容+图文叙事结构
-模式4:视觉隐喻+趣味分享意图+视觉构图版式
-
-2.待寻找点:
--社交媒体解构贴中未与账号人设匹配的信息
-考试祝福
-
-3.帖子创作日期:2025-11-07
-"""
+    input_info = """账号背景
+- 账号品类:宠物表情包账号
+- 选题模式:
+    - 模式1:聚焦于拟人化穿搭内容灵感,借助拟人化主体与视觉构图版式的关键特征,最终实现趣味分享意图并呈现萌宠主题内容。
+    - 模式2:以校园学生人设为内容灵感,运用场景化产品植入的方式,以实现商业推广意图和商业产品推广为主要目的。
+    - 模式3:聚焦于日常生活演绎,借助图文叙事结构的表现形式,以呈现萌宠主题内容及实现趣味分享意图为核心导向。
+    - 模式4:以视觉隐喻作为主要的内容灵感来源,结合视觉构图版式的关键特征进行呈现,最终达成趣味分享意图与多元生活趣闻的内容目的。
+
+帖子解构信息
+- 灵感点:猫咪考试祝福
+- 目的点:推广餐饮品牌、互动特定人群、饺子品牌、考试祝福
+- 关键点:拟人化猫咪形象、表情包式视觉风格、强关联场景植入、祈福式指令文案
+- 创作日期:2025-11-07"""
 
     try:
         agent = FunctionKnowledge()

+ 43 - 0
knowledge_v2/prompt/function_default_hot_tool_extract_params_prompt.md

@@ -0,0 +1,43 @@
+你是一个API调用专家,你的任务是根据输入信息生成热榜工具API正确的调用参数。
+
+输入的信息:
+{input_info}
+
+热榜工具API参数定义:
+- category 某个分类下榜单,可选值有: 全部、美妆,美容个护,鞋包潮玩,穿搭打扮,美食,母婴育儿,旅游出行,家居家装,教育,生活,运动健身,兴趣爱好,影视综,婚嫁,摄影摄像,萌宠,情感星座,科技互联网,资讯,健康养生,科学科普,职场,交通工具,其他。 默认值为:全部
+- rankDate 榜单日期,格式为YYYY-MM-DD
+
+请分析工具的参数要求,根据输入的信息推断出合适的参数值。
+
+**输入理解**
+
+你会收到两类信息:
+
+## 1. 已知信息-账号人设(上下文环境)
+包含:
+- 账号品类:账号所属的内容领域
+- 选题模式:账号总结出的内容创作选题模式
+
+## 2. 创作帖子解构信息
+- 帖子选题阶段解构输出的灵感点、目的点、关键点
+- 帖子的创作日期
+
+**业务背景**
+在帖子创作过程中,创作者可能会从热榜中得到选题灵感,为了验证这一点,我们先调用热榜工具得到当时的榜单数据,然后再分析该创作者的选题过程。
+因此首先需要推断出热榜工具API调用参数。
+
+**输出格式**
+请以 JSON 格式输出参数字典,例如:
+{{
+    "param1": "value1",
+    "param2": "value2"
+}}
+
+**注意事项**:
+1. 只输出参数的JSON字典,不要包含任何解释
+2. 参数名必须与工具定义中的参数名完全一致
+3. 参数值要从输入中提取或合理推断
+4. 不要添加工具定义中没有的参数
+5. 如果某个参数无法从查询中获取,使用合理的默认值或省略该参数
+
+只输出JSON,不要包含markdown标记。

+ 66 - 0
knowledge_v2/prompt/function_default_hot_tool_result_analzye_prompt.md

@@ -0,0 +1,66 @@
+# 角色定义
+你是一名内容创作选题溯源分析师,专门从热榜数据中反向推导创作者的选题灵感来源。
+
+# 任务背景
+我们正在验证一个假设:创作者的帖子选题可能源自热榜内容。你需要分析热榜数据与帖子选题之间的关联性。
+
+---
+
+# 输入信息
+{input_info}
+
+输入信息包含 **账号背景** 和 **帖子解构信息** 两大数据
+账号背景包含以下字段:
+- **账号品类**:账号所属的内容领域
+- **选题模式**:该账号惯用的选题策略/模式
+
+帖子解构信息包含以下字段:
+- **灵感点**:选题的灵感来源
+- **目的点**:创作目的/想要传达的核心
+- **关键点**:内容的关键要素
+- **创作日期**:帖子发布时间
+
+# 热榜数据
+{hot_data}
+
+---
+
+# 分析任务
+
+从创作者视角出发,判断热榜内容是否可能启发了该帖子的选题。
+
+## 有效关联的判定标准
+以下情况均视为有效关联:
+1. **直接匹配**:热榜内容与灵感点/目的点直接相关
+2. **间接启发**:热榜话题经过延伸、转化后可推导出该选题
+3. **要素关联**:热榜中的关键词、人物、事件与帖子存在明显关联
+4. **模式契合**:热榜内容符合该账号的选题模式,可合理推断为灵感来源
+
+---
+
+# 输出要求
+
+## 情况一:找到关联
+按以下格式输出:
+
+### 关联的热榜内容
+[列出相关的热榜条目]
+
+### 推导路径
+[分步骤说明:热榜内容 → 中间推理 → 帖子选题]
+
+### 置信度评分
+- 分值:[0-1,保留两位小数]
+- 评分依据:[简要说明为何给出该分数]
+
+## 情况二:无关联
+直接输出:
+> 无法从热榜中找到与该帖子选题相关的有效信息。
+
+---
+
+# 分析原则
+1. 优先考虑时间合理性:热榜时间应早于或接近创作日期
+2. 结合账号品类筛选:重点关注与账号领域相关的热榜内容
+3. 参考选题模式:判断是否符合该账号的惯用选题逻辑
+4. 宁可漏判,不可强关联:只输出有合理依据的推导关系

+ 34 - 1
knowledge_v2/tools_library.py

@@ -7,6 +7,7 @@
 3. 获取工具调用参数信息
 '''
 
+from ast import main
 import requests
 import os
 import json
@@ -33,6 +34,33 @@ def call_tool(tool_name: str, arguments: dict):
         # 在实际生产中可能需要更复杂的错误处理或日志记录
         return {"error": f"Failed to call tool {tool_name}: {str(e)}"}
 
+def default_call_hot_tool(category: str=None, rankDate: str=None) -> str:
+    '''
+    调用默认的话题热榜、热搜词榜单工具
+    :param category: 话题类型,如全部、美食、萌宠等,默认为'全部'
+    :param rankDate: 排名日期,格式为YYYY-MM-DD
+    :return: 工具调用结果
+    '''
+    category = '全部' if category is None else category
+
+    tool_name = 'new_red_TopicRanking'
+    hot_topic_result_json = call_tool(tool_name, {
+        'type': category,
+        'rankDate': rankDate
+    })
+    hot_topic_result = hot_topic_result_json.get('result', '')
+
+    tool_name = 'new_red_hot_search_words_ranking'
+    hot_search_words_result_json = call_tool(tool_name, {
+        'typeV1': category,
+        'rankDate': rankDate
+    })
+    hot_search_words_result = hot_search_words_result_json.get('result', '')
+
+    result = f'{hot_topic_result}\n\n\n{hot_search_words_result}'
+
+    return result
+
 def save_tool_info(tool_name: str, tool_doc: str):
     """
     保存新的待接入工具的信息
@@ -153,4 +181,9 @@ def get_tool_params(tools_id: str) -> str:
         return ""
         
     except Exception as e:
-        return f"Error reading tool params: {str(e)}"
+        return f"Error reading tool params: {str(e)}"
+
+
+if __name__ == "__main__":
+    result = default_call_hot_tool(rankDate = '2025-12-06')
+    print(result)