GPT-3 基于大型语言模型构建创新NLP产品 第三章 GPT-3编程

发布于 2023年08月26日

GPT-3的几乎所有自然语言处理能力都是用Python编程语言创建的。但是为了实现更广泛的可访问性,API内置了对所有主要编程语言的支持,以便用户可以使用自己选择的编程语言来构建基于GPT-3的应用程序。

在本节中,我们将通过三种常见的编程语言来演示这是如何工作的:Python、Go和Java。

只是提前说明一下:在每个特定语言的部分,我们假设您对正在讨论的编程语言有基本的理解。如果您不了解,可以安全地跳过该部分。

使用OpenAI API与Python

Python是数据科学和机器学习任务中最流行的语言。与常规的数据科学编程语言R和Stata相比,Python的优势在于它具有可伸缩性,并且与数据库集成良好。它被广泛使用,并且有一个蓬勃发展的开发人员社区来保持其生态系统的更新。Python易于学习,并且具有有用的数据科学库,如NumPy和pandas。

您可以通过使用名为[Chronology](https://oreil.ly/9eULI)的库将GPT-3与Python配对,该库提供了一个简单直观的接口。Chronology可以减轻每次都从头开始编写所有代码的单调工作。其功能包括:

  • 它异步调用OpenAI API,允许您同时生成多个提示补全。

  • 您可以轻松创建和修改训练提示;例如,修改其他示例使用的训练提示相当简单。

  • 它允许您通过将一个提示的输出插入另一个提示来链接提示。

Chronology托管在PyPI上,并支持Python 3.6及更高版本。要安装该库,请运行以下命令:

pip install chronological

在通过PyPI安装Python库后,我们来看一个示例,了解如何启用GPT-3,根据二年级阅读水平来总结给定的文本文档。我们将向您展示如何调用API,将训练提示作为请求发送,并获取输出的总结。我们已经在GitHub存储库中为您发布了代码。

在此示例中,我们将使用以下训练提示:

My second-grader asked me what this passage means:
"""
Olive oil is a liquid fat obtained from olives (the fruit of Olea europaea; 
family Oleaceae)...
"""
I rephrased it for him, in plain language a second-grader can understand:
"""

首先,导入以下依赖项:

# 导入依赖
from chronological import read_prompt, cleaned_completion, main

现在我们可以创建一个函数,该函数读取训练提示并提供完成输出。我们使这个函数异步化,这允许我们进行并行函数调用。我们将使用以下配置为API参数:

  • 最大令牌=100

  • 执行引擎=“Davinci”

  • 温度=0.5

  • Top-p=1

  • 频率惩罚=0.2

  • 停止序列=[“\n\n”]

# Takes in the training prompt and returns the completed response 
async def summarization_example(): 
    # Takes in a text file(summarize_for_a_2nd_grader) as the input prompt
    prompt_summarize = read_prompt('summarize_for_a_2nd_grader')    
    # Calling the completion method along with the specific GPT-3 parameters
    completion_summarize = await cleaned_completion(prompt_summarize, 
    max_tokens=100, engine="davinci", temperature=0.5, top_p=1, 
    frequency_penalty=0.2, stop=["\n\n"])
    # Return the completion response
    return completion_summarize

现在我们可以创建一个异步工作流程,使用库提供的main函数调用该工作流程,并在控制台中打印输出:

# Designing the end-to-end async workflow, capable of running multiple prompts 
# in parallel  
async def workflow():
    # Making async call to the summarization function
    text_summ_example = await summarization_example()
    # Printing the result in console
    print('-------------------------')
    print('Basic Example Response: {0}'.format(text_summ_example))
    print('-------------------------')
# invoke Chronology by using the main function to run the async workflow
main(workflow)

将其保存为Python脚本,文件名为 text_summarization.py ,然后从终端运行它以生成输出。您可以从根文件夹运行以下命令:

python text_summarization.py

执行脚本后,控制台应打印以下对提示的摘要:

-------------------------
Basic Example Response: Olive oil is a liquid fat that comes from olives. 
Olives grow on a tree called an olive tree. The olive tree is the most common 
tree in the Mediterranean. People use the oil to cook with, to put on their 
salads, and as a fuel for lamps.
-------------------------

如果您不太熟悉Python并希望在不编写代码的情况下链接不同的提示,您可以使用Chronology库上构建的无代码界面来使用拖放创建提示工作流程。有关如何使用Python编程与GPT-3交互的更多示例,请参见我们的[GitHub仓库](https://oreil.ly/AfTQM)。

使用OpenAI API与Go

Go是一个开源编程语言,它结合了其他编程语言的最佳特性,将解释的、动态类型语言的易用性与编译语言的效率和安全性相结合。开发人员经常称它为“21世纪的C”。

Go是首选进行需要高安全性、高速度和高模块性的项目的语言。这使它成为金融科技行业许多项目的有吸引力的选择。Go的关键特性如下:

  • 易用性

  • 最先进的生产力

  • 高效的静态类型

  • 网络的先进性能

  • 充分利用多核心功率

如果您完全是Go的新手并希望尝试一下,可以按照文档开始使用。

一旦您完成安装并了解Go编程的基础知识,就可以按照以下步骤使用Go的GPT-3 API封装。要了解有关创建Go模块的更多信息,请参阅此教程。

首先,您将创建一个模块来跟踪和导入代码依赖项。使用以下命令创建并初始化gogpt模块:

go mod init gogpt

在创建gogpt模块后,让我们指向此GitHub仓库以下载使用API所需的必要依赖项和包。使用以下命令:

go get github.com/sashabaranov/go-gpt3
go get: added github.com/sashabaranov/go-gpt3 v0.0.0-20210606183212-2be4a268a894

我们将使用与前面部分相同的文本摘要示例。(您可以在以下仓库中找到所有代码。)

首先导入必要的依赖项和包:

# Calling the package main
package main
# Importing Dependencies
import (
    "fmt"
    "io/ioutil"
    "context"
    gogpt "github.com/sashabaranov/go-gpt3"
)

Go编程将源文件组织成为包的系统目录,这使得跨Go应用程序重用代码变得更加容易。在代码的第一行中,我们调用package main,这告诉Go编译器该包应该编译成可执行程序,而不是共享库。

注意

在Go中,每当您构建可重用的代码片段时,您将开发一个包作为共享库。但是在开发可执行程序时,您将使用package main使包成为可执行程序。因为我们正在调用这个包的main函数,所以main将被设置为可执行程序的入口点。

现在,您将创建一个main函数,该函数将托管读取培训提示并提供完成输出的整个逻辑。使用以下配置为API参数:

  • 最大令牌=100

  • 执行引擎=“Davinci”

  • 温度=0.5

  • Top-p=1

  • 频率惩罚=0.2

  • 停止序列=[“\n\n”]

func main() {
    c := gogpt.NewClient("OPENAI-API-KEY")
    ctx := context.Background()    
    prompt, err := ioutil.ReadFile("prompts/summarize_for_a_2nd_grader.txt")
    req := gogpt.CompletionRequest{
        MaxTokens: 100,
        Temperature: 0.5,
        TopP: 1.0,
        Stop: []string{"\n\n"},
        FrequencyPenalty: 0.2,
        Prompt: string(prompt),
    }
    resp, err := c.CreateCompletion(ctx, "davinci", req)
    if err != nil {
        return
    }

    fmt.Println("-------------------------")
    fmt.Println(resp.Choices[0].Text)
    fmt.Println("-------------------------")
}

这段代码执行以下任务:

1. 通过提供API令牌设置一个新的API客户端,然后将其留在后台运行。

2. 从prompts文件夹以文本文件的形式读取提示””。

3. 通过提供培训提示并指定API参数的值(如温度、Top P、停止序列等)创建一个完成请求。

4. 调用create completion函数并向其提供API客户端、完成请求和执行引擎。

5. 以完成形式生成一个响应,该响应最后在控制台中打印。

然后,您可以将代码文件保存为text_summarization.go,并从终端运行它以生成输出。您可以使用以下命令从根文件夹运行该文件:

go run text_summarization.go

执行文件后,您的控制台将打印以下输出:

-------------------------
Olive oil is a liquid fat that comes from olives. Olives grow on a tree called an 
olive tree. The olive tree is the most common tree in the Mediterranean. People 
use the oil to cook with, to put on their salads, and as a fuel for lamps.
-------------------------

有关如何使用Go编程与GPT-3交互的更多示例,请访问我们的[GitHub仓库](https://oreil.ly/r5HhV)。

使用OpenAI API与Java

Java是开发常规软件系统的最古老和最流行的编程语言之一;它还是一个平台,其中带有运行时环境。它由Sun Microsystems(现为Oracle的子公司)在1995年开发,截至今天,超过30亿台设备上运行着它。它是一个通用的、面向类的、面向对象的编程语言,旨在具有较少的实现依赖性。其语法类似于C和C++。软件行业的三分之二仍然使用Java作为其核心编程语言。

让我们再次使用橄榄油文本摘要示例。与Python和Go一样,我们将向您展示如何调用API,将培训提示作为请求发送,并使用Java获取总结的完成输出。

要在本地机器上逐步完成代码演练,请克隆我们的GitHub存储库。在克隆的存储库中,转到Programming_with_GPT-3文件夹并打开GPT-3_Java文件夹。

首先,导入所有相关的依赖项:

package example;

// Importing Dependencies 
import java.util.*;  
import java.io.*;
import com.theokanning.openai.OpenAiService;
import com.theokanning.openai.completion.CompletionRequest;
import com.theokanning.openai.engine.Engine;

现在您可以创建一个名为OpenAiApiExample的类。您的所有代码都将是该类的一部分。在该类下,首先使用API令牌创建一个OpenAiService对象:

class OpenAiApiExample {
    public static void main(String... args) throws FileNotFoundException {
        
        String token = "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";
        OpenAiService service = new OpenAiService(token);

连接到OpenAI API现在以服务对象的形式建立。从prompts文件夹中读取培训提示:

// Reading the training prompt from the prompts folder
File file = new File("D:\\GPT-3 Book\\Programming with GPT-3\\GPT-3 
Java\\example\\src\\main\\java\\example\\prompts\\
summarize_for_a_2nd_grader.txt");

Scanner sc = new Scanner(file);

// we just need to use \\Z as delimiter
sc.useDelimiter("\\Z");

// pp is the string consisting of the training prompt
String pp = sc.next();

然后您可以使用以下配置为API参数创建一个完成请求:

  • 最大令牌=100

  • 执行引擎=“Davinci”

  • 温度=0.5

  • Top-p=1

  • 频率惩罚=0.2

  • 停止序列=[“\n\n”]

// Creating a list of strings to used as stop sequence
List<String> li = new ArrayList<String>();    
li.add("\n\n"''");
// Creating a completion request with the API parameters
CompletionRequest completionRequest = CompletionRequest.builder().prompt(pp)
.maxTokens(100).temperature(0.5).topP(1.0).frequencyPenalty(0.2).stop(li)
.echo(true).build();
// Using the service object to fetch the completion response 
service.createCompletion("davinci",completionRequest).getChoices().forEach
(System.out::println);

将代码文件保存为text_summarization.java,然后从终端运行它以生成输出。您可以使用以下命令从根文件夹运行该文件:

./gradlew example:run

您的控制台应该像前面的示例一样打印出相同的摘要。有关如何使用Java与GPT-3交互的更多示例,请参阅我们的GitHub存储库。

基于Streamlit的GPT-3沙箱

在本节中,我们将介绍GPT-3沙箱,这是一个开源工具,我们创建它以提供样板代码,以帮助您只需几行Python代码就可以将想法变为现实。我们将向您展示如何使用它以及如何根据您的具体应用程序进行自定义。

我们沙箱的目标是赋予您创建很酷的网络应用程序的能力,无论您的技术背景如何。它建立在Streamlit框架的基础上。

为配合这本书,我们还创建了一个步骤视频系列,其中包含有关创建和部署GPT-3应用程序的分步说明,您可以通过扫描图3-1中的QR码来访问。请在阅读本章时遵循它。

我们在示例中使用Visual Studio Code作为IDE,但请随意使用任何IDE。在开始之前,您需要安装IDE。请也确保您正在运行Python 3.7或更高版本。您可以通过运行以下命令来确认您已安装的版本:

python --version

通过在IDE中的新终端中打开并使用以下命令克隆[代码库](https://oreil.ly/gpt3-repo):

git clone https://github.com/Shubhamsaboo/kairos_gpt3

克隆存储库后,您的IDE中的代码结构应如图3-2所示。

需要您所有用来创建和部署网络应用程序的一切已经存在于代码中。您只需要调整几个文件以自定义沙箱以适应您的特定用例。

创建一个名为env的Python虚拟环境。然后您可以安装所需的依赖项。

转到email_generation文件夹。您的路径应该如下所示:

(env) kairos_gpt3\GPT-3 Sandbox\email_generation>

从那里,运行以下命令:

(env) kairos_gpt3\GPT-3 Sandbox\email_generation> pip install -r requirements.txt

现在您可以开始自定义沙箱代码了。您需要查看的第一个文件是training_data.py。打开该文件,并用您要使用的培训提示替换默认提示。您可以使用GPT-3沙箱(请参阅第2章和我们的视频以获取更多关于自定义沙箱的信息)来试验不同的培训提示。

接下来,您准备根据应用程序用例的要求调整API参数(最大令牌数、执行引擎、温度、Top P、频率惩罚、停止序列)。我们建议针对给定的培训提示在Playground中尝试不同的参数值,以确定哪些值最适合您的用例。一旦您在Playground中获得满意的结果,就可以在model_training_service.py文件中更改这些值。

就是这样!您的基于GPT-3的网络应用程序现在已准备就绪。您可以使用以下命令在本地运行它:

(env) kairos_gpt3\GPT-3 Sandbox\email_generation> streamlit run gpt_app.py

检查它是否可用,然后您可以使用Streamlit共享将应用程序部署到互联网上,以向更广泛的受众展示它。我们的视频提供了完整的部署演练。

注意

此应用程序遵循一个简单的工作流,其中培训提示从UI接收单个输入并生成响应。如果您的应用程序需要更复杂的工作流程,其中培训提示需要多个输入,请通过浏览脚本 app1.py、app2.py和gpt_app.py来自定义UI元素。有关详细信息,请参阅[Streamlit文档](https://docs.streamlit.io/)。

在接下来的几章中,我们将探索GPT-3的不同应用,以及成功的业务是如何在其产品体系结构的核心上构建GPT-3的。

推出基于GPT-3的应用程序

您是否已准备好将基于GPT-3的应用程序投入生产?

在这样做之前,让我们讨论一些风险缓解措施。在第6章中,您将了解GPT-3可能被用来做一些有害的事情。为了防止这些恶意行为,OpenAI已经制定了在基于GPT-3的应用程序正式启动之前必须遵循的准则和程序。目前,您可以在不获得预先批准的情况下,将API提供给5个人。但是对于更多人,您需要申请启动前生产审查。我们强烈建议您在申请之前通读使用准则。

在提交启动前审查请求时,OpenAI团队会仔细查看您的用例,并标记任何潜在违反API安全最佳实践的情况。如果您的请求获得批准,OpenAI将授予您最大花费限额,这个限额会随着您建立良好的记录而逐渐增加。随着您的用户群增长,您可以提交配额增加请求。这使您能够随时构建和部署您的应用程序,同时OpenAI可以监控其对平台的潜在影响。

总结

在本章中,我们学习了如何使用OpenAI API与Python、Go和Java等编程语言一起使用。我们还介绍了使用Streamlit构建的低代码沙箱环境,这将帮助您快速将您的想法转化为应用程序。最后,我们看了使基于GPT-3的应用程序上线所需满足的关键要求。本章为您提供了API的编程视角;接下来,我们将深入探讨GPT-3所赋能的新兴生态系统。



评论