Skip to content
汉松札记
Go back

ChatGPT之GPTs的使用与分析:5分钟构建一个天气画报

技术笔记

在GPTs推出之后,我用它花了5分钟就配置了一个生成天气画报的GPTs,目前看GPTs在提升AI应用研发效率上面还是做的非常好的,但并没有超出期望,它只是一种研发范式的创新,并没有带来质的变化:以前Langchain+GPT4做不到的事情,现在也做不到。

在这个功能出来之后,有人就说这个功能干死了一大批创业公司,因为很多创业公司都是在ChatGPT的接口上面套壳。而现在OpenAI亲自下场,直接把锅端走了,开发者不需要通过套壳平台来做聊天机器人,直接在官方的平台上面开发就行,没有中间商赚差价。于是就有了马斯克(模仿者)对奥特曼的灵魂拷问:

这个功能出来之后,有些人就说不会编程的普通人也能够开发AI应用了,以后就不需要程序员了。这个的东西真的有这么厉害吗?

GPT Builder能帮我们做什么

奥特曼在发布会上面演示了一个用GPT Builder通过聊天的方式就创建了一个创业咨询GPT,看起来很厉害,但其实自动化的能力还不够。我目前的试用下来,它主要还是一个辅助生成prompt的工具,有些高级功能比如知识库配置和api的配置还是需要自己手动实现,并且在这个过程中也不是很智能。

接下来我扮演一个不会编程的普通人,让GPT Builder通过纯聊天方式来生成一个天气画报GPT,它的主要能力就是调用天气接口查询指定城市的天气,然后再用DALL·E生成天气画报。功能虽然简单,但是已经涉及到了应用开发中最常见的调用接口的基本能力,通过这个例子我们就能看到GPT Builder在实际开发GPTs时的能力边界。

首先我让GPT Builder创建一个GPT,调用高德的天气api查询天气。我给它提供了api key和接口文档,作为一个没有编程能力的普通人,这个已经是我能做到的极限了。

创建一个GPT:根据用户输入的城市查询当天的天气,然后根据查询得到的天气信息画一个天气简报,要求有根据天气情况选择对应的背景,然后列出温度/湿度,以及一句每日鸡汤。

amap api中的key 是 d8bbbaeaeae49e71ca4d89597a3f26cc
amap的api文档是:https://lbs.amap.com/api/webservice/guide/api/weatherinfo/

GPT Builder收到我的请求之后,就开始自动更新GPT机器人的配置了,看起来确实很自动化。

这里它帮我起了GPT机器人的名称叫:Weather Briefing Artist,还提供简介,以及prompt的示例。

我点开GPT的配置,就可以看到GPT Builder帮我创建的东西了,主要就是前面四个配置:名称、描述、指令、示例prompt。到目前为止,GPT Builder的表现还是可圈可点的。

接下来我们试试看GPT Builder帮我自动化生成的天气画报靠不靠谱,到底能不能用。

当我问它杭州天气的时候,它写了一段代码去调用天气的接口,只不过调用失败了,原因是它的代码执行环境不能联网。要了解大模型使用代码解释器的原理,可以参考《ChatGLM3 的代码解释器(Code Interpreter)实现原理》。不能联网的原因主要是考虑到安全和性能,比如如果代码解释器能够联网,有些用户可能会让ChatGPT下载病毒,有些用户可能会ChatGPT下载130B的大模型把硬盘干爆了。只要禁止联网就没那么多麻烦了。

让看来作为一个普通人想要用GPT Builder开发一个天气画报暂时还是做不到的。它目前的能力主要是帮助我们优化给GPT的自定义指令。

程序员如何开发GPTs

手动定义FunctionCall(actions)

那么有其他方式来让GPT能够调用天气接口吗?答案是有的,我注意到GPT的配置中有一个叫Actions,这个就是能够让GPT调用我们自定义的外部接口。action的原理本质就是大模型的工具调用。action的实现原理可以参考《ChatGLM3 的工具调用(FunctionCalling)实现原理》,虽然之前文章里面说的是ChatGLM3的实现,但ChatGPT的实现原理也是类似的。

首先看一下action的配置项

第一部分是Schema,也就是接口的定义。OpenAI提供了一个天气api的示例,如下:

{
  "openapi": "3.1.0",
  "info": {
    "title": "Get weather data",
    "description": "Retrieves current weather data for a location.",
    "version": "v1.0.0"
  },
  "servers": [
    {
      "url": "https://api.example-weather-app.com"
    }
  ],
  "paths": {
    "/location": {
      "get": {
        "description": "Get temperature for a specific location",
        "operationId": "GetCurrentWeather",
        "parameters": [
          {
            "name": "location",
            "in": "query",
            "description": "The city and state to retrieve the weather for",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "deprecated": false
      }
    }
  },
  "components": {
    "schemas": {}
  }
}

可以看到,跟函数调用的定义的json差不多,因为本质上面就是一种函数调用,通过这个描述让GPT知道有一个天气的api可以使用。值得注意的是这个天气接口只是一个例子,并不能直接拿来用。

第二部分是Authentication,这是OpenAI提供的两种api权限控制方式:API key和OAuth。因为大部分API都是使用这两种方式认证调用权限的。

第三部分是Privacy Policy(隐私政策),其实就是让开发者通过这个隐私政策向用户说明数据的使用情况。如果你的GPT不对外使用就不需要填。

配置高德天气api给GPT使用

参考官方提供的天气api schema的例子,手动填一下就可以了。但是这个JSON说实话有点长,自己填太费时间了,于是我让GPT Builder帮我写了一下。我提供的prompt如下:

根据https://lbs.amap.com/api/webservice/guide/api/weatherinfo/ 的天气api,帮我写一个gpt能理解的api schema,参考
{
  "openapi": "3.1.0",
  "info": {
    "title": "Get weather data",
    "description": "Retrieves current weather data for a location.",
    "version": "v1.0.0"
  },
  "servers": [
    {
      "url": "https://api.example-weather-app.com"
    }
  ],
  "paths": {
    "/location": {
      "get": {
        "description": "Get temperature for a specific location",
        "operationId": "GetCurrentWeather",
        "parameters": [
          {
            "name": "location",
            "in": "query",
            "description": "The city and state to retrieve the weather for",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "deprecated": false
      }
    }
  },
  "components": {
    "schemas": {}
  }
}

然后GPT Builder真的访问了这个文档,然后参考官方的api例子,就帮我写了一个高德api的schema,如下:

{
  "openapi": "3.0.0",
  "info": {
    "title": "Amap Weather API",
    "description": "Provides current and forecasted weather conditions based on 高德地图's weather service.",
    "version": "1.0"
  },
  "servers": [
    {
      "url": "https://restapi.amap.com"
    }
  ],
  "paths": {
    "/v3/weather/weatherInfo": {
      "get": {
        "description": "Retrieve current or forecasted weather information",
        "operationId": "getWeatherInfo",
        "parameters": [
          {
            "name": "city",
            "in": "query",
            "description": "The city code or name to retrieve weather information for",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "extensions",
            "in": "query",
            "description": "Type of weather information: 'base' for real-time or 'all' for forecast",
            "required": false,
            "schema": {
              "type": "string",
              "enum": ["base", "all"]
            }
          },
          {
            "name": "output",
            "in": "query",
            "description": "Response format: JSON or XML",
            "required": false,
            "schema": {
              "type": "string",
              "enum": ["JSON", "XML"]
            }
          },
          {
            "name": "key",
            "in": "query",
            "description": "User's unique API key",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response with weather data",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WeatherResponse"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "WeatherResponse": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "description": "Request status code"
          },
          "info": {
            "type": "string",
            "description": "Description of the status code"
          },
          "infocode": {
            "type": "string",
            "description": "Info code of the response"
          },
          "lives": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LiveWeather"
            }
          },
          "forecasts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ForecastWeather"
            }
          }
        }
      },
      "LiveWeather": {
        "type": "object",
        "properties": {
          "city": {
            "type": "string",
            "description": "City name"
          },
        }
      },
      "ForecastWeather": {
        "type": "object",
        "properties": {
          "city": {
            "type": "string",
            "description": "City name"
          },
        }
      }
    }
  }
}

这个高德的api schema定义确实挺长的,如果要我自己写肯定要花很久时间,GPT Builder虽然不能够自己根据api文档直接创建action,但是通过我的引导,也能基本完成任务,只是需要我自己手动把schema贴到action里面。

高德api的配置效果如下图所示:

配置完action之后,接下来就要配置Instructions。由于高德的api key是直接在调用的参数里面透传过去的,不能用官方提供的Authentication方式。所以我在prompt中直接告诉GPT高德的api key是什么,这样它就会自己填到参数里面。我的prompt如下:

根据用户输入的城市查询当天的天气,然后根据查询得到的天气信息画一个天气简报,要求有根据天气情况选择对应的背景,然后列出温度/湿度,以及一句每日鸡汤。
amap api中的 key 是 d8bbbaeaeae49e71ca4d89597a3f26cc

完整的GPT配置如下:

接下来就是激动人心的时刻,到底我手动配置的GPT能不能工作呢?我直接输入了:上海。

可以看到,GPT首先调用了高德天气api,它确实理解了高德的api调用入参,还把我告诉它的key填到参数里面了。然后生成的画报还挺好看的,包含了上海的很多地标建造,比如东方明珠,这个就是GPT根据天气的数据,然后结合DALL·E的画图能力自动画出来的。

总结

根据我上面的试用结果来看,GPTs暂时还不会让程序员失业。GPTs的产品能力其实包含了两个方面的能力:

一个是支持用户定义的集成了知识库、画图、代码解释器、自定义工具四种能力的聊天机器人GPTs,这个其实是目前很多创业公司在做的事情,从这个角度看,它其实是Langchain的官方产品化版本,极大的降低了开发者的集成门槛。

另一个是GPT Builder,官方希望它能够通过聊天的方式帮用户快速创建GPTs,这个目的为了降低普通用户的使用门槛。这个对开发者用处不大,因为它只能写指令的部分,自定义工具的能力它目前还无法自动化的完成。

GPTs的发布是OpenAI降低AI应用开发成本,试图定义AI时代的APP规范的一种尝试。之前的插件尝试可以说基本上失败了,这一次的尝试能否成功还需要时间的检验。从目前GPTs的能力来看,OpenAI确实把目前为止成熟的大模型能力都集成进来了,而且具备实际落地的可行性。就拿我上面做的天气画报功能来说,我5分钟就能做一个这样的应用,这在以前是不可想象的,写代码的时间都不止5分钟呢。

但我们也要意识到,稍微复杂的能力比如代码解释器和自定义工具这两种能力的使用是有编程门槛的,OpenAI给我们提供的是做菜的食材。对于普通人来说,如果你只是想做一个家常的蛋炒饭,那很简单。但是要做出佛跳墙,那还是需要大厨的功夫的。

对于开发者来说,GPTs降低的是集成大模型能力的门槛。以前你要用工具调用的能力,还需要自己调试Langchain,以后就不需要了。以前知识库检索要自己搞向量数据库,现在也不需要了。省下来的时间可以用于思考idea,从这个角度说GPTs提升的是创建AI应用的效率。

总而言之,GPTs的主要创新在于将之前社区摸索出来的使用大模型的最佳实践比如知识库、工具调用等能力定义出了一套研发框架,就有点安卓和IOS的应用研发框架。它主要包含了四种能力:知识库、画图、代码解释器、自定义工具,至于这些能力最后能做出什么样的应用,那就要看开发者的想象力了。

注:文中使用的api key已经废弃,想要复现的可以自己去高德官网申请一个。


订阅 技术笔记

RSS 邮件订阅待配置
Share this post on:

Previous Post
机器学习基础之梯度计算:Pytorch代码与公式
Next Post
统计学与机器学习交汇点:线性回归的数学基础