tool_divisions.py 5.78 KB
Newer Older
1 2 3 4 5 6 7

divisions = [
    {
    "province": "青海省",
    "cities": [
        {
        "name": "西宁市",
文靖昊 committed
8
        "counties": ["主城区", "大通县", "湟中区", "湟源县"]
9 10 11
        },
        {
        "name": "海东市",
12
        "counties": ["乐都区", "平安区", "民和回族土族自治县", "互助土族自治县", "化隆县", "循化撒拉族自治县"]
13 14 15 16 17 18 19 20 21 22
        },
        {
        "name": "海北藏族自治州",
        "counties": ["门源回族自治县", "祁连县", "海晏县", "刚察县"]
        },
        {
        "name": "黄南藏族自治州",
        "counties": ["同仁市", "尖扎县", "泽库县", "河南蒙古族自治县"]
        },
        {
文靖昊 committed
23
        "name": "海南州",
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
        "counties": ["共和县", "同德县", "贵德县", "兴海县", "贵南县"]
        },
        {
        "name": "果洛藏族自治州",
        "counties": ["玛沁县", "班玛县", "甘德县", "达日县", "久治县", "玛多县"]
        },
        {
        "name": "玉树藏族自治州",
        "counties": ["玉树市", "杂多县", "称多县", "治多县", "囊谦县", "曲麻莱县"]
        },
        {
        "name": "海西蒙古族藏族自治州",
        "counties": ["格尔木市", "德令哈市", "茫崖市", "乌兰县", "都兰县", "天峻县"]
        }
      ]
    },
    {
    "province": "甘肃省",
    "cities": [
        {
        "name": "兰州市",
        "counties": ["城关区", "七里河区", "西固区", "安宁区", "红古区", "永登县", "皋兰县", "榆中县"]
        },
        {
        "name": "嘉峪关市",
        "counties": ["嘉峪关市"]
        },
        {
        "name": "金昌市",
        "counties": ["金川区", "永昌县"]
        },
        {
        "name": "白银市",
        "counties": ["白银区", "平川区", "靖远县", "会宁县", "景泰县"]
        },
        {
        "name": "天水市",
        "counties": ["秦州区", "麦积区", "清水县", "秦安县", "甘谷县", "武山县", "张家川回族自治县"]
        },
        {
        "name": "武威市",
        "counties": ["凉州区", "民勤县", "古浪县", "天祝藏族自治县"]
        },
        {
        "name": "张掖市",
        "counties": ["甘州区", "肃南裕固族自治县", "民乐县", "临泽县", "高台县", "山丹县"]
        },
        {
        "name": "平凉市",
        "counties": ["崆峒区", "泾川县", "灵台县", "崇信县", "华亭市", "庄浪县", "静宁县"]
        },
        {
        "name": "酒泉市",
        "counties": ["肃州区", "金塔县", "瓜州县", "肃北蒙古族自治县", "阿克塞哈萨克族自治县", "玉门市", "敦煌市"]
        },
        {
        "name": "庆阳市",
        "counties": ["西峰区", "庆城县", "环县", "华池县", "合水县", "正宁县", "宁县", "镇原县"]
        },
        {
        "name": "定西市",
        "counties": ["安定区", "通渭县", "陇西县", "渭源县", "临洮县", "漳县", "岷县"]
        },
        {
        "name": "陇南市",
        "counties": ["武都区", "成县", "文县", "宕昌县", "康县", "西和县", "礼县", "徽县", "两当县"]
        },
        {
        "name": "临夏回族自治州",
        "counties": ["临夏市", "临夏县", "康乐县", "永靖县", "广河县", "和政县", "东乡族自治县", "积石山保安族东乡族撒拉族自治县"]
        },
        {
        "name": "甘南藏族自治州",
        "counties": ["合作市", "临潭县", "卓尼县", "舟曲县", "迭部县", "玛曲县", "碌曲县", "夏河县"]
        }
      ]
    }
]


from typing import Type
from pydantic import BaseModel, Field
from langchain_core.tools import BaseTool

# 根据输入补全行政区划信息
def complete_administrative_division(input_text, data):
    for province in data:
        if input_text in province['province']:
            return {'province': province['province'], 'cities': [city['name'] for city in province['cities']]}
        for city in province['cities']:
            if input_text in city['name']:
                return {
116 117 118
                    '省': province['province'],
                    '市': city['name'],
                    '县(区)': city['counties']
119 120 121 122
                }
            for county in city['counties']:
                if input_text in county:
                    return {
123 124 125
                        '省': province['province'],
                        '市': city['name'],
                        '县(区)': county
126 127 128 129 130 131 132 133 134
                    }
    return None


class AdministrativeDivisionArgs(BaseModel):
    input_text: str = Field(..., description="输入的行政区划信息,可以是省、市、县(区)三级中的最低一级的行政区划名称,例如用户输入'广东省广州市',则此参数只需要取'广州市',用户输入'武汉市洪山区',则次参数为'洪山区'")

class AdministrativeDivision(BaseTool):
    name = "administrative_division"
135
    description = "根据用户提问中涉及到的地区信息补全其行政区划信息,明确具体的省、市、县信息。比如输入县,补全所属省市,输入市则补全省级以及下辖所有县区,当问题中涉及区县的时候,一定要优先调用此工具"
136 137 138 139
    args_schema: Type[BaseModel] = AdministrativeDivisionArgs

    def _run(self, input_text: str) -> str:
        result = complete_administrative_division(input_text, divisions)
140 141 142 143 144 145 146 147 148 149 150 151 152 153
        return result
    

class CountryInfoArgs(BaseModel):
    country: str = Field(...,description="县(区)这个级别的行政区划名称")

# fake tool for testing
class CountryInfo(BaseTool):
    name = "country_info"
    description = "查询特定县(区)相关的地质情况"
    args_schema: Type[BaseModel] = CountryInfoArgs

    def _run(self, country: str) -> str:
        return f"{country} 的地质情况是:xxxxxx"