技术概述
Go语言调用OpenAI API是用于在Go应用程序中使用OpenAI的人工智能能力的技术。通过这项技术,开发人员可以轻松地将OpenAI的强大模型集成到自己的应用中,实现自然语言处理、聊天机器人、文本生成,图像生成等功能。学习这项技术的原因是为了利用OpenAI API的强大能力,为应用程序提供智能化的文本处理功能。技术的难点在于理解API的用法和请求响应格式,以及请求限制。
技术详述
基本流程
图片1
详细解释
1.引入依赖包
首先,需要在Go项目中引入相关的依赖包。可以使用go-openai
客户端库来简化与OpenAI API的通信。通过import
语句导入必要的包,并为它起别名。
import (
"github.com/sashabaranov/go-openai"
)
2.创建OpenAI客户端
使用OpenAI API密钥创建一个OpenAI客户端,并从环境变量或其他安全存储位置获取API密钥。
client := openai.NewClient("YOUR_API_KEY")
3.准备请求数据
根据OpenAI API的要求,准备适当的请求数据。常用的字段包括指定模型、输入文本等。根据具体的应用场景和需求,构建请求对象。Model字段用户指定调用的模型,Message字段是一个切片用于传递信息,Role字段用于指定这条对话的类型,ChatMessageRoleSystem代表整个一次聊天的大语境,ChatMessageRoleUser则是用户的输入,ChatMessageRoleAssistant是AI的生成。(有时候我们需要传入历史的对话,或者构造虚对话所以需要指定ChatMessageRoleAssistant字段的内容)。
request := openai.ChatCompletionRequest{
Model: openai.GPT3Dot5Turbo,
Messages: []openai.ChatCompletionMessage{
{
Role: openai.ChatMessageRoleSystem,
Content: "you are a helpful chatbot",
},
{
Role: openai.ChatMessageRoleUser,
Content: "你好",
},
{
Role: openai.ChatMessageRoleAssistant,
Content: "你好,有什么可以帮助你的嘛?",
},
// 其他聊天消息
},
}
4.发送请求并获取响应
使用OpenAI客户端发送请求,并接收API返回的响应数据。处理潜在的错误和异常情况。
response, err := client.CreateChatCompletion(context.Background(), request)
if err != nil {
// 错误处理
} else {
// 解析响应数据
}
5.处理和使用响应数据
根据API的响应格式,解析和提取所需的信息。根据应用的需求,可以对响应数据进行后续处理、展示或其他操作。
result := response.Choices[0].Message.Content//回答的内容
// 根据需要处理响应数据
技术使用中遇到的问题和解决过程。
问题描述由于我们的项目的主体和特色是openAI的API,在清楚了上面的调用方式后我们将他们运用在我们的项目中,但是AI生成的答案有时候不尽人意(太过于发散或者重复一些历史的内容),这给我们带来了一些困扰,我们想在程序中能更好的引导AI去生成答案。
解决过程我找到了openAI为了API的使用者提供调试功能的Playground。
图片2
在Playgorund中我发现一些在高级参数,我去了解了这些参数代表的含义,并将他们运用在项目的代码中,下面是我的收获。
Temperature字段
该字段用于控制生成文本的创造性程度。它是一个可调节的参数,范围通常在0.0到1.0之间,其中0.0生成的文本更加确定性和保守,通常更加稳定和可预测,而1.0表示更加随机和创造性。
“显示概率”设置,我们可以看到GPT-3如何看待世界,以及接下来应该出现的单词。
在一个相当常见的句子上测试最低温度:“My favorite animal is。”随机性限制为零,GPT-3将得出最有可能的完成——“a dog”。
消除随机性还有另一个效果:GPT-3将始终为给定的提示产生相同的输出。运行了10次“My favorite animal is。”,收到了10个完全相同的输出。
My favorite animal is a dog
My favorite animal is a dog
My favorite animal is a dog
...
Top P字段
该字段限制生成文本时的选择范围。它通过指定一个概率阈值来决定在词汇表中进行采样的范围。较小的top P值会限制选择范围,使生成结果更加保守和确定性。较大的top P值会扩大选择范围,增加多样性和创造性。
为了更好地解释这个概念,让我们假设一下,模型预测“我想吃”这句话之后的下一个token。为了简单起见,我们将假设token是一个单词,并且模型输出以下概率:
- 胡萝卜 (2% likely),
- 黄瓜 (1.5% likely),
- 茄子(1% likely),
- 菠菜 (0.5% likely),
- 西兰花(0.3% likely)
- …
这组单词形成概率分布“P(单词|“我想吃”)”
- 2% 胡萝卜,
- 3.5% 胡萝卜和黄瓜,
- 4.5% 胡萝卜,黄瓜,茄子
- …
如果我们将Top P参数设置为3.5%,模型将根据胡萝卜和黄瓜的可能性在胡萝卜和黄瓜之间进行采样和随机选择。Top P为4.5%,该模型将在胡萝卜、黄瓜和茄子之间随机选择一个单词。
Frequency penalty字段(频率惩罚)
该字段控制模型重复预测的趋势。频率惩罚降低了已经生成的单词的概率。惩罚取决于一个单词在预测中已经出现多少次。
Presence penalty字段(存在惩罚)
该字段鼓励模型做出新的预测。如果一个单词已经出现在预测文本中,则存在惩罚会降低单词的概率。与频率惩罚不同,存在惩罚并不取决于过去预测中单词出现的频率。
总结
这次项目我学习了,使用Go语言调用OpenAI API从而提供一种简便的方式将OpenAI的人工智能能力集成到应用程序中。通过灵活调整参数,如temperature、top P、frequency penalty和presence penalty,可以控制生成文本的特性,以满足应用需求。在大语言模型的技术潮流中,我觉得我的这次学习经验十分宝贵。