中国室内设计联盟网站,wordpress 结构化数据插件,html编辑器怎么导入图片,重庆seo建站ChatGPT 结合实际地图实现问答式地图检索功能基于Function calling
ChatGPT结合实际业务#xff0c;主要是研发多函数调用#xff08;Function Calling#xff09;功能模块#xff0c;将自定义函数通过ChatGPT 问答结果#xff0c;实现对应函数执行#xff0c;再次将结果…ChatGPT 结合实际地图实现问答式地图检索功能基于Function calling
ChatGPT结合实际业务主要是研发多函数调用Function Calling功能模块将自定义函数通过ChatGPT 问答结果实现对应函数执行再次将结果输入ChatGPT大模型将结果规范化处理输出完成一次完整的prompt实现对话式应用场景实际功能实现。
Function calling是什么
Function calling是可以让我们用自己的函数当作调用chatgpt的参数在函数中我们可以做任何事情例如获取网络上的数据查询自己的数据库等。
为什么使用Function calling
比如当我们问chatgpt上海今天得天气怎么样他得回答是很抱歉作为一个语言模型我无法提供实时的天气信息…为什么这样呢因为chatgpt没有实时地网络数据而有了Function calling我们可以在函数中调用查询天气的接口返回给chatgptchatgpt按照我们的需求把数据转为自然语言。当然这只是一个最基础最简单的应用场景实际会有更多更复杂的应用场景。
Function Calling 的机制 Function Calling 机制的主要关键点
OpenAI 通过用户输入Pormpt 和打包参数、函数描述等进行问答结构化输出匹配判断函数功能该部分可用大模型自带的Auto但效果差也可自行实现函数判断是否调用如果匹配成功生成对函数调用的结构化参数调用自定义执行函数获得函数执行结果并将结果append 到起初Pormpt再次送入大模型大模型对结果进行整合结构化输出结果如果不匹配直接返回结果显示给用户 官方给出的具体流程使用用户查询和函数参数中定义的一组外部函数库。模型可以选择调用任意外部函数如果是这样内容将是符合自定义架构的字符串化 JSON 对象注意模型可能会生成无效的 JSON 或幻觉参数。在代码中将字符串解析为 JSON并使用提供的参数调用函数如果存在。通过将函数响应追加为新消息来再次调用模型并让模型将结果汇总返回给用户。
Function Calling 的特点
Function Calling 是一种让 Chat Completion 模型调用外部函数的能力可以让模型不仅仅根据自身的数据库知识进行回答而是可以额外挂载一个函数库然后根据用户提问去函数库检索按照实际需求调用外部函数并获取函数运行结果再基于函数运行结果进行回答。
支持 Function Calling 的非国产大模型
目前 OpenAI 仅支持 gpt-3.5-turbo-0613 和 gpt-4-0613 两个语言模型使用 Function Calling 功能。
支持 Function Calling 的国产大模型
百度文心大模型 MiniMax做虚拟人物效果不错。ChatGLM3-6B最著名的国产开源大模型生态最好。讯飞星火 3.0。
高德地图实际地图信息测试
本次测试是利用对话方式实现地图目标搜索功能具体任务如下图所示。 用户提问 帮我查找北京市三里屯附近的咖啡店 GPT解答 结构化输出北京市、三里屯、咖啡店 定义大模型结构化函数 自定义大模型识别的自定义函数实现函数功能 函数执行 将GPT解答结果传参传入自定义函数 结果回流 将函数返回结果与直接Pormpt进行append并一起传入大模型 GPT解答 规范化结果输出。
具体流程如下图所示 外部函数编写规范
在使用前需要我们先对外部函数进行定义和实现实现就不多说就是一个具体函数。而定义需要我们包含以下几部分内容 name 清晰的函数名称 description 函数功能的具体描述尽量对输入参数和输出信息有明确的说明 parameters 对函数的每个输入参数进行类型定义及其描述 required 指定哪些参数必填
具体结构函数如下所示
tools[{type: function,function: {name: get_location_coordinate,description: 根据POI名称获得POI的经纬度坐标,parameters: {type: object,properties: {location: {type: string,description: POI名称必须是中文,},city: {type: string,description: POI所在的城市名必须是中文,}},required: [location, city],}}}{type: function,function: {name: search_nearby_pois,description: 搜索给定坐标附近的poi,parameters: {type: object,properties: {longitude: {type: string,description: 中心点的经度,},latitude: {type: string,description: 中心点的纬度,},keyword: {type: string,description: 目标poi的关键字,}},required: [longitude, latitude, keyword],}}}
注意Function Calling 中的函数与参数的描述description也是一种 Prompt。这种 Prompt 也需要调优否则会影响函数的召回、参数的准确性甚至让 GPT 产生幻觉。
定义本地函数
• get_location_position 用于查询某个地点的地理坐标。 • search_nearby_list 用于查询地理坐标附近的某些信息取决于用户输入的Keyword
get_location_poinstion 代码块如下所示
def get_location_position (location, city):url fhttps://restapi.amap.com/v5/place/text?key{amap_key}keywords{location}region{city}print(url)r requests.get(url)result r.json()if pois in result and result[pois]:return result[pois][0]return None
search_nearby_list 代码块如下所示
def search_nearby_list (longitude, latitude, keyword):url fhttps://restapi.amap.com/v5/place/around?key{amap_key}keywords{keyword}location{longitude},{latitude}print(url)r requests.get(url)result r.json()ans if pois in result and result[pois]:for i in range(min(3, len(result[pois]))):name result[pois][i][name]address result[pois][i][address]distance result[pois][i][distance]ans f{name}\n{address}\n距离{distance}米\n\nreturn ans
此处利用的是高德地图的开放接口在使用本例之前需要先去高德地图开放接口的官网申请一个key 高德地图map-key https://console.amap.com/dev/user/permission
数据传输关键点
用户提问 “北京三里屯附近的咖啡馆” ChatGPT: {‘location’: ‘三里屯’, ‘city’: ‘北京’} get_location_coordinate作用是找到三里屯的精确位置函数输入和输出分别是 输入数据为{‘location’: ‘三里屯’, ‘city’: ‘北京’} 输出为 可以看到函数返回结果主要是和地区有关的地名、地址、区号、代号、坐标等信息 {‘parent’: ‘’, ‘address’: ‘朝阳区’, ‘distance’: ‘’, ‘pcode’: ‘110000’, ‘adcode’: ‘110105’, ‘pname’: ‘北京市’, ‘cityname’: ‘北京市’, ‘type’: ‘地名地址信息;热点地名;热点地名’, ‘typecode’: ‘190700’, ‘adname’: ‘朝阳区’, ‘citycode’: ‘010’, ‘name’: ‘三里屯’, ‘location’: ‘116.455294,39.937492’, ‘id’: ‘B0FFF5BER7’} 有用参数为经纬度坐标‘location’: ‘116.455294,39.937492’ search_nearby_pois作用是在指定坐标位置找出所需的目标函数输入和输出分别是 输入get_location_coordinate 的输出 原始Prompt然后一起接入大模型GPT回答后的输出{‘longitude’: ‘116.455294’, ‘latitude’: ‘39.937492’, ‘keyword’: ‘咖啡馆’} 即就是参数longitude, latitude, keyword 输出为 输出结果单条如下所示 {“parent”:“B000A80TPS”,“address”:“三里屯路33号3.3大厦1层1010号”,“distance”:“52”,“pcode”:“110000”,“adcode”:“110105”,“pname”:“北京市”,“cityname”:“北京市”,“type”:“餐饮服务;咖啡厅;星巴克咖啡”,“typecode”:“050501”,“adname”:“朝阳区”,“citycode”:“010”,“name”:“星巴克咖啡(北京三里屯三点三大厦店)”,“location”:“116.455034,39.937060”,“id”:“B0G35RYBJW”} 函数中利用distance可以输出最近的N个店或者输出小于阈值的店
根据需求定义输出标准本例为
“name”: 星巴克咖啡(北京三里屯三点三大厦店)“distance”: “52”“address”: “三里屯路33号3.3大厦1层1010号”
本例输出为最近的3个可自定义
星巴克咖啡(北京三里屯三点三大厦店) 地址三里屯路33号3.3大厦1层1010号距离52米内山咖啡店(3•3大厦店) 地址三里屯路33号3•3大厦B1层距离82米春丽咖啡(3•3大厦店) 地址三里屯路33号3.3大厦东门1层1099距离93米
将输出结果再次append到Prompt输入到大模型GPT 里GPT答复输出整理后格式如下所示。 最终ChatGPT答复:
ChatGPT: 根据您的要求我找到了以下咖啡馆
1. 星巴克咖啡(北京三里屯三点三大厦店)地址三里屯路33号3.3大厦1层1010号距离52米。
2. 内山咖啡店(3•3大厦店)地址三里屯路33号3•3大厦B1层距离82米。
3. 春丽咖啡(3•3大厦店)地址三里屯路33号3.3大厦东门1层1099距离93米。
以上是您附近的咖啡馆您可以前往您喜欢的地方享用咖啡。
Process finished with exit code 0
整体实现思路
1首先大模型识别到应该先调用get_location_coordinate函数获取经纬度 2get_location_coordinate执行结果给到大模型大模型识别到下一步应该调用search_nearby_pois 3search_nearby_pois执行结果给到大模型大模型识别到不需要调用其它函数用自然语言组织了最终答案。
总结
将函数说明组织成json形式告诉大模型。其中最重要的函数和参数描述是该函数的prompt大模型通过这个描述来确定用户的输入是否匹配该函数是否召回该函数。大模型如果召回了某个函数即在本地去解析函数名和参数去使用从而完成大模型与外部世界的连接。
主要参考链接
OpenAI官方Function Calling教程
https://platform.openai.com/docs/guides/function-calling
最后本地部署已经实现是基于ChatGLM3b 实现的。有需要本地部署代码的私信。