AI工程化的“基座能力”?—— 聊聊GPT Function Calling

news2024/9/20 20:31:59

点击↑上方↑蓝色“编了个程”关注我~

5f8f8a7aaef9a13a08e4a52a7b25d450.png

这是Yasin的第 94 篇原创文章

89751760317b020894c33b55a67e1f46.png

3fe4b7881e37e32d98b1bf83db137d6f.png

最近AI大模型火出了圈,很多人惊叹它的智能程度。但大多数人都以为它的能力主要在“聊天”、“写文案”这方面。然而实际它能做的远远更多。

Chat GPT是当今世界上最智能的模型,它前段时间推出了“插件”的概念,其实就是AI工程化的一个基础能力。配合AI的能力,可以通过自然语言来搜索、购物、预定等等,AI从此不止局限于聊聊天。只是“插件”只能构建和运行在官网上,无法在更大范围的场景落地。

于是很多人加入了探索基于AI构建工程化的思路,笔者本人也是其中之一。最近GPT又开放了一个叫Function Calling的新能力,这篇文章主要介绍工程化的整体思路和Function Calling的一些调研、测试。

AI工程基于JSON的思路

在Function Calling出现之前,一般是使用Prompt来让Chat GPT返回JSON内容供下游工程消费。核心的思路如图:

06c22fd7562157dcc19c5fcc776c21eb.png

比如auto-gpt的prompt

You should only respond in JSON format as described below

RESPONSE FORMAT:
{
    "thoughts":
    {
        "text": "thought",
        "reasoning": "reasoning",
        "plan": "- short bulleted\
list that conveys\
long-term plan",
        "criticism": "constructive self-criticism",
        "speak": "thoughts summary to say to user"
    },
    "command": {
        "name": "command name",
        "args":{
            "arg name": "value"
        }
    }
}

Ensure the response can be parsed by Python json.loads

langchian的prompt:

response_schemas = [
    ResponseSchema(name="answer", description="answer to the user's question"),
    ResponseSchema(name="source", description="source used to answer the user's question, should be a website.")
]
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)

format_instructions = output_parser.get_format_instructions()
prompt = PromptTemplate(
    template="answer the users question as best as possible.\n{format_instructions}\n{question}",
    input_variables=["question"],
    partial_variables={"format_instructions": format_instructions}
)

def get_format_instructions(self) -> str:
    schema_str = "\n".join(
        [_get_sub_string(schema) for schema in self.response_schemas]
    )
    return STRUCTURED_FORMAT_INSTRUCTIONS.format(format=schema_str)
    
def _get_sub_string(schema: ResponseSchema) -> str:
    return line_template.format(
        name=schema.name, description=schema.description, type="string"
    )
    
STRUCTURED_FORMAT_INSTRUCTIONS = """The output should be a markdown code snippet formatted in the following schema:

```json
{{
{format}
}}
```"""

然而,Chat GPT返回的JSON内容并不稳定,「存在很多问题,需要工程化的思路去解决」

典型的几个case:

  1. 返回的json有json以外的内容,如中文解释 + json输出

  2. 返回的json有注释(偶现),不是合法的json

  3. 返回的json格式不对(偶现),比如两个json,但不是json数组

  4. 返回的json内容不对

  5. 意图识别失败,无法返回我们需要的json,返回的是自然语言

Function Calling介绍

基本介绍

最近OPENAI推出了Function Calling的功能,

  • 官方文档:https://platform.openai.com/docs/guides/gpt/function-calling

  • API文档:https://platform.openai.com/docs/api-reference/chat/create#chat/create-functions

简单来讲,最新的模型(gpt-3.5-turbo-0613和gpt-4-0613)经过了官方的fine-tune优化,「既能检测输入时何时应调用函数,又能以符合函数签名的方式响应JSON」

这里有两个要点:

  1. 自动检测何时响应,如果参数没有解析出来,是可以通过上下文对话补全信息来响应的。

  2. 以符合函数签名的方式来响应JSON。代表了返回的响应是一种固定的格式,一定是合法的JSON。

能力和API要点总结

经过阅读一些材料,总结一下FunctionCalling的能力和API调用的要点:

  1. 可以一次定义多个function

  2. params是json schema的形式。https://json-schema.apifox.cn/

  3. 可以配合system prompt

  4. 可以理解上下文连续对话

  5. function_call参数说明:当设置为“none”时,模型不会调用任何函数,而是直接响应给最终用户。当设置为“auto”时,模型可以自行选择是向最终用户响应还是调用一个函数。通过指定一个具体的函数(如{"name":"my_function"}),则强制模型调用该函数。当没有函数存在时,默认值为“none”。当存在函数时,默认值为“auto”。

Function Calling 测试

Case 1 基础测试:查询天气

入参:7347c420d421fcb94030777fb84372b6.png

出参:ff202f87b5c433f5c0d66e22e3498b58.png

Case 2 上下文

这里官方参考prompt:

->

Don't make assumptions about what values to plug into functions. Ask for clarification if a user request is ambiguous.

<-

推测必填参数:23f8551157545a1f258c5de82e6bd662.png

description设置默认值:defd59322e3ac645fdd0ab0a76b1ae67.png

prompt让gpt引导用户补充信息澄清:72e32031070497d0130d1f1c994c5ff1.png

上下文获取最终解析信息d1413d52a3e022cd466e3fd3f8df7c52.png

Case 3 嵌套参数对象

根据官方的说法,parameters只要符合json schema规范就行,那我们可以用嵌套的形式来定义一个对象参数。

函数定义:6b660589e7acca0d43326866177a841f.png

入参:ad526f950eb85384361c96e19d7fbcb8.png

出参:abe7f75b67cab88b1a62112c8fdf5637.png

看起来很ok!

Case 4 返回IDL

官方是给DB表schema,返回sql的例子。这里我测试一下返回IDL的case。

入参:0665010d412401074ad4c6b650b90ba6.png

输出:2ff25f9ed8945934261957d3300f61ac.png

解析一下,看起来也很ok:0fd7ed1ac200fba312487f645c380d4b.png

局限性

1 准确率还是依赖模型本身

参数推理还是依赖模型本身的能力,有时候会推理错误。比如下图,就把“今天”推测到了location参数里面。

ad5e8a9577b48a9845e28a60d4514c9e.png

2 Prompt并不是完全有效,有时候会推测默认值

期望是让用户上下文沟通补全。但有时候chat gpt还是会自作主张,推测默认值:e8501cf33dad733b432f2f2c385329bf.png

3 function_call为none的时候不生效

按照官方文档的说法,function_call设置为none的时候应该不调用function,但实际测试下来不是这样的。这块有知道原因的朋友可以留言交流一下。25ce1a94602c9fcf873261c74dd73fec.png

4 无法使用示例对话提升准确率

在之前我们使用Prompt + JSON输出的方式的时候,可以使用一些示例对话来增加AI输出的准确率,但现在改成了function calling的话,输出就不是assistent 的文本内容了,而是在单独的字段里面,所以few shot也就不那么好使了。

使用技巧

function_calling有其规定的出入参,如何和我们的代码更好地结合起来?

对于function定义,它是一个json schema定义,我们可以使用AI辅助我们来快速生成符合条件的json schema,类似这样:598ad319fbdb973d002dbd724b03b577.png

另一方面,我们还可以使用反射等方式,来自动根据代码生成json schema,类似这样:

->

这种方式不能自动转换出description这个带有语义的内容。所以其实还是更推荐上面那种方式,产出后自己根据需要修改,然后存库,调用的时候json反序列化填充到api接口里。

<-
bbc9e25f153674c67eb456a1503bc9a5.png

同样的道理,我们也可以把Chat GPT的出参,利用反射来执行对应的方法调用:443f4aa4a006e50e549b53cd0fe309a6.png

function calling调研结论

1 更方便

因为产出一定是一个合法的json,不用自己处理很多异常情况,不用裁剪不要的自然语言。

2 更稳定

大多数时候比Prompt更稳定,尤其是在需要多轮上下文对话的时候,Prompt在多轮上下文之后准确率会明显降低,除非手动在最新的调用补充JSON定义。但function_calling是放在函数调用里面的,每次都会传入,所以整体上会更稳定。

可以说在大多数情况下,使用function calling来实现工程化的能力是一个最优的选择。它也降低了AI工程化的门槛,可以预料到在未来不远的一段时间内,基于AI构建的工程应用将迎来一个爆发期。

广告时间

这里给自己搭建的一个AI对话网站AiChatRoom(地址https://bot.aichatroom.cn)打个广告,可以国内直接使用Chat GPT,无需梯子,无需注册Chat GPT账号。支持的模型很多,包括最新的3.5-0613和3.5-16k,还支持GPT 4、AI绘画等。直接打开网站注册就能免费试用,感兴趣的朋友可以点进去看看~

1670dc88a0c5a944d028de615edb98b8.png

98dae067974c9704af36bbbfe1d0503b.png

关于作者

我是Yasin,一个爱写博客的技术人

微信公众号:编了个程(blgcheng)

个人网站:https://yasinshaw.com

不用魔法和GPT账号的AI聊天机器人

bot.aichatroom.com

欢迎关注这个公众号4190a06189c43c4c96d1cc3b4179bcf7.png

ec9c045518c97c73f30b3fd29d4e21d8.png

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】—— 详解进程PCB和进程状态

前言&#xff1a; 在上篇我们已经对有关体系结构的基本知识进行了详细的介绍&#xff0c;接下来我们将进入网络编程的第一个大块—— 有关进程相关的知识&#xff01;&#xff01;&#xff01; 目录 前言 &#xff08;一&#xff09; 基本概念 1、描述进程-PCB 2、查看进程…

【人工智能】— 逻辑回归分类、对数几率、决策边界、似然估计、梯度下降

【人工智能】— 逻辑回归分类、对数几率、决策边界、似然估计、梯度下降 逻辑回归分类Logistic Regression ClassificationLogistic Regression: Log OddsLogistic Regression: Decision BoundaryLikelihood under the Logistic ModelTraining the Logistic ModelGradient Desc…

使用vue脚手架搭建前端工程(附:搭配ElementUI来快速开发)

目录 一、搭建过程 1. 全局安装webpack&#xff08;打包工具&#xff09; 2. 全局安装vue脚手架 3. 初始化vue项目 4. vue项目目录的简单介绍 二、执行流程分析 三、自己造一个组件案例 四、ElementUI的使用 1. 环境的引入 2. 一个简单使用 3. 使用它来快速搭建后台管…

AI绘画Stable diffusion保姆级教程,看这一篇就够了「安装-配置-画图」

随着chat gpt爆火之后&#xff0c;越来越多的人开始关注人工智能&#xff0c;人工智能相关的其他应用如AI绘画&#xff0c;也再次得到人们的关注。AI绘画的确很上头&#xff0c;最近几天小编也研究一下&#xff0c;这里把研究的过程以及中间遇到的问题整理一下&#xff0c;我这…

吴恩达471机器学习入门课程3第1周——异常检测

异常检测 1 导包2 - 异常检测2.1 问题陈述2.2 数据集可视化您的数据 2.3 高斯分布2.2.1 估计高斯分布的参数2.2.2 选择阈值 ϵ \epsilon ϵ2.4 高维数据集异常检测 实现异常情况检测算法&#xff0c;并应用它来检测网络上的故障服务器。 1 导包 import numpy as np import ma…

管理类联考——英语二——知识篇——写作题目说明——B节

MBA&#xff0c;MPA&#xff0c;MPAcc管理类联考英语写作部分由A&#xff0c;B两节组成&#xff0c;主要考查考生的书面表达能力。共2题&#xff0c;25分。A节要求考生根据所给情景写出约100词(标点符号不计算在内)的应用文&#xff0c;包括私人和公务信函、通知、备忘录等。共…

【ESP8266 (12F)】硬件参数 以及 固件烧录

本文资料及工具地址&#xff1a;https://github.com/CQUPTLei/ESP8266 一、基本关系1.1 ESP8266 芯片 和 ESP 12F 模组1.2 乐鑫科技和安信可 二、ESP 8266开发板2.1 ESP 12F 产品规格2.2 ESP8266 开发板 三、固件与固件下载3.1 什么是固件3.2 固件和用户程序3.2 如何下载固件3.…

Linux下配置lunavim

前言 在lunavim官网中提供了安装脚本&#xff0c;一件安装即可&#xff0c;但是经常因为网络不稳定而导致安装失败。这里提供在Linux下进行git加速的几种方法&#xff0c;可以尝试下。如果问题没有解决&#xff0c;也不要担心&#xff0c;我们还提供了两种平替方法进行luanvim的…

linux实验五sed和awk

按要求写出正则表达式 显示/etc/passwd中以bash结尾的行;显示/var/log/secure文件中包含“Failed”或“FAILED”的行查找/etc/man_db.conf中含有“以m开头&#xff0c;并以n结尾的单词”模式的行&#xff1b;显示/etc/man_db.conf中&#xff0c;包含Linux绝对路径的行&#xff…

基础巩固(六)自定义View

文章目录 View绘制流程MeasureLayoutDraw 自定义View的实现的步骤步骤1&#xff1a;实现Measure、Layout、Draw流程自定义 MeasureViewGroup.LayoutParamsMeasureSpec 自定义Layout 自定义属性 绘制工具类Paint具体使用 PathCanvas View绘制流程 在绘制前&#xff0c;系统会有一…

Python恶搞代码

文章目录 前言Tkinter界面设计Threading多线程恶搞代码 尾声 前言 快来领取python无限弹窗恶搞代码吧&#xff01;每天写一些有趣的小程序&#xff0c;带你成为一个浪漫的程序员&#xff01; Tkinter界面设计 1. 创建一个简单的界面 Tkinter 是 Python 标准库中的一个 GUI&…

自然语言处理从入门到应用——动态词向量预训练:双向语言模型

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 对于给定的一段输入文本 w 1 w 2 ⋯ w n w_1w_2\cdots w_n w1​w2​⋯wn​&#xff0c;双向语言模型从前向&#xff08;从左到右&#xff09;和后向&#xff08;从右到左&#xff09;两个方向同时建立语言模型。这样做…

go 调试利器之pprof指标分析

文章目录 概要一、指标类型1.1、堆栈指标1.2、CPU指标分析1.3、http-pprof 二、go tool pprof2.1、可视化2.2、CPU火焰图 概要 Go语言原生支持对于程序运行时重要指标或特征进行分析。pprof是其中一种重要的工具&#xff0c;其不仅可以分析程序运行时的错误&#xff08;内存泄…

ChatGPT 之 LangChain的文本切割方法对比

本文来自http://blog.csdn.net/hellogv/ &#xff0c;引用必须注明出处&#xff01; ChatGPT面向对话格式的文本理解很好&#xff0c;但如果要把网络上的文章让ChatGPT直接分析则会有格式的问题。文本清洗是个大课题&#xff0c;讲起来需要很多篇幅&#xff0c;优化起来前路漫…

使用arduino IDE开发ESP8266NodeMCU连接DHT11实现温湿度检测并上传onenet官网

前言&#xff1a; 本篇博客记录一下以arduino IDE来开发一下ESP8266NodeMCU&#xff0c;实现用DHT11进行温湿度检测&#xff0c;并且上传新版的onenet官网&#xff1b;我在实现这个小项目的时候&#xff0c;发现网上资料有关onenet的资料都是旧版的&#xff0c;这就有点难受了&…

[MAUI]弧形进度条与弧形滑块的交互实现

文章目录 弧形基类定义绘制弧 弧形进度条(ProgressBar)添加动画宽度补偿文本 弧形滑块(Slider)创建控制柄拖动事件处理 项目地址 进度条&#xff08;ProgressBar&#xff09;用于展示任务的进度&#xff0c;告知用户当前状态和预期&#xff1b; 滑块&#xff08;Slider&#xf…

本地安装部署运行 ChatGLM-6B 的常见问题解答以及后续优化

报错 No module named ‘transformers_modules.THUDM/chatglm-6b’ 报错本身的意思是&#xff0c;没有在指定的路径THUDM/chatglm-6b找到推理用模型 一般常见于自己手动下载模型&#xff0c;而不是通过下边这些文件直接启动&#xff0c;自动下载的情况 你需要修改web_demo.py&…

分层测试终究是大梦一场空?

分层测试分了个寂寞&#xff1f; 分层测试这个风吹了好多年&#xff0c;不分层都不好意思说自己是专业测试。各互联网公司更是对此乐此不疲&#xff0c;测试架构、测试平台&#xff0c;搞了一套又一套&#xff0c;然而。。。 理想总是丰满&#xff0c;现实总是骨干&#xff0…

第十三章 反射操作相关函数

1. 【检测对象是否可被调用】callable()函数 语法参考 callable函数的语法格式如下&#xff1a; callable(object)参数说明&#xff1a; object&#xff1a;对象&#xff1b; 返回值&#xff1a;如果对象可调用返回 True&#xff0c;否则返回 False。 说明&#xff1a;对于…

Python 中print 和return 的区别,你了解吗?

1、print() print()函数的作用是输出数据到控制台,就是打印在你能看到的界面上。 2、return return语句[表达式]退出函数&#xff0c;选择性地向调用方返回一个表达式。不带参数值的return语句返回None。 return作为脚本单独运行时则需要print函数才能显示&#xff0c;但是…