Pārlūkot izejas kodu

智能选址,新模型适配

liutao 1 mēnesi atpakaļ
vecāks
revīzija
8c8008939f

+ 3 - 2
aiAgent_gd/agent_config.py

@@ -4,11 +4,12 @@ from qwen_agent.sub_agent.ChartAgent import ChartAgent
 from qwen_agent.sub_agent.sql.land_site_selection_sql_agent import LandSiteSelectionSqlAgent
 from qwen_agent.sub_agent.sql.land_supply_sql_agent import LandSupplySqlAgent
 from qwen_agent.sub_agent.sql.land_use_sql_agent import LandUseSqlAgent
-
+from qwen_agent.sub_agent.sql.land_find_sql_agent import LandFindSqlAgent
 from qwen_agent.sub_agent.gis.gis_layer_operation import GisLayerOperationAgent
 ActionDict = {
     "generate_chart": ChartAgent,
     "summary": SummaryAgent,
+    "LandFindSqlAgent": LandFindSqlAgent,
     "LandSiteSelectionSqlAgent": LandSiteSelectionSqlAgent,
     "LandSupplySqlAgent": LandSupplySqlAgent,
     "LandUseSqlAgent": LandUseSqlAgent,
@@ -18,7 +19,7 @@ ActionDict = {
 
 AgentCNNameDict = {
     "generate_chart": "图表生成",
-    "GisGeometryAgent": "Gis 基础操作",
+    "GisGeocoderAgent": "Gis 地理编码",
     "summary": "总结摘要",
     "plan_dispatcher": "任务分发",
     "Chat": "聊天机器人",

+ 7 - 3
aiAgent_gd/qwen_agent/llm/llm_client.py

@@ -3,7 +3,7 @@ import asyncio
 from openai import OpenAI, AsyncOpenAI
 import copy
 # from qwen_agent.llm.base import LLMBase
-
+import re
 
 class LLMClient:
     def __init__(self, model='qwen-plus', api_key='none', model_server=''):
@@ -22,6 +22,7 @@ class LLMClient:
             return self._chat_no_stream(query, model, messages, stop=stop, functions=functions)
 
     def _chat_stream(self, query, model, messages=None, stop=None, functions=None, **kvargs):
+        pattern = r'<think>.*?</think>'
         print(f'begin: stream to lianqi client, model name: {model}')
         if messages:
             response = self._client.chat.completions.create(
@@ -38,7 +39,8 @@ class LLMClient:
         for chunk in response:
             if hasattr(chunk.choices[0].delta, 'content') and chunk.choices[0].delta.content:
                 print(chunk.choices[0].delta.content, end='', flush=True)
-                yield chunk.choices[0].delta.content
+                result = re.sub(pattern, '', chunk.choices[0].delta.content, flags=re.DOTALL)
+                yield result
 
     def _chat_no_stream(self, query, model=None, messages=None, stop=None, functions=None, **kvargs):
         print(f'begin: no stream to lianqi client, model name: {model}')
@@ -119,7 +121,9 @@ class LLMAsyncClient:
         async for chunk in response:
             if hasattr(chunk.choices[0].delta, 'content') and chunk.choices[0].delta.content:
                 print(chunk.choices[0].delta.content, end='', flush=True)
-                yield chunk.choices[0].delta.content
+                pattern = r'<think>.*?</think>\n*'
+                result = re.sub(pattern, '', chunk.choices[0].delta.content, flags=re.DOTALL)
+                yield result
 
     async def _chat_no_stream(self, query, model=None, messages=None, stop=None, functions=None, **kvargs):
         print(f'begin: no stream to lianqi client, model name: {model}')

+ 3 - 1
aiAgent_gd/qwen_agent/planning/planner.py

@@ -6,7 +6,7 @@ from typing import List
 import asyncio
 from httpx import RemoteProtocolError
 from typing import Union
-
+import re
 from qwen_agent.messages.context_message import PlanResponseContextManager, ChatResponseStreamChoice, ChatResponseChoice
 from qwen_agent.messages.plan_message import PlanInfo
 from qwen_agent.llm.llm_client import LLMClient, LLMAsyncClient
@@ -69,6 +69,8 @@ class Planner:
                             yield ChatResponseStreamChoice(role='assistant', delta=chunk)
                             plan_rsp += chunk
                     yield ChatResponseStreamChoice(role='assistant', finish_reason='stop')
+                    pattern = r'<think>.*?</think>\n*'
+                    plan_rsp = re.sub(pattern, '', plan_rsp, flags=re.DOTALL)
                     print('plan_rsp:', plan_rsp)
                 else:
                     yield ChatResponseChoice(role='assistant', content=rsp)

+ 0 - 2
aiAgent_gd/qwen_agent/planning/plans/land_find_plan.py

@@ -4,7 +4,6 @@ from qwen_agent.planning.planner import Planner
 from qwen_agent.memory.plan_memory import PlanExampleRetrieval
 
 actions_list = {
-    "GisGeocoderAgent": "用于获取用户问题中详细地址的坐标点",
     "LandFindSqlAgent": "用于查询永久基本农田表的Agent",
     "summary": "对表查询的结果,进行总结摘要,提炼用户关注的信息",
 }
@@ -25,7 +24,6 @@ Plan: 生成的计划,包含函数名和执行的目标。以JSON格式返回
 举例:
 {example_list}
 
-注意0:如果用户需要生成图表,那么最后一步请调用[generate_chart]这个action,针对用户Question和查询数据库结果生成options;
 注意1:最后一步必须调用[summary]这个action,针对用户Question和查询数据库结果进行总结摘要,提取用户关注信息;
 注意2:如果出现SUM函数,必须使用:: FLOAT将返回结果转换为float类型
 """

+ 2 - 10
aiAgent_gd/qwen_agent/sub_agent/gis/gis_layer_operation.py

@@ -1,17 +1,9 @@
 import asyncio
 import copy
-import json
 import re
-from urllib import parse
-
-import requests
-from shapely import Polygon, wkt
 
 from qwen_agent.messages.context_message import ChatResponseChoice, ChatResponseStreamChoice
 from qwen_agent.sub_agent.BaseSubAgent import BaseSubAgent
-from qwen_agent.tools.gis.geocoder.geocoder_tdt import GeocoderTDT
-from qwen_agent.utils.gis_util import get_area
-from qwen_agent.utils.util import extract_json
 
 
 class GisLayerOperationAgent(BaseSubAgent):
@@ -51,7 +43,6 @@ class GisLayerOperationAgent(BaseSubAgent):
           ]
         }}
         </示例>
-        请严格按上述要求生成JSON响应,不要包含任何额外内容:
         """
 
     async def run(self, plan_context, messages=[]):
@@ -77,7 +68,8 @@ class GisLayerOperationAgent(BaseSubAgent):
         else:
             res = rsp
             yield ChatResponseChoice(role='assistant', content=rsp)
-
+        pattern = r'<think>.*?</think>\n*'
+        res = re.sub(pattern, '', res, flags=re.DOTALL)
         self.exec_res = f"\n```json\n{res}\n```\n"
 
 

+ 6 - 7
aiAgent_gd/qwen_agent/sub_agent/sql/land_find_sql_agent.py

@@ -42,17 +42,16 @@ class LandFindSqlAgent(BaseSubAgent):
         )'
 
         有几个注意事项:
-        注意1: 查询地区条件时,区县为**时请使用 xzqmc 字段。省为**时请先将行政区名称转换为行政区代码,使用xzqdm字段的前2位进行模糊查询,市为**时请先将行政区名称转换为行政区代码,使用xzqdm字段的前4位进行模糊查询
+        注意1: 查询城市是**区或者**县时请使用 xzqmc 字段。
         注意2: 使用 order by 进行排序时。必须使用 nulls last 确保 null值不会对排序产生影响,使用方法如下: order by xxxx desc nulls last 或者 order by xxxx nulls last
         注意3: 当用户问题中的面积等于不是一个确定值的时候,如‘面积为xx亩左右’或‘面积为xx平方米左右’或‘面积为xx公顷左右’, 需要条件中添加 abs(yjjbnttbmj - xx) <= 1, 将面积差控制在1公顷之内。使用 ‘order by abs(yjjbnttbmj - xx)  nulls last’ 来进行排序
         注意4: 当用户问题中的面积是一个确定值的时候,如‘面积为xx亩’或‘面积为xx平方米’或‘面积为xx公顷左右’, 需要条件中添加 abs(yjjbnttbmj - xx) <= 1, 将面积差控制在1公顷之内。使用 ‘order by abs(yjjbnttbmj - xx)  nulls last’ 来进行排序
         注意5: 查询出地块。必须要对ydmj进行desc排序。查询地块有数量限制时,比如'1宗','一宗','1块',使用limit 1语句;未限定时,只查询10宗,使用limit 10语句
-        注意6: 问题中设计具体的地点时,需要使用round(st_distance(st_geometryfromtext('具体地点的wkt', 4490)::geography,shape::geography)::numeric,0)获取其distance, 如果问题未指定范围则使用 distance <= 5000 来限制在地点5公里内,并对其排序
-        注意7: 生成sql时,只对涉及表结构中的字段进行条件设置,不可生成不在表字段列表中的查询条件,不可生成任何不在表字段中的条件,比如周边5公里有什么设施
-        注意8: 查询语句select只包含objectid这个字段
-        注意9: 只准生成查询 的sql 语句,不可生成任何 修改数据的语句, 比如:update, delete, insert, truncate 等
-        注意10: gcs330000g2001_yjjbnt_gx_xsb数据表的schema是dlgis
-        注意11: 永久基本农田的表名是dlgis.gcs330000g2001_yjjbnt_gx_xsb
+        注意6: 生成sql时,只对涉及表结构中的字段进行条件设置,不可生成不在表字段列表中的查询条件,不可生成任何不在表字段中的条件,比如周边5公里有什么设施
+        注意7: 查询语句select只包含objectid这个字段
+        注意8: 只准生成查询 的sql 语句,不可生成任何 修改数据的语句, 比如:update, delete, insert, truncate 等
+        注意9: gcs330000g2001_yjjbnt_gx_xsb数据表的schema是dlgis
+        注意10: 永久基本农田的表名是dlgis.gcs330000g2001_yjjbnt_gx_xsb
         """
         self.retriever = SqlRetriever(query_type='land_find')
 

+ 2 - 14
aiAgent_gd/qwen_agent/sub_agent/summary_agent.py

@@ -13,7 +13,7 @@ SYSTEM_PROMPT = """
 注意:
 1. 如果用户查询的Question通过数据库查询,没有返回结果,请直接回答“数据库中没有查询到相关的数据”,不允许胡编乱造。如果在数据库中查询到相关的结果,请根据结果回答用户问题。
 2. 请不要对show_case的查询到的记录做过与详细的描述;
-3. 如果用户查询的Question没有设计到数据库查询,请直接回答没有相关数据。
+3. 如果用户查询的Question没有涉及到数据库查询,比如GIS图层操作,请直接回答没有相关数据。
 """
 
 agents_prompt = dict({
@@ -30,15 +30,11 @@ agents_prompt = dict({
             交通运输用地:包含以下几种土地利用现状小类 铁路用地,轨道交通用地,公路用地,农村道路,机场用地,港口码头用地和管道运输用地
             水域及水利设施用地:包含以下几种土地利用现状小类 河流水面,湖泊水面,水库水面,坑塘水面,沟渠,水工建筑用地和冰川及常年积雪
         """,
-    'LandApprovalSqlAgent':     """
-        返回的数据结果面积单位是公顷
-        注意问题中的近几年指的是当前年份往前推几年,例如,近5年,指的是当前年份往前推5年,即,2020年,2021年,2022年,2023年 和当前年份 2024年
-        """,
     'SpatialAnalysisAgent': """
         1. 总结时不要输出图形的wkt信息或者其他坐标点信息
     """,
     'GisLayerOperationAgent':"""
-        总结操作的是哪个图层
+       不对结果进行总结,请直接回答没有相关数据
     """,
     'LandSiteSelectionSqlAgent': """
     
@@ -54,14 +50,6 @@ agents_prompt = dict({
         3.不要输出除上面结构之外的信息
         
         """,
-    'GisSurroundingFacilitiesQueryAgent': """
-            1. 问题中涉及交通便利性,需要结合返回数据中字段中key 为 "way"的值进行解答,不准胡编乱造,如果数据都不符合交通便利的要求,则提示用户该数据方圆5公里内无任何道路信息
-            2. 需要对用户提问中的数据进行提炼,对符合问题周边分析的数据进行总结,如:用户希望获取离港口近的地块,则对分析数据中哪个地块中的港口离距离近进行总结
-            3. 总结时必须要对筛选后的地块的周边信息进行介绍,对于不符合问题要求的周边信息的地块不进行介绍
-        """,
-'KfqEvalSqlAgent': """
-           
-        """
 })
 
 

+ 2 - 3
aiAgent_gd/run_server_async.py

@@ -26,8 +26,8 @@ from qwen_agent.planning.plan_continue_executor import PlanContinueExecutor
 from qwen_agent.llm.llm_client import LLMClient, LLMAsyncClient
 from agent_config import LLMDict_Qwen_72B_1211, LLMDict_GPT4_TURBO
 from agent_messages import BaseRequest
-from qwen_agent.tools.tools import async_xzdb,async_db
-from qwen_agent.tools.gis.spatial_analysis.geo_analysis import intersect_kfq, intersect_gyyd
+from qwen_agent.tools.tools import async_xzdb, async_db
+from qwen_agent.tools.gis.spatial_analysis.geo_analysis import intersect_kfq, intersect_gyyd, xzfx, sqsx, ghfx
 
 prompt_lan = "CN"
 llm_name = "qwen-plus"
@@ -212,7 +212,6 @@ async def gyydintersect(wkt: str):
     result = await intersect_gyyd(wkt)
     return result
 
-
 llm_client = LLMClient(model=llm_name, model_server=model_server)
 llm_client_async = LLMAsyncClient(model=llm_name, model_server=model_server)