Browse Source

Merge remote-tracking branch 'origin/lzh_knowledge_1202' into lzh_knowledge_1202

# Conflicts:
#	knowledge_v2/llm_search_knowledge.py
TanJingyu 20 hours ago
parent
commit
74eba7b6e5

+ 36 - 30
knowledge_v2/llm_search_knowledge.py

@@ -285,7 +285,10 @@ class LLMSearchKnowledge:
             Exception: 合并失败时抛出异常
         """
         logger.info(f"[步骤3] 合并知识 - 共 {len(knowledge_texts)} 个文本")
-        
+
+        if len(knowledge_texts) == 1:
+            return knowledge_texts[0]
+
         # 尝试从缓存读取
         if self.use_cache:
             cached_merged = self.cache.get(question, 'llm_search', 'merged_knowledge.txt')
@@ -350,17 +353,17 @@ class LLMSearchKnowledge:
         except Exception as e:
             logger.error(f"✗ 合并知识文本失败: {e}")
             raise
-    
+
     def _save_execution_detail(self, cache_key: str):
         """
         保存执行详情到缓存(支持合并旧记录)
-        
+
         Args:
             cache_key: 缓存键
         """
         if not self.use_cache or not self.cache:
             return
-        
+
         try:
             import hashlib
             question_hash = hashlib.md5(cache_key.encode('utf-8')).hexdigest()[:12]
@@ -370,46 +373,46 @@ class LLMSearchKnowledge:
                 'llm_search'
             )
             os.makedirs(detail_dir, exist_ok=True)
-            
+
             detail_file = os.path.join(detail_dir, 'execution_detail.json')
-            
+
             # 准备最终要保存的数据
             final_detail = self.execution_detail.copy()
-            
+
             # 尝试读取旧文件进行合并
             if os.path.exists(detail_file):
                 try:
                     with open(detail_file, 'r', encoding='utf-8') as f:
                         old_detail = json.load(f)
-                    
+
                     # 1. 合并 generate_queries
                     new_gen = self.execution_detail.get("generate_queries")
                     old_gen = old_detail.get("generate_queries")
-                    if (new_gen and isinstance(new_gen, dict) and 
-                        new_gen.get("cached") is True and 
-                        old_gen and isinstance(old_gen, dict) and 
-                        "prompt" in old_gen):
+                    if (new_gen and isinstance(new_gen, dict) and
+                            new_gen.get("cached") is True and
+                            old_gen and isinstance(old_gen, dict) and
+                            "prompt" in old_gen):
                         final_detail["generate_queries"] = old_gen
-                        
+
                     # 2. 合并 merge_detail
                     new_merge = self.execution_detail.get("merge_detail")
                     old_merge = old_detail.get("merge_detail")
-                    if (new_merge and isinstance(new_merge, dict) and 
-                        new_merge.get("cached") is True and 
-                        old_merge and isinstance(old_merge, dict) and 
-                        "prompt" in old_merge):
+                    if (new_merge and isinstance(new_merge, dict) and
+                            new_merge.get("cached") is True and
+                            old_merge and isinstance(old_merge, dict) and
+                            "prompt" in old_merge):
                         final_detail["merge_detail"] = old_merge
-                        
+
                     # 3. 合并 search_results (列表)
                     new_results = self.execution_detail.get("search_results", [])
                     old_results = old_detail.get("search_results", [])
-                    
+
                     if new_results and old_results:
                         merged_results = []
                         # 建立旧结果的索引:(query, index) -> item
-                        old_map = {(item.get("query"), item.get("query_index")): item 
-                                  for item in old_results if isinstance(item, dict)}
-                        
+                        old_map = {(item.get("query"), item.get("query_index")): item
+                                   for item in old_results if isinstance(item, dict)}
+
                         for item in new_results:
                             if item.get("cached") is True:
                                 key = (item.get("query"), item.get("query_index"))
@@ -421,19 +424,19 @@ class LLMSearchKnowledge:
                                         continue
                             merged_results.append(item)
                         final_detail["search_results"] = merged_results
-                        
+
                 except Exception as e:
                     logger.warning(f"  ⚠ 读取旧详情失败: {e}")
 
             with open(detail_file, 'w', encoding='utf-8') as f:
                 json.dump(final_detail, f, ensure_ascii=False, indent=2)
-            
+
             logger.info(f"✓ 执行详情已保存: {detail_file}")
-            
+
         except Exception as e:
             logger.error(f"✗ 保存执行详情失败: {e}")
     
-    def get_knowledge(self, question: str, cache_key: str = None) -> str:
+    def get_knowledge(self, question: str, cache_key: str = None, need_generate_query: bool = True) -> str:
         """
         主方法:根据问题获取知识文本
         
@@ -459,7 +462,10 @@ class LLMSearchKnowledge:
             logger.info(f"{'='*60}")
             
             # 步骤1: 生成多个query
-            queries = self.generate_queries(actual_cache_key)
+            if need_generate_query:
+                queries = self.generate_queries(actual_cache_key)
+            else:
+                queries = [question]
             
             # 步骤2: 对每个query搜索知识
             knowledge_texts = self.search_knowledge_batch(actual_cache_key, queries)
@@ -485,7 +491,7 @@ class LLMSearchKnowledge:
             raise
 
 
-def get_knowledge(question: str, cache_key: str = None) -> str:
+def get_knowledge(question: str, cache_key: str = None, need_generate_query: bool = True) -> str:
     """
     便捷函数:根据问题获取知识文本
     
@@ -497,7 +503,7 @@ def get_knowledge(question: str, cache_key: str = None) -> str:
         str: 最终的知识文本
     """
     agent = LLMSearchKnowledge()
-    return agent.get_knowledge(question, cache_key=cache_key)
+    return agent.get_knowledge(question, cache_key=cache_key, need_generate_query=need_generate_query)
 
 
 if __name__ == "__main__":
@@ -505,7 +511,7 @@ if __name__ == "__main__":
     test_question = "关于猫咪和墨镜的服装造型元素"
     
     try:
-        result = get_knowledge(test_question)
+        result = get_knowledge(question=test_question, need_generate_query=False)
         print("=" * 50)
         print("最终知识文本:")
         print("=" * 50)

+ 16 - 0
knowledge_v2/prompt/all_tools_infos.md

@@ -0,0 +1,16 @@
+
+工具名:新红话题榜单
+工具调用ID:xh_newrank_hottopics
+工具介绍:提供小红书平台热门话题全景榜单数据,覆盖排名、话题名称及核心简介、参与人数增量、浏览量增量、笔记增量、互动增量(点赞 / 收藏 / 评论综合统计)等核心维度。支持精准筛选与高效应用。话题类型涵盖美妆,美容个护,鞋包潮玩,穿搭打扮,美食,母婴育儿,旅游出行,家居家装,教育,生活,运动健身,兴趣爱好,影视综,婚嫁,摄影摄像,萌宠,情感星座,科技互联网,资讯,健康养生,科学科普,职场,交通工具,其他 24 个垂直领域,统计时间可选择日榜(近 7 天)、周榜(近 4 周)、月榜(近 5 个月),满足不同周期的热点追踪需求。榜单数据实时更新,同步呈现官方流量扶持话题标识,助力品牌、达人快速锁定高曝光赛道;便于拆解爆款逻辑、制定内容选题策略,提升运营效率。
+
+工具名:新红话题搜索
+工具调用ID:new_red_TopicSearch
+工具介绍:提供小红书平台话题精准检索服务,输入关键词即可匹配相关话题完整列表,核心数据包含话题名称及简介、总浏览量、总参与人数、近 30 天笔记增量、近 30 天互动增量。支持按参与人数、浏览量等指标排序筛选,可精准定位品牌发起话题或官方扶持话题,清晰展示话题流量趋势与内容创作方向。无论是达人寻找高适配性话题蹭流,还是品牌监测竞品话题布局,均能通过数据支撑快速决策,降低内容试错成本。
+
+工具名:新红热搜词榜单
+工具调用ID:xh_newrank_hotwords
+工具介绍:提供小红书平台热搜词权威榜单数据,核心维度包括实时排名、热搜词、主要覆盖内容领域、相关笔记总量、爆文数(高互动笔记占比)、热度值(综合搜索量与互动率计算)。支持按统计时间(日榜 / 周榜 / 月榜)及 美妆,美容个护,鞋包潮玩,穿搭打扮,美食,母婴育儿,旅游出行,家居家装,教育,生活,运动健身,兴趣爱好,影视综,婚嫁,摄影摄像,萌宠,情感星座,科技互联网,资讯,健康养生,科学科普,职场,交通工具,其他 24 个垂直内容领域筛选。榜单每日更新,助力用户第一时间捕捉流量风口。可直接应用于选题规划、竞品投放策略分析。
+
+工具名:新红热搜词搜索
+工具调用ID:new_red_hot_search_words_search
+工具介绍:提供小红书热搜词深度检索与趋势分析服务,输入关键词即可获取全维度数据表现:核心包含热度值(实时动态更新)、声量概览(笔记数、总热度、热门天数、热门内容领域、高频搭配词)、近 90 天热度值趋势曲线(支持自定义时间区间)、相关搜索结果。可直观呈现关键词种草趋势、流量峰值时段、高转化内容特征,帮助用户优化笔记标题关键词布局、预判话题生命周期。

+ 80 - 0
knowledge_v2/prompt/all_tools_params.md

@@ -0,0 +1,80 @@
+
+工具名:新红话题榜单
+工具调用ID:xh_newrank_hottopics
+工具调用参数信息:
+{
+    "name": "新红话题榜单",
+    "description": "提供小红书平台热门话题全景榜单数据,覆盖排名、话题名称及核心简介、参与人数增量、浏览量增量、笔记增量、互动增量(点赞 / 收藏 / 评论综合统计)等核心维度。支持精准筛选与高效应用。话题类型涵盖美妆,美容个护,鞋包潮玩,穿搭打扮,美食,母婴育儿,旅游出行,家居家装,教育,生活,运动健身,兴趣爱好,影视综,婚嫁,摄影摄像,萌宠,情感星座,科技互联网,资讯,健康养生,科学科普,职场,交通工具,其他 24 个垂直领域,统计时间可选择日榜(近 7 天)、周榜(近 4 周)、月榜(近 5 个月),满足不同周期的热点追踪需求。榜单数据实时更新,同步呈现官方流量扶持话题标识,助力品牌、达人快速锁定高曝光赛道;便于拆解爆款逻辑、制定内容选题策略,提升运营效率。",
+    "inputSchema": {
+        "type": "object",
+        "properties": {
+            "prompt": {
+                "type": "string",
+                "description": "提示词prompt,包含完整的输入信息,图片、音频等多媒体需要url表示"
+            }
+        },
+        "required": [
+            "prompt"
+        ]
+    }
+}
+
+工具名:新红话题搜索
+工具调用ID:new_red_TopicSearch
+工具调用参数信息:
+{
+    "name": "新红话题搜索",
+    "description": "提供小红书平台话题精准检索服务,输入关键词即可匹配相关话题完整列表,核心数据包含话题名称及简介、总浏览量、总参与人数、近 30 天笔记增量、近 30 天互动增量。支持按参与人数、浏览量等指标排序筛选,可精准定位品牌发起话题或官方扶持话题,清晰展示话题流量趋势与内容创作方向。无论是达人寻找高适配性话题蹭流,还是品牌监测竞品话题布局,均能通过数据支撑快速决策,降低内容试错成本。",
+    "inputSchema": {
+        "type": "object",
+        "properties": {
+            "prompt": {
+                "type": "string",
+                "description": "提示词prompt,包含完整的输入信息,图片、音频等多媒体需要url表示"
+            }
+        },
+        "required": [
+            "prompt"
+        ]
+    }
+}
+
+工具名:新红热搜词榜单
+工具调用ID:xh_newrank_hotwords
+工具调用参数信息:
+{
+    "name": "新红热搜词榜单",
+    "description": "提供小红书平台热搜词权威榜单数据,核心维度包括实时排名、热搜词、主要覆盖内容领域、相关笔记总量、爆文数(高互动笔记占比)、热度值(综合搜索量与互动率计算)。支持按统计时间(日榜 / 周榜 / 月榜)及 美妆,美容个护,鞋包潮玩,穿搭打扮,美食,母婴育儿,旅游出行,家居家装,教育,生活,运动健身,兴趣爱好,影视综,婚嫁,摄影摄像,萌宠,情感星座,科技互联网,资讯,健康养生,科学科普,职场,交通工具,其他 24 个垂直内容领域筛选。榜单每日更新,助力用户第一时间捕捉流量风口。可直接应用于选题规划、竞品投放策略分析。",
+    "inputSchema": {
+        "type": "object",
+        "properties": {
+            "prompt": {
+                "type": "string",
+                "description": "提示词prompt,包含完整的输入信息,图片、音频等多媒体需要url表示"
+            }
+        },
+        "required": [
+            "prompt"
+        ]
+    }
+}
+
+工具名:新红热搜词搜索
+工具调用ID:new_red_hot_search_words_search
+工具调用参数信息:
+{
+    "name": "新红热搜词搜索",
+    "description": "提供小红书热搜词深度检索与趋势分析服务,输入关键词即可获取全维度数据表现:核心包含热度值(实时动态更新)、声量概览(笔记数、总热度、热门天数、热门内容领域、高频搭配词)、近 90 天热度值趋势曲线(支持自定义时间区间)、相关搜索结果。可直观呈现关键词种草趋势、流量峰值时段、高转化内容特征,帮助用户优化笔记标题关键词布局、预判话题生命周期。",
+    "inputSchema": {
+        "type": "object",
+        "properties": {
+            "prompt": {
+                "type": "string",
+                "description": "提示词prompt,包含完整的输入信息,图片、音频等多媒体需要url表示"
+            }
+        },
+        "required": [
+            "prompt"
+        ]
+    }
+}

+ 10 - 7
knowledge_v2/prompt/function_generate_query_prompt.md

@@ -1,13 +1,16 @@
-你是一个智能助手。你的任务是根据用户的问题、帖子信息和账号人设信息,生成一个用于搜索或调用工具的查询语句(Query)。
+你是一个问题转换助手。你的任务是将用户的问题,转换一个用于搜索或调用工具的查询语句(Query)。
 
 用户问题:
 {question}
 
-帖子信息:
-{post_info}
+转换规则:
+- 提取问题中的 主体对象
+- 将问题转换成 用什么工具获取 [主体对象] query格式
 
-账号人设信息:
-{persona_info}
+示例:
+用户问题: “教资查分”这个选题点怎么来的
+主体对象: “教资查分”选题点
+转换的Query: 用什么工具获取“教资查分”选题点
 
-请分析上述信息,提炼出核心需求,生成一个简洁明了的查询语句。
-只输出查询语句,不要包含任何解释。
+请分析上述信息,按要求生成Query语句。
+只输出Query语句,不要包含任何解释。

+ 1 - 1
knowledge_v2/prompt/function_knowledge_extract_tool_params_prompt.md

@@ -4,7 +4,7 @@
 {query}
 
 工具信息:
-{tool_info}
+{all_tool_params}
 
 请分析工具的参数要求,根据查询内容提取或推断出合适的参数值。
 

+ 9 - 3
knowledge_v2/prompt/function_knowledge_select_tools_prompt.md

@@ -4,11 +4,17 @@
 {query}
 
 可用工具列表:
-{tool_infos}
+{all_tool_infos}
 
 
 请判断是否有工具可以解决用户的查询。
-- 如果有,请返回该工具的名称
+- 如果有,请返回该工具名及工具调用ID
 - 如果没有合适的工具,请返回 "None"。
 
-只输出工具名称或 "None",不要包含任何解释。
+输出JSON格式,不要包含任何解释。
+'''json
+{
+    "工具名": "",
+    "工具调用ID": ""
+}
+'''