Alan Hou的个人博客

ChatGPT开发入门

尽管前赴后继有各种厂商声称在某些基准测试上超越了GPT 4,OpenAI旗下的ChatGPT仍然是用户量最高且公认的最优质的人工智能产品。OpenAI在GPT 2之后就不再开源其大模型,这也正是马斯克吐槽其应改名为ClosedAI。大佬们的口水战与我等无关,对于开发者来说,要在自己的系统里集成优秀的 GPT,就需要通过调用其 API。

本文的相关代码请见 GitHub

如何获取API Key?

调用 OpenAI的 API 无需订阅ChatGPT Plus。我们知道OpenAI在 APP 端和网页端都提供有其于 GPT 3.5的免费对话服务,而ChatGPT Plus 是为希望使用GPT 4、GPT Store及多模态等功能的用户所提供的付费订阅服务。我们获取 API Key与ChatGPT Plus并无直接关联,它主要要求绑定信用卡以供按使用量扣款。绑定信用卡可访问账单信息页面。成功绑定信用卡后进入API keys页面点击Create new secret key创建一个以sk-开头API Key。

如何使用API Key?

API Key应妥善保管,最佳实践是不在代码中明文添加API Key。常见的做法是添加到环境变量中,在 Linux或Mac命令行中的设置方法是:

在Windows下命令稍有不同:

以上是基于 Shell会话的设置方法,我们还可以将环境变量设置到全局,方便在所有程序中调用,Linux和 Mac 中可在.bashrc.zshrc等文件中添加相应命令。Windows下则是在系统属性(sysdm.cpl)的高级标签页设置全局环境变量。

有关API Key的最佳实践及设置方法也可参阅 OpenAI 的官方文档Best Practices for API Key Safety

开发上调用OpenAI的API通常会使用Python,当然其社区也提供了其它主流语言的开发包,且其调用本质上就是HTTP请求,所以并不局限于任何编程语言。首先应安装Python官方包。

从环境变量中读取并设置API Key的方法也很简单:

但如果按照官方的环境变量名称进行设置实际上并不需要编写这段代码,官方支持的环境变量名称有:

同时在项目中我们一般通过配置文件的方式来设置环境变量,创建一个.env文件:

安装dotenv包(pip install python-dotenv)进行加载即可:

开发一个Hello World 程序

OpenAI的SDK在1.0.0前后并不兼容,对于老版本的 SDK,调用方法是:

此时会看到输出内容:

而在1.0.0之后版本以上代码会报错:

报错信息也很明确了,就是移除了这一 API,解决方法一是降级安装包,如执行pip install openai==0.28,或是使用官方的工具也即openai migrate命令自动升级代码。考虑到

新版的执行方法:

此时会输出:

可以在这里看到官方对消息封装了一个ChatCompletionMessage对象,所以徜若按之前访问字典的方式执行print(completion["choices"][0]["message"]["content"]),会报如下错误:

输出内容只需要按操作对象的方式执行print(completion.choices[0].message.content)即可。

除了编写代码,OpenAI也提供了命令行调用的方式,如:

生成结果中的主要字段有:

Embedding和Token

embedding和token 的概念和具体作用计划单独放在一节中进行讲解,以下简单介绍下如何通过代码来生成相应的结果,首先 OpenAI API 中提供了创建 embedding 的方法:

输出结果为:

可以看到所得到嵌入向量完全不适合人类阅读,这正是大语言的奇妙之处。因为最适合计算机理解的是数字,通过将自然语言转换为数字向量,计算机就可以更高效地去推理其中的关系,所得到的向量会做为机器学习模型及自然语言处理算法的输入。

token是一种分词方式,OpenAI已经开源了这部分代码,因此无需调用 API,安装tiktoken包即可查看:

执行结果为:

如何知道是cl100k_base呢?一方面是查阅官方文档,另外tiktoken内置了通过模型名称查询编码方式的方法:

调用DALL·E实现文生图

client.images.generate有多个参数,这里使用了提示词prompt,生成图片数量n(取值范围为1到10,DALL·E 3当前仅支持使用1生成一张图)size是图像的尺寸的参数。通过IPython.display可在Jupyter Notebook中显示所生成图片,我们生成了两张,遍历显示如下:

API中的角色

在前面的示例中已经出现过role,当前共有三种角色:

如下面的示例:

输出结果为:

函数调用

函数调用为 OpenAI扩展了数据来源,同时也让开发者能在利用大语言模型优秀的自然语言理解能力的同时向其投喂数据或添加逻辑。下面举一个例子,其中并未涉及到外部 API,旨在探讨函数调用,今后我们再做深入的展开。

首先定义一个函数模型对数据库执行搜索:

接着对函数的详情进行描述,主要包含名称、描述、参数的定义,其中参数有类型、属性和必填项的指定:

创建一个会话:

此时message为:

response_message为:

大语言模型为我们创建了查询语句,打印response_message.function_call可得:

接下执行函数继续会话:

得到的回复如下:

内容审核

我们知道大语言模型应用面临的一大问题就是监管,在ChatGPT中有大量信息过滤处理,但很多并没有体现在 API 上,因此OpenAI额外提供了Moderation 的 API,供我们调用:

可以在结果中发现harassment_threatening=Trueviolence=Trueharassment/threatening=True

同时在使用 ChatGPT 等人工智能聊天工具还需要关注其胡编乱造、无中生有的可能性,出即所谓“幻觉”(hallucination)。

OpenAI所提供的功能还有很多有待探讨,本文旨在做一个入门介绍,希望后续能有机会做更深入的分享。

退出移动版