ChatGPT 结合实际地图实现问答式地图检索功能基于Function calling

ChatGPT 结合实际地图实现问答式地图检索功能基于Function calling

ChatGPT结合实际业务,主要是研发多函数调用(Function Calling)功能模块,将自定义函数通过ChatGPT 问答结果,实现对应函数执行,再次将结果输入ChatGPT,大模型将结果规范化处理输出,完成一次完整的prompt,实现对话式应用场景实际功能实现。

Function calling是什么?

Function calling是可以让我们用自己的函数当作调用chatgpt的参数,在函数中我们可以做任何事情,例如获取网络上的数据,查询自己的数据库等。

为什么使用Function calling?

比如当我们问chatgpt:上海今天得天气怎么样?他得回答是:很抱歉,作为一个语言模型,我无法提供实时的天气信息…为什么这样呢,因为chatgpt没有实时地网络数据,而有了Function calling我们可以在函数中调用查询天气的接口返回给chatgpt,chatgpt按照我们的需求把数据转为自然语言。当然这只是一个最基础最简单的应用场景,实际会有更多更复杂的应用场景。

Function Calling 的机制

在这里插入图片描述
Function Calling 机制的主要关键点:

  1. OpenAI 通过用户输入Pormpt 和打包参数、函数描述等进行问答结构化输出;
  2. 匹配判断函数功能,(该部分可用大模型自带的Auto,但效果差),也可自行实现函数判断是否调用;
  3. 如果匹配成功,生成对函数调用的结构化参数;
  4. 调用自定义执行函数,获得函数执行结果,并将结果append 到起初Pormpt,再次送入大模型;
  5. 大模型对结果进行整合,结构化输出结果;
  6. 如果不匹配直接返回结果显示给用户;
    官方给出的具体流程
  7. 使用用户查询和函数参数中定义的一组外部函数库。
  8. 模型可以选择调用任意外部函数;如果是这样,内容将是符合自定义架构的字符串化 JSON 对象(注意:模型可能会生成无效的 JSON 或幻觉参数)。
  9. 在代码中将字符串解析为 JSON,并使用提供的参数调用函数(如果存在)。
  10. 通过将函数响应追加为新消息来再次调用模型,并让模型将结果汇总返回给用户。

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 = f"https://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 = f"https://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\n"return 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个(可自定义):

  1. 星巴克咖啡(北京三里屯三点三大厦店)
    地址:三里屯路33号3.3大厦1层1010号,距离52米
  2. 内山咖啡店(3•3大厦店)
    地址:三里屯路33号3•3大厦B1层,距离82米
  3. 春丽咖啡(3•3大厦店)
    地址:三里屯路33号3.3大厦东门1层1099,距离93米

将输出结果再次append到Prompt,输入到大模型GPT 里,GPT答复输出整理后格式,如下所示。
最终ChatGPT答复:

ChatGPT: 根据您的要求,我找到了以下咖啡馆:
1. 星巴克咖啡(北京三里屯三点三大厦店),地址:三里屯路333.3大厦11010号,距离52米。
2. 内山咖啡店(33大厦店),地址:三里屯路3333大厦B1层,距离82米。
3. 春丽咖啡(33大厦店),地址:三里屯路333.3大厦东门11099,距离93米。
以上是您附近的咖啡馆,您可以前往您喜欢的地方享用咖啡。
Process finished with exit code 0

整体实现思路

(1)首先大模型识别到应该先调用get_location_coordinate函数获取经纬度;
(2)get_location_coordinate执行结果给到大模型,大模型识别到下一步应该调用search_nearby_pois;
(3)search_nearby_pois执行结果给到大模型,大模型识别到不需要调用其它函数,用自然语言组织了最终答案。

总结

  • 将函数说明组织成json形式告诉大模型。其中最重要的函数和参数描述,是该函数的prompt,大模型通过这个描述来确定用户的输入是否匹配该函数,是否召回该函数。
  • 大模型如果召回了某个函数,即在本地去解析函数名和参数去使用,从而完成大模型与外部世界的连接。

主要参考链接

OpenAI官方Function Calling教程:

https://platform.openai.com/docs/guides/function-calling

最后,本地部署已经实现,是基于ChatGLM3b 实现的。有需要本地部署代码的私信。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/274569.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s-生产级的k8s高可用(2) 25

部署containerd k8s2、k8s3、k8s4在配置前需要重置节点(reset)在上一章已完成 禁用所有节点docker和cri-docker服务 所有节点清除iptables规则 重置后全部节点重启 由于之前部署过docker,因此containerd默认已安装 修改配置 启动containe…

vue 总结

1.vue 的生命周期 1. es6 2. vue 基本属性指令 <template><div><!--<h1>vue基本指令的使用方式</h1><a :href"url">v-bind使用链接</a><img :src"srcUrl" /><div>解决闪烁问题<p v-cloak>{{…

安装zabbix

部署Zabbix监控平台 部署一台Zabbix监控服务器&#xff0c;一台被监控主机&#xff0c;为进一步执行具体的监控任务做准备&#xff1a; 安装LNMP环境源码安装Zabbix安装监控端主机&#xff0c;修改基本配置初始化Zabbix监控Web页面修改PHP配置文件&#xff0c;满足Zabbix需求…

Vue3全家桶 - Pinia - 【1】(安装与使用 + Store + State + Getters + Actions)

Pinia pinia 是 Vue 的专属状态管理库&#xff0c;它允许你跨组件或跨页面共享状态&#xff1b; 一、 安装与使用 pinia 安装语法&#xff1a;yarn add pinia npm install pinia创建一个 pinia &#xff08;根存储&#xff09;并将其传递给应用程序&#xff1a; 目标文件&am…

PaddlePaddle----基于paddlehub的OCR识别

Paddlehub介绍 PaddleHub是一个基于PaddlePaddle深度学习框架开发的预训练模型库和工具集&#xff0c;提供了丰富的功能和模型&#xff0c;包括但不限于以下几种&#xff1a; 1.文本相关功能&#xff1a;包括文本分类、情感分析、文本生成、文本相似度计算等预训练模型和工具。…

【力扣hot100】刷题笔记Day25

前言 这几天搞工作处理数据真是类似我也&#xff0c;还被老板打电话push压力有点大的&#xff0c;还好搞的差不多了&#xff0c;明天再汇报&#xff0c;赶紧偷闲再刷几道题&#xff08;可恶&#xff0c;被打破连更记录了&#xff09;这几天刷的是动态规划&#xff0c;由于很成…

共基法律考点大默写

法是由国家制定或认可的&#xff0c;&#xff0c;能够反应统治阶级意志&#xff0c;反映着被一定物质生活条件决定的统治阶级&#xff08;在社会主义社会是工人阶级为首的广大人民&#xff09;的意志。 指引作用。法律为人们提供既定的行为模式&#xff0c;指引人们在法律范围内…

Qt插件之输入法插件的构建和使用(一)

文章目录 输入法概述输入法插件实现及调用输入键盘搭建定义样式自定义按钮实现自定义可拖动标签数字符号键盘候选显示控件滑动控件手绘输入控件输入法概述 常见的输入法有三种形式: 1.系统级输入法 2.普通程序输入法 3.程序自带的输入法 系统级输入法就是咱们通常意义上的输入…

Vue3全家桶 - Vue3 - 【8】模板引用【ref】(访问模板引用 + v-for中的模板引用 + 组件上的ref)

模板引用【ref】 Vue3官网-模板引用&#xff1b;如果我们需要直接访问组件中的底层DOM元素&#xff0c;可使用vue提供特殊的ref属性来访问&#xff1b; 一、 访问模板引用 在视图元素上采用ref属性来设置需要访问的DOM元素&#xff1a; 该 ref 属性可采用 字符串 值的执行设…

蝙蝠避障:我生活中的一道光

盲人的世界&#xff0c;是无尽的黑暗。看不见光&#xff0c;看不见色彩&#xff0c;甚至看不见自己的手。但在这个黑暗的世界里&#xff0c;我找到了一个光明的出口&#xff1a;一款可以障碍物实时检测的名为蝙蝠避障的盲人软件。 这款软件就像是我的一双眼睛。它通过先进的激光…

第五十六回 徐宁教使钩镰枪 宋江大破连环马-飞桨图像分类套件PaddleClas初探

宋江等人学会了钩镰枪&#xff0c;大胜呼延灼。呼延灼损失了很多人马&#xff0c;不敢回京&#xff0c;一个人去青州找慕容知府。一天在路上住店&#xff0c;马被桃花山的人偷走了&#xff0c;于是到了青州&#xff0c;带领官兵去打莲花山。 莲花山的周通打不过呼延灼&#xf…

【日常记录】【工具】随机生成图片的网站 Lorem Picsum

文章目录 1、介绍2、获取固定宽高的图片3、处理图片缓存4、 Emmet 缩写语法 1、介绍 Lorem Picsum 是一个免费的图片占位符服务&#xff0c;可以用于网站、应用程序或任何需要占位符图片的地方。它提供了一个简单的 API&#xff0c;可以通过 HTTP 请求获取随机图片&#xff0c;…

安信可IDE(AiThinker_IDE)编译ESP8266工程方法

0 工具准备 AiThinker_IDE.exe ESP8266工程源码 1 安信可IDE&#xff08;AiThinker_IDE&#xff09;编译ESP8266工程方法 1.1 解压ESP8266工程文件夹 我们这里使用的是NON-OS_SDK&#xff0c;将NON-OS_SDK中的1_UART文件夹解压到工作目录即可 我这里解压到了桌面&#xff0c…

软考73-上午题-【面向对象技术2-UML】-UML中的图4

一、构件图&#xff08;组件图&#xff09; 1-1、构件图的定义 展现了&#xff0c;一组构件之间的组织和依赖。 构件图专注于系统的静态实现图。 构件图与类图相关&#xff0c;通常把构件映射为一个、多个类、接口、协作。 【回顾】&#xff1a; 类图展示了一组对象、接口、…

加速 Webpack 构建:提升效率的秘诀

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

详解DSLS达索许可管理器的安装与配置

DSLS的安装与配置 一、DSLS下载二、安装DLS三、使用DSLS四、更改计算机ID五、部分常见DSLS相关问题 一、DSLS下载 下载地址&#xff1a;https://software.3ds.com/?ticketST-5190987-dUM0dflc6zfjf04F5EXx-cas 注意&#xff1a;需要一个注册了的达索账号才能登录进去下载 一…

内网渗透-跨域环境渗透-1

目录 smbclient工具 mimikatz工具 Kerbers协议 NTLM认证 hash传递攻击&#xff08;PTH攻击&#xff09; 黄金票据攻击 白银票据 MS14-068 smbclient工具 在linux里面连接远程windows共享目录&#xff0c;可以使用这个工具 ​ 第一种连接方式&#xff1a;smbclient -L 目…

git - 笔记

为什么要学习Git 为什么要学习Git软件 为什么学习 因为在主流开发中&#xff0c;基于互联网软件开发的项目都会使用Git软件来进行项目开发过程中的资源管理 比如人力资源 代码资源 比如前端资源 .html .java等代码资源 文档资源 像项目开发中涉及到的需求文档等 这种项目中管理…

在文件夹下快速创建vue项目搭建vue框架详细步骤

一、首先在你的电脑目录下新建一个文件夹 进入该文件夹并打开控制台&#xff08;输入cmd指令&#xff09; 进入控制台后输入 vue create springboot_vue (自己指定名称) 如果出现这类报错如&#xff1a;npm install 的报错npm ERR! network request to http://registry.cnp…

Centos7安装postgresql14步骤

1、进入网址 https://www.postgresql.org/download/ 2、按步骤执行 # Install the repository RPM: sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm# Install PostgreSQL: sudo yum install -y…