q_a优化,提示词优化
This commit is contained in:
		| @@ -182,13 +182,24 @@ class OpenAICompatibleLLM(VannaBase): | |||||||
|                 stop=None, |                 stop=None, | ||||||
|                 temperature=self.temperature, |                 temperature=self.temperature, | ||||||
|             ) |             ) | ||||||
|  |             # data = { | ||||||
|  |             #     "model": self.model, | ||||||
|  |             #     "prompt": prompt, | ||||||
|  |             #     "max_tokens": self.max_tokens, | ||||||
|  |             #     "temperature": self.temperature, | ||||||
|  |             # } | ||||||
|  |             # response = requests.post( | ||||||
|  |             #     url=f"{self.api_base}/completions", | ||||||
|  |             #     headers=self.headers, | ||||||
|  |             #     json=data | ||||||
|  |             # ) | ||||||
|         else: |         else: | ||||||
|             if num_tokens > 3500: |             if num_tokens > 3500: | ||||||
|                 model = "kimi" |                 model = "kimi" | ||||||
|             else: |             else: | ||||||
|                 model = "doubao" |                 model = "doubao" | ||||||
|  |  | ||||||
|             print(f"Using model {model} for {num_tokens} tokens (approx)") |             print(f"5.Using model {model} for {num_tokens} tokens (approx)") | ||||||
|  |  | ||||||
|             response = self.client.chat.completions.create( |             response = self.client.chat.completions.create( | ||||||
|                 model=model, |                 model=model, | ||||||
| @@ -231,6 +242,7 @@ class OpenAICompatibleLLM(VannaBase): | |||||||
|             logger.info(f"sys_temp:{sys_temp}") |             logger.info(f"sys_temp:{sys_temp}") | ||||||
|             llm_response = self.submit_prompt( |             llm_response = self.submit_prompt( | ||||||
|                 [{'role': 'system', 'content': sys_temp}, {'role': 'user', 'content': user_temp}], **kwargs) |                 [{'role': 'system', 'content': sys_temp}, {'role': 'user', 'content': user_temp}], **kwargs) | ||||||
|  |             llm_response = str(llm_response.strip()) | ||||||
|             logger.info(f"llm_response:{llm_response}") |             logger.info(f"llm_response:{llm_response}") | ||||||
|             result = {"resp": orjson.loads(extract_nested_json(llm_response))} |             result = {"resp": orjson.loads(extract_nested_json(llm_response))} | ||||||
|             logger.info(f"llm_response:{llm_response}") |             logger.info(f"llm_response:{llm_response}") | ||||||
|   | |||||||
| @@ -52,10 +52,12 @@ template: | |||||||
|           <rule-detail>若数据库引擎是 PostgreSQL, Oracle, ClickHouse, 达梦数据库, AWS Redshift, Elasticsearch,则schema、表名、字段名、别名使用双引号,如 "schema_name"."table_name"。</rule-detail> |           <rule-detail>若数据库引擎是 PostgreSQL, Oracle, ClickHouse, 达梦数据库, AWS Redshift, Elasticsearch,则schema、表名、字段名、别名使用双引号,如 "schema_name"."table_name"。</rule-detail> | ||||||
|           <rule-detail>若数据库引擎是 MySQL, Doris,则表名、字段名、别名使用反引号,如 `table_name`。</rule-detail> |           <rule-detail>若数据库引擎是 MySQL, Doris,则表名、字段名、别名使用反引号,如 `table_name`。</rule-detail> | ||||||
|           <rule-detail>生成的SQL必须避免与数据库关键字冲突。</rule-detail> |           <rule-detail>生成的SQL必须避免与数据库关键字冲突。</rule-detail> | ||||||
|  |           <rule-detail>注意列名定义和使用的先后顺序,例如:SELECT阶段定义了列名,如果GROUP BY阶段先与SELECT阶段执行时,是不许在GROUP BY阶段引用列名的。</rule-detail> | ||||||
|         </rule> |         </rule> | ||||||
|         <rule> |         <rule> | ||||||
|           <rule-title>数据查询与排序</rule-title> |           <rule-title>数据查询与排序</rule-title> | ||||||
|           <rule-detail>若未明确指定查询字段,涉及人员信息时,默认返回相关性最强的前10个字段。</rule-detail> |           <rule-detail>若未明确指定查询字段,涉及人员信息时,默认返回相关性最强的前10个字段。</rule-detail> | ||||||
|  |           <rule-detail>当涉及部门表org_orgs的查询时注意enable启用状态和dr删除标志,且必须限制code字段值包含'CYJ'。</rule-detail> | ||||||
|           <rule-detail>若查询字段为 VARCHAR 或 TEXT 类型但需要计算,必须先进行合理的类型转换(如 CAST(... AS NUMERIC))。</rule-detail> |           <rule-detail>若查询字段为 VARCHAR 或 TEXT 类型但需要计算,必须先进行合理的类型转换(如 CAST(... AS NUMERIC))。</rule-detail> | ||||||
|           <rule-detail>若查询包含日期/时间字段: |           <rule-detail>若查询包含日期/时间字段: | ||||||
|             - **默认行为**:若提问未指定排序,**默认按时间字段降序排序**(即最新数据在前)。 |             - **默认行为**:若提问未指定排序,**默认按时间字段降序排序**(即最新数据在前)。 | ||||||
| @@ -271,22 +273,32 @@ template: | |||||||
|         <chat-examples> |         <chat-examples> | ||||||
|           <example> |           <example> | ||||||
|             <input> |             <input> | ||||||
|               <sql>SELECT `u`.`email` AS `email`, `u`.`id` AS `id`, `u`.`account` AS `account`, `u`.`enable` AS `enable`, `u`.`create_time` AS `create_time`, `u`.`language` AS `language`, `u`.`default_oid` AS `default_oid`, `u`.`name` AS `name`, `u`.`phone` AS `phone`, FROM `per_user` `u` LIMIT 1000</sql> |               <sql>SELECT `u`.`email` AS `邮箱`, `u`.`id` AS `ID`, `u`.`account` AS `账号`, `u`.`enable` AS `启用状态`, `u`.`create_time` AS `创建时间`, `u`.`language` AS `语言`, `u`.`default_oid` AS `所属组织id`, `u`.`name` AS `姓名`, `u`.`phone` AS `电话`, FROM `per_user` `u` LIMIT 1000</sql> | ||||||
|               <user-question>查询所有用户信息</user-question> |               <user-question>查询所有用户信息</user-question> | ||||||
|               <chart-type></chart-type> |               <chart-type></chart-type> | ||||||
|             </input> |             </input> | ||||||
|             <output> |             <output> | ||||||
|               {{"type":"table","title":"所有用户信息","columns":[{{"name":"邮箱","value":"email"}},{{"name":"ID","value":"id"}},{{"name":"账号","value":"account"}},{{"name":"启用状态","value":"enable"}},{{"name":"创建时间","value":"create_time"}},{{"name":"语言","value":"language"}},{{"name":"所属组织ID","value":"default_oid"}},{{"name":"姓名","value":"name"}},{{"name":"Phone","value":"phone"}}]}} |               {{"type":"table","title":"所有用户信息","columns":[{{"name":"邮箱","value":"email"}},{{"name":"ID","value":"id"}},{{"name":"账号","value":"account"}},{{"name":"启用状态","value":"enable"}},{{"name":"创建时间","value":"create_time"}},{{"name":"语言","value":"language"}},{{"name":"所属组织id","value":"default_oid"}},{{"name":"姓名","value":"name"}},{{"name":"电话","value":"phone"}}]}} | ||||||
|             </output> |             </output> | ||||||
|           </example> |           </example> | ||||||
|           <example> |           <example> | ||||||
|             <input> |             <input> | ||||||
|               <sql>SELECT `o`.`name` AS `org_name`, COUNT(`u`.`id`) AS `user_count` FROM `per_user` `u` JOIN `per_org` `o` ON `u`.`default_oid` = `o`.`id` GROUP BY `o`.`name` ORDER BY `user_count` DESC LIMIT 1000</sql> |               <sql>SELECT `o`.`name` AS `org_name`, COUNT(`u`.`id`) AS `人数` FROM `per_user` `u` JOIN `per_org` `o` ON `u`.`default_oid` = `o`.`id` GROUP BY `o`.`name` ORDER BY `user_count` DESC LIMIT 1000</sql> | ||||||
|               <user-question>饼图展示各个组织的人员数量</user-question> |               <user-question>饼图展示各个组织的人员数量</user-question> | ||||||
|               <chart-type> pie </chart-type> |               <chart-type> pie </chart-type> | ||||||
|             </input> |             </input> | ||||||
|             <output> |             <output> | ||||||
|               {{"type":"pie","title":"组织人数统计","axis":{{"y":{{"name":"人数","value":"user_count"}},"series":{{"name":"组织名称","value":"org_name"}}}}}} |               {{"type":"pie","title":"组织人数统计","axis":{{"y":{{"name":"人数","value":"人数"}},"series":{{"name":"org_name","value":"org_name"}}}}}} | ||||||
|  |             </output> | ||||||
|  |           </example> | ||||||
|  |           <example> | ||||||
|  |             <input> | ||||||
|  |               <sql>SELECT COUNT(*) AS "总人数", SUM(CASE WHEN p."gender" = '1' THEN 1 ELSE 0 END) AS "男员工数", SUM(CASE WHEN p."gender" = '2' THEN 1 ELSE 0 END) AS "女员工数" FROM "YJOA_APPSERVICE_DB"."t_pr3rl2oj_yj_person_database" p WHERE p."dr" = 0 ORDER BY "总人数" DESC LIMIT 1000;</sql> | ||||||
|  |               <user-question>表格展示不同性别人员数量,及人员总数</user-question> | ||||||
|  |               <chart-type> bar </chart-type> | ||||||
|  |             </input> | ||||||
|  |             <output> | ||||||
|  |               {{'type': 'table', 'title': '员工性别统计', 'columns': [{{"name":"总人数","value":"total_persons"}},{{"name":"男员工数","value":"male_count"}},{{"name":"女员工数","value":"female_count"}}]}} | ||||||
|             </output> |             </output> | ||||||
|           </example> |           </example> | ||||||
|         </chat-examples> |         </chat-examples> | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ question_and_answer = [ | |||||||
|                FROM YJOA_APPSERVICE_DB.t_pr3rl2oj_yj_person_database p |                FROM YJOA_APPSERVICE_DB.t_pr3rl2oj_yj_person_database p | ||||||
|                WHERE p.internal_dept IN (SELECT "id" |                WHERE p.internal_dept IN (SELECT "id" | ||||||
|                                          FROM "IUAP_APDOC_BASEDOC"."org_orgs" START |                                          FROM "IUAP_APDOC_BASEDOC"."org_orgs" START | ||||||
|                WITH "name" LIKE '%综合处%' |                WITH "name"||"shortname" LIKE '%综合处%' | ||||||
|                CONNECT BY PRIOR "id" = "parentid" |                CONNECT BY PRIOR "id" = "parentid" | ||||||
|                    ) |                    ) | ||||||
|                       AND p.dr = 0 |                       AND p.dr = 0 | ||||||
| @@ -198,7 +198,7 @@ question_and_answer = [ | |||||||
|                   from YJOA_APPSERVICE_DB.t_pr3rl2oj_yj_person_database |                   from YJOA_APPSERVICE_DB.t_pr3rl2oj_yj_person_database | ||||||
|                   where internal_dept in (SELECT "id" |                   where internal_dept in (SELECT "id" | ||||||
|                                           FROM "IUAP_APDOC_BASEDOC"."org_orgs" START |                                           FROM "IUAP_APDOC_BASEDOC"."org_orgs" START | ||||||
|                   WITH "name" LIKE '%数信中心%' |                   WITH "name"||"shortname" LIKE '%数信中心%' AND "dr"=0 AND "enable"=1 AND "code" LIKE '%CYJ%' | ||||||
|                   CONNECT BY PRIOR "id" = "parentid" |                   CONNECT BY PRIOR "id" = "parentid" | ||||||
|                       ) |                       ) | ||||||
|  |  | ||||||
| @@ -224,7 +224,7 @@ question_and_answer = [ | |||||||
|                     JOIN IUAP_APDOC_BASEDOC.org_orgs o ON p.internal_dept = o.id |                     JOIN IUAP_APDOC_BASEDOC.org_orgs o ON p.internal_dept = o.id | ||||||
|                     WHERE p.internal_dept IN ( |                     WHERE p.internal_dept IN ( | ||||||
|                         SELECT "id" FROM "IUAP_APDOC_BASEDOC"."org_orgs"  |                         SELECT "id" FROM "IUAP_APDOC_BASEDOC"."org_orgs"  | ||||||
|                         START WITH "name" LIKE '%数信中心%' |                         START WITH "name"||"shortname" LIKE '%数信中心%' AND "dr"=0 AND "enable"=1 AND "code" LIKE '%CYJ%' | ||||||
|                         CONNECT BY PRIOR "id" = "parentid" |                         CONNECT BY PRIOR "id" = "parentid" | ||||||
|                     ) |                     ) | ||||||
|                     AND p.dr = 0 |                     AND p.dr = 0 | ||||||
| @@ -262,7 +262,7 @@ question_and_answer = [ | |||||||
|                     AND ps."date_value" LIKE '2025-10%' |                     AND ps."date_value" LIKE '2025-10%' | ||||||
|                     and p.internal_dept in (SELECT "id" |                     and p.internal_dept in (SELECT "id" | ||||||
|                                           FROM "IUAP_APDOC_BASEDOC"."org_orgs" START |                                           FROM "IUAP_APDOC_BASEDOC"."org_orgs" START | ||||||
|                   WITH "name" LIKE '%数信中心%' |                   WITH "name" || "shortname" LIKE '%数信中心%' AND "dr"=0 AND "enable"=1 AND "code" LIKE '%CYJ%' | ||||||
|                   CONNECT BY PRIOR "id" = "parentid" |                   CONNECT BY PRIOR "id" = "parentid" | ||||||
|                       ) |                       ) | ||||||
|                     AND p."dr" = 0 |                     AND p."dr" = 0 | ||||||
| @@ -279,7 +279,7 @@ question_and_answer = [ | |||||||
|                   ''' |                   ''' | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|         "question": "员工年龄段分布图", |         "question": "数信中心员工年龄段分布图", | ||||||
|         "answer": ''' |         "answer": ''' | ||||||
|                     SELECT  |                     SELECT  | ||||||
|                         CASE  |                         CASE  | ||||||
| @@ -301,7 +301,10 @@ question_and_answer = [ | |||||||
|                             WHERE "parentid" IN ( |                             WHERE "parentid" IN ( | ||||||
|                                 SELECT "id"  |                                 SELECT "id"  | ||||||
|                                 FROM "IUAP_APDOC_BASEDOC"."org_orgs"  |                                 FROM "IUAP_APDOC_BASEDOC"."org_orgs"  | ||||||
|                             ) |                                 WHERE name || shortname LIKE '%数信中心%' AND "dr"=0 AND "enable"=1 AND "code" LIKE '%CYJ%' | ||||||
|  |                             ) OR id IN (SELECT "id"  | ||||||
|  |                                 FROM "IUAP_APDOC_BASEDOC"."org_orgs"  | ||||||
|  |                                 WHERE name || shortname LIKE '%数信中心%' AND "dr"=0 AND "enable"=1 AND "code" LIKE '%CYJ%') | ||||||
|                         ) |                         ) | ||||||
|                     GROUP BY  |                     GROUP BY  | ||||||
|                         CASE  |                         CASE  | ||||||
| @@ -328,14 +331,15 @@ question_and_answer = [ | |||||||
|                   WHERE p."dr" = 0 |                   WHERE p."dr" = 0 | ||||||
|                     AND o."id" IN (SELECT "id" |                     AND o."id" IN (SELECT "id" | ||||||
|                                    FROM "IUAP_APDOC_BASEDOC"."org_orgs" START |                                    FROM "IUAP_APDOC_BASEDOC"."org_orgs" START | ||||||
|                   WITH "name" LIKE '%综合处%' |                   WITH "name"||"shortname" LIKE '%综合处%' AND "dr"=0 AND "enable"=1 AND "code" LIKE '%CYJ%' | ||||||
|                   CONNECT BY PRIOR "id" = "parentid") |                   CONNECT BY PRIOR "id" = "parentid") | ||||||
|                          AND p."birthday" IS NOT NULL |                          AND p."birthday" IS NOT NULL | ||||||
|                          AND p."birthday" != '' |                          AND p."birthday" != '' | ||||||
|                   ORDER BY o."name" ASC, p."birthday" DESC |                   ORDER BY o."name" ASC, p."birthday" DESC | ||||||
|                       LIMIT 1000; |                       LIMIT 1000; | ||||||
|                   ''' |                   ''' | ||||||
|     },{ |     }, | ||||||
|  |     { | ||||||
|         "question": "查询综合处下面的员工的平均年龄", |         "question": "查询综合处下面的员工的平均年龄", | ||||||
|         "answer": ''' |         "answer": ''' | ||||||
|                   SELECT ROUND(AVG(2025 - CAST(SUBSTR(p."birthday", 1, 4) AS INT)), 2) AS "平均年龄" |                   SELECT ROUND(AVG(2025 - CAST(SUBSTR(p."birthday", 1, 4) AS INT)), 2) AS "平均年龄" | ||||||
| @@ -344,12 +348,45 @@ question_and_answer = [ | |||||||
|                   WHERE p."dr" = 0 |                   WHERE p."dr" = 0 | ||||||
|                     AND o."id" IN (SELECT "id" |                     AND o."id" IN (SELECT "id" | ||||||
|                                    FROM "IUAP_APDOC_BASEDOC"."org_orgs" START |                                    FROM "IUAP_APDOC_BASEDOC"."org_orgs" START | ||||||
|                   WITH "name" LIKE '%综合处%' |                   WITH "name"||"shortname" LIKE '%综合处%' AND "dr"=0 AND "enable"=1 AND "code" LIKE '%CYJ%' | ||||||
|                   CONNECT BY PRIOR "id" = "parentid") |                   CONNECT BY PRIOR "id" = "parentid") | ||||||
|                          AND p."birthday" IS NOT NULL |                          AND p."birthday" IS NOT NULL | ||||||
|                          AND p."birthday" != '' |                          AND p."birthday" != '' | ||||||
|                       LIMIT 1000; |                       LIMIT 1000; | ||||||
|                   ''' |                   ''' | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "question": "综合处有几个人,男员工,女员工分别有多少", | ||||||
|  |         "answer": ''' | ||||||
|  |                     SELECT COUNT(*) AS "总人数",  | ||||||
|  |                     SUM(CASE WHEN p."gender" = '1' THEN 1 ELSE 0 END) AS "男员工数",  | ||||||
|  |                     SUM(CASE WHEN p."gender" = '2' THEN 1 ELSE 0 END) AS "女员工数" | ||||||
|  |                     FROM "YJOA_APPSERVICE_DB"."t_pr3rl2oj_yj_person_database" p | ||||||
|  |                     WHERE p."internal_dept" IN ( | ||||||
|  |                         SELECT "id" | ||||||
|  |                         FROM "IUAP_APDOC_BASEDOC"."org_orgs" | ||||||
|  |                         START WITH "name" LIKE '%综合处%' AND "dr"=0 AND "enable"=1 AND "code" LIKE '%CYJ%' | ||||||
|  |                         CONNECT BY PRIOR "id" = "parentid" | ||||||
|  |                     ) | ||||||
|  |                     AND p."dr" = 0 | ||||||
|  |                     LIMIT 1000; | ||||||
|  |                   ''' | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "question": "综合处女员工有多少", | ||||||
|  |         "answer": ''' | ||||||
|  |                     SELECT (SELECT COUNT(*)  | ||||||
|  |                     FROM "YJOA_APPSERVICE_DB"."t_pr3rl2oj_yj_person_database" p  | ||||||
|  |                     WHERE p."internal_dept" IN (SELECT "id" | ||||||
|  |                                FROM "IUAP_APDOC_BASEDOC"."org_orgs" | ||||||
|  |                                START WITH "name"||"shortname" LIKE '%综合处%' AND "dr"=0 AND "enable"=1 AND "code" LIKE '%CYJ%' | ||||||
|  |                                CONNECT BY PRIOR "id" = "parentid" | ||||||
|  |                               ) | ||||||
|  |                     AND p."gender" = '2' | ||||||
|  |                     AND p."dr" = 0 | ||||||
|  |                     ) AS "女员工数" | ||||||
|  |                       ''' | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |  | ||||||
| ] | ] | ||||||
|   | |||||||
| @@ -963,6 +963,35 @@ org_orgs_ddl = ''' | |||||||
|       "role": "dimension", |       "role": "dimension", | ||||||
|       "tags": ["部门名称","部门简称","部门缩写"] |       "tags": ["部门名称","部门简称","部门缩写"] | ||||||
|     }, |     }, | ||||||
|  |     { | ||||||
|  |       "name": "enable", | ||||||
|  |       "type": "INT", | ||||||
|  |       "comment": "启用状态", | ||||||
|  |       "value":{ | ||||||
|  |         "1":"启用" | ||||||
|  |         "2":"未启用" | ||||||
|  |       }, | ||||||
|  |       "role": "dimension", | ||||||
|  |       "tags": ["部门启用","部门状态","是否启用"] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "level", | ||||||
|  |       "type": "INT", | ||||||
|  |       "comment": "部门或单位层级", | ||||||
|  |       "role": "dimension", | ||||||
|  |       "tags": ["部门层级","级别"] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "dr", | ||||||
|  |       "type": "INT", | ||||||
|  |       "comment": "删除标志", | ||||||
|  |       "value": { | ||||||
|  |         "0": "正常", | ||||||
|  |         "1": "删除" | ||||||
|  |       }, | ||||||
|  |       "role": "dimension", | ||||||
|  |       "tags": ["状态标识", "软删除", "枚举"] | ||||||
|  |     } | ||||||
|   ], |   ], | ||||||
|   |   | ||||||
|   "tags": ["部门id","部门信息","部门名称"] |   "tags": ["部门id","部门信息","部门名称"] | ||||||
|   | |||||||
| @@ -1,7 +1,8 @@ | |||||||
|  | import logging | ||||||
| from typing import Optional | from typing import Optional | ||||||
|  |  | ||||||
| from orjson import orjson | from orjson import orjson | ||||||
|  | logger = logging.getLogger(__name__) | ||||||
| keywords = { | keywords = { | ||||||
|     # "gender":{"1":"男","2":"女"}, |     # "gender":{"1":"男","2":"女"}, | ||||||
|     "person_status":{"1":"草稿","2":"审批中","3":"制卡中","4":"已入库","5":"停用"}, |     "person_status":{"1":"草稿","2":"审批中","3":"制卡中","4":"已入库","5":"停用"}, | ||||||
| @@ -43,7 +44,8 @@ def extract_nested_json(text): | |||||||
|     stack = [] |     stack = [] | ||||||
|     start_index = -1 |     start_index = -1 | ||||||
|     results = [] |     results = [] | ||||||
|  |     if not text: | ||||||
|  |         logger.warning("extract_nested_json: text is empty") | ||||||
|     for i, char in enumerate(text): |     for i, char in enumerate(text): | ||||||
|         if char in '{[': |         if char in '{[': | ||||||
|             if not stack:  # 记录起始位置 |             if not stack:  # 记录起始位置 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 yujj128
					yujj128