jiaqiang преди 2 дни
родител
ревизия
e927c67f1d
променени са 1 файла, в които са добавени 152 реда и са изтрити 149 реда
  1. 152 149
      llmops/agents/outline_agent.py

+ 152 - 149
llmops/agents/outline_agent.py

@@ -181,84 +181,84 @@ class OutlineGeneratorAgent:
 
         # 构建基础提示词
         base_prompt = f"""[角色定义]
-你的角色是: 流水分析报告的大纲生成模块。
-你的目标是:{question},生成一份针对{industry}行业的全面的流水分析报告大纲。
-生成结构清晰、可被程序解析的JSON格式大纲,明确每个章节及其下属分析主题所需的分析指标。
-
-[职责边界]
-你只能完成以下事项:
-1.确定{industry}流水分析报告应包含的章节结构
-2.明确每个章节下需要覆盖的分析主题
-3.为每个分析主题列出所需的计算指标、统计指标或分析指标
-
-你不得做以下任何事情:
-1.不得计算任何指标
-2.不得对流水数据进行分析
-3.不得判断交易是否异常或存在风险
-4.不得生成任何分析结论、判断性描述或报告正文
-5.不得决定分析执行顺序或分析方法
-
-你输出的内容仅是"分析需求清单",而不是"分析结果"。
-
-[可用指标总览]
-系统当前支持 {len(available_metrics)} 个指标。
-指标内容为{available_metrics}
-
-[重要要求]
-请根据用户需求和可用指标列表,从上述指标中选择最相关的指标。必须基于用户查询的具体需求进行智能匹配,确保选择的指标能够充分满足分析需求。
-
-[强制要求]
-生成大纲时,请:
-1. 仔细分析用户查询,识别所有提到的分析需求点
-2. 从可用指标中选择能够满足这些需求的完整指标组合
-3. 基于语义相关性进行指标筛选,不要过于保守
-4. 在各章节的metrics对象中,按照指标类型(calculation_metrics/statistical_metrics/analysis_metrics)列出选定的指标
-5. 为每个指标提供metric_name和metric_description字段
-6. 优先选择与用户查询直接相关的指标
-
-[可选择的指标列表]
-{metrics_list_text}
-
-[重要说明]
-请确保:
-- 从提供的可用指标列表中选择最相关的指标
-- 为每个选定的指标提供清晰的名称和描述
-- 输出格式必须严格遵循上述JSON结构
-- 确保选择的指标能够满足用户查询的具体分析需求
-
-[输出格式要求]
-你必须且只能以 JSON 字符串 形式输出分析大纲,不得输出任何解释性自然语言。
-JSON 必须严格遵循以下结构约定:
-{{
-  "chapter_title": "string",
-  "sections": [
-    {{
-      "section_id": "string",
-      "section_title": "string",
-      "section_description": "string",
-      "metrics": {{
-        "calculation_metrics": [
-          {{
-            "metric_name": "string",
-            "metric_description": "string"
-          }}
-        ],
-        "statistical_metrics": [
-          {{
-            "metric_name": "string",
-            "metric_description": "string"
-          }}
-        ],
-        "analysis_metrics": [
-          {{
-            "metric_name": "string",
-            "metric_description": "string"
-          }}
-        ]
-      }}
-    }}
-  ]
-}}"""
+            你的角色是: 流水分析报告的大纲生成模块。
+            你的目标是:{question},生成一份针对{industry}行业的全面的流水分析报告大纲。
+            生成结构清晰、可被程序解析的JSON格式大纲,明确每个章节及其下属分析主题所需的分析指标。
+            
+            [职责边界]
+            你只能完成以下事项:
+            1.确定{industry}流水分析报告应包含的章节结构
+            2.明确每个章节下需要覆盖的分析主题
+            3.为每个分析主题列出所需的计算指标、统计指标或分析指标
+            
+            你不得做以下任何事情:
+            1.不得计算任何指标
+            2.不得对流水数据进行分析
+            3.不得判断交易是否异常或存在风险
+            4.不得生成任何分析结论、判断性描述或报告正文
+            5.不得决定分析执行顺序或分析方法
+            
+            你输出的内容仅是"分析需求清单",而不是"分析结果"。
+
+            [可用指标总览]
+            系统当前支持 {len(available_metrics)} 个指标。
+            指标内容为{available_metrics}
+            
+            [重要要求]
+            请根据用户需求和可用指标列表,从上述指标中选择最相关的指标。必须基于用户查询的具体需求进行智能匹配,确保选择的指标能够充分满足分析需求。
+
+            [强制要求]
+            生成大纲时,请:
+            1. 仔细分析用户查询,识别所有提到的分析需求点
+            2. 从可用指标中选择能够满足这些需求的完整指标组合
+            3. 基于语义相关性进行指标筛选,不要过于保守
+            4. 在各章节的metrics对象中,按照指标类型(calculation_metrics/statistical_metrics/analysis_metrics)列出选定的指标
+            5. 为每个指标提供metric_name和metric_description字段
+            6. 优先选择与用户查询直接相关的指标
+            
+            [可选择的指标列表]
+            {metrics_list_text}
+
+            [重要说明]
+            请确保:
+            - 从提供的可用指标列表中选择最相关的指标
+            - 为每个选定的指标提供清晰的名称和描述
+            - 输出格式必须严格遵循上述JSON结构
+            - 确保选择的指标能够满足用户查询的具体分析需求
+            
+            [输出格式要求]
+            你必须且只能以 JSON 字符串 形式输出分析大纲,不得输出任何解释性自然语言。
+            JSON 必须严格遵循以下结构约定:
+            {{
+              "chapter_title": "string",
+              "sections": [
+                {{
+                  "section_id": "string",
+                  "section_title": "string",
+                  "section_description": "string",
+                  "metrics": {{
+                    "calculation_metrics": [
+                      {{
+                        "metric_name": "string",
+                        "metric_description": "string"
+                      }}
+                    ],
+                    "statistical_metrics": [
+                      {{
+                        "metric_name": "string",
+                        "metric_description": "string"
+                      }}
+                    ],
+                    "analysis_metrics": [
+                      {{
+                        "metric_name": "string",
+                        "metric_description": "string"
+                      }}
+                    ]
+                  }}
+                }}
+              ]
+            }}"""
 
         return base_prompt
 
@@ -278,10 +278,10 @@ JSON 必须严格遵循以下结构约定:
         # 在prompt末尾添加业务背景信息
         full_prompt = f"""{prompt}
 
-【业务背景信息】
-行业:{industry}
-产品类型:经营贷
-客群类型:小微企业"""
+            【业务背景信息】
+            行业:{industry}
+            产品类型:经营贷
+            客群类型:小微企业"""
 
         messages = [
             ("system", "你是一名专业的报告大纲生成专家,必须输出完整、有效的JSON格式,包含所有必需字段。"),
@@ -537,32 +537,33 @@ JSON 必须严格遵循以下结构约定:
 
         try:
             missing_prompt = ChatPromptTemplate.from_messages([
-                ("system", """你是一个专业的指标推荐专家,需要根据用户查询的关键词,识别出可能缺失的关键指标。
-
-请分析:
-1. 用户关心的分析维度(收入、支出、排名、趋势等)
-2. 已选择的指标
-3. 可用的指标库
-
-推荐一些重要的缺失指标,帮助完善分析报告。
-
-返回格式:
-只返回指标名称列表,用换行符分隔,不要其他解释。
-
-示例:
-总收入分析
-支出占比统计
-交易对手排名"""),
-                ("human", """查询关键词:{keywords}
-
-已选择的指标:
-{selected_metrics}
-
-可用指标库:
-{available_metrics}
-
-请推荐一些重要的缺失指标。""")
-            ])
+                ("system", """
+                    你是一个专业的指标推荐专家,需要根据用户查询的关键词,识别出可能缺失的关键指标。
+
+                    请分析:
+                    1. 用户关心的分析维度(收入、支出、排名、趋势等)
+                    2. 已选择的指标
+                    3. 可用的指标库
+                    
+                    推荐一些重要的缺失指标,帮助完善分析报告。
+                    
+                    返回格式:
+                    只返回指标名称列表,用换行符分隔,不要其他解释。
+                    
+                    示例:
+                    总收入分析
+                    支出占比统计
+                    交易对手排名"""),
+                                    ("human", """查询关键词:{keywords}
+                    
+                    已选择的指标:
+                    {selected_metrics}
+                    
+                    可用指标库:
+                    {available_metrics}
+                    
+                    请推荐一些重要的缺失指标。""")
+                                ])
 
             # 格式化输入
             selected_list = '\n'.join(selected_metric_names) if selected_metric_names else '无'
@@ -606,30 +607,31 @@ JSON 必须严格遵循以下结构约定:
             available_metric_ids = {m.metric_id for m in outline.global_metrics}
 
             assign_prompt = ChatPromptTemplate.from_messages([
-                ("system", """你是一个专业的报告结构专家,需要将全局指标智能分配到各个章节。
-
-分配原则:
-1. 每个章节分配3-5个最相关的指标
-2. 指标应与章节内容高度相关
-3. 避免重复分配相同的指标
-4. 优先分配核心指标到主要章节
-
-返回格式:
-为每个章节返回指标ID列表,用分号分隔章节,格式如下:
-章节ID:指标ID1,指标ID2,指标ID3
-
-示例:
-sec_1:metric-total_income,metric-expense_trend,metric-profit_margin
-sec_2:metric-customer_analysis,metric-market_share"""),
-                ("human", """报告标题:{report_title}
-
-章节列表:
-{sections}
-
-可用指标:
-{available_metrics}
-
-请为每个章节分配最合适的指标ID。""")
+                ("system", """
+                    你是一个专业的报告结构专家,需要将全局指标智能分配到各个章节。
+
+                    分配原则:
+                    1. 每个章节分配3-5个最相关的指标
+                    2. 指标应与章节内容高度相关
+                    3. 避免重复分配相同的指标
+                    4. 优先分配核心指标到主要章节
+                    
+                    返回格式:
+                    为每个章节返回指标ID列表,用分号分隔章节,格式如下:
+                    章节ID:指标ID1,指标ID2,指标ID3
+                    
+                    示例:
+                    sec_1:metric-total_income,metric-expense_trend,metric-profit_margin
+                    sec_2:metric-customer_analysis,metric-market_share"""),
+                                    ("human", """报告标题:{report_title}
+                    
+                    章节列表:
+                    {sections}
+
+                    可用指标:
+                    {available_metrics}
+                    
+                    请为每个章节分配最合适的指标ID。""")
             ])
 
             # 格式化输入
@@ -829,23 +831,24 @@ sec_2:metric-customer_analysis,metric-market_share"""),
 
         # 使用大模型进行语义匹配
         match_prompt = ChatPromptTemplate.from_messages([
-            ("system", """你是一个专业的指标匹配专家,需要根据指标名称和描述,从提供的知识库中找到最合适的匹配项。
-
-请分析指标的语义含义和计算逻辑,判断哪个知识项最匹配。
-
-返回格式:
-如果找到匹配:返回知识ID
-如果未找到匹配:返回空字符串 ""
-
-只返回知识ID或空字符串,不要其他解释。"""),
-            ("human", """指标信息:
-名称:{metric_name}
-描述:{metric_description}
-
-可用知识库:
-{knowledge_list}
-
-请判断这个指标是否与知识库中的某个项目匹配。如果匹配,返回对应的知识ID;如果不匹配,返回空字符串。""")
+            ("system", """
+                你是一个专业的指标匹配专家,需要根据指标名称和描述,从提供的知识库中找到最合适的匹配项。
+
+                请分析指标的语义含义和计算逻辑,判断哪个知识项最匹配。
+                
+                返回格式:
+                如果找到匹配:返回知识ID
+                如果未找到匹配:返回空字符串 ""
+                
+                只返回知识ID或空字符串,不要其他解释。"""),
+                            ("human", """指标信息:
+                名称:{metric_name}
+                描述:{metric_description}
+                
+                可用知识库:
+                {knowledge_list}
+
+                请判断这个指标是否与知识库中的某个项目匹配。如果匹配,返回对应的知识ID;如果不匹配,返回空字符串。""")
         ])
 
         # 构建知识库描述