本文将介绍如何使用Java接入openAI SDK
提前准备:
- openAI的token
- 本地调试时需要科学上网(懂得都懂),否则接口可能会调用失败
- 一台国外的服务器(部署时如果是国内的服务器则需要搭建代理,国外的服务器可直接使用,服务器节点最好在美国或者新加坡,如果只是本地调试,则无需准备)
maven依赖包
<dependency>
<groupId>com.theokanning.openai-gpt3-java</groupId>
<artifactId>service</artifactId>
<version>0.14.0</version>
</dependency>
第一步:创建OpenAiService对象,使用该对象请求openAI服务
OpenAiService openAiService = new OpenAiService(AIToken, Duration.ofMillis(100000));
- AIToken:上文所说的需要准备的openAI的token
- Duration.ofMillis(100000):
- 源码解释: http read timeout, Duration.ZERO means no timeout(翻译:http读取超时,持续时间。0表示没有超时)
- openAI服务调用时会有一段
持续时间
(该持续时间可能是AI生成内容需要时间),该参数代表这个持续时间
最长为多久,当参数值为Duration.ZERO时,接口不会超时 - 该参数也可以不输入,超时时间默认为10秒
OpenAiService openAiService = new OpenAiService(AIToken);
//源码:
private static final Duration DEFAULT_TIMEOUT = Duration.ofSeconds(10);
public OpenAiService(final String token) {
this(token, DEFAULT_TIMEOUT);
}
第二步:创建请求参数对象(官网地址)
String content = "如何学习Java";
CompletionRequest completionRequest = CompletionRequest.builder()
.prompt("请回答或扩写[" + content + "],输出语言与输入语言保持一致。输出格式:使用json源码格式输出,json格式为[自定义json格式],保持层级")
.model("text-davinci-003")
.echo(false)
.n(1)
.maxTokens(2000)
.build();
- prompt (必需,字符串或数组):
- 源码解释:An optional prompt to complete from(翻译:用于完成的可选提示符)
- 这里传你想向AI提出的问题即可,openAI会根据这个参数生成返回内容(上面例子是一个模版,content是用户传入的问题参数,这样不管用户输入什么内容,AI都能相对精准的生成内容,以json源码格式输出是为了后面在代码中解析AI生成的返回内容)
- model (必需,字符串):
- 源码解释:The name of the model to use. Required if specifying a fine-tuned model or if using the new v1/completions endpoint.
- 该参数指需要使用的AI模型的名称,本文以
text-davinci-003
模型为例,各模型的介绍请自行查询(官网地址)。不同模型使用的API可能略有差异
//该方法可获取所有可使用的AI模型 List<Model> models = openAiService.listModels();
- echo(布尔值或null,可选,默认为false):
- 源码解释:Echo back the prompt in addition to the completion(翻译:除了完成之外还回显提示)
- 是否在返回内容中回显
提示词
(prompt中的内容),视使用场景而定,上面的例子因为对用户输入的内容做了额外处理,并且为了方便实际应用场景中的解析,所以选择false
- n (整数或null,可选,默认为1):
- 源码解释:How many completions to generate for each prompt. Because this parameter generates many completions, it can quickly consume your token quota. Use carefully and ensure that you have reasonable settings for maxTokens and stop.(翻译:为每个提示生成多少个完成。 由于此参数会生成许多完成,因此它会快速消耗您的令牌配额。 谨慎使用并确保您对 maxTokens 和停止有合理的设置。)
- 为prompt生成多少个回答。openAI返回对象中的内容结果集是一个List,这里传入几,List中就会有几条数据(后面获取结果集时会再说下这个)。没有在源码中查询到相关默认值,但是经过多次测试发现,如果没有传入此参数,结果集List都是只返回一条内容
- maxTokens (整数或null,可选,默认为16):
- 源码解释:The maximum number of tokens to generate. Requests can use up to 2048 tokens shared between prompt and completion. (One token is roughly 4 characters for normal English text)(翻译:要生成的最大令牌数。 请求最多可以使用提示和完成之间共享的 2048 个令牌。 (对于普通英文文本,一个标记大约为 4 个字符))
- The token count of your prompt plus
max_tokens
cannot exceed the model's context length.(翻译:提示符加上max_tokens的令牌计数不能超过模型的上下文长度。模型的上下文长度在上方模型官网中有介绍,text-davinci-003
模型的上下文长度是4,097 tokens) - 结果集中返回的单条记录的最大长度,若maxTokens配置的值过小,则返回内容字符串会被截断。
- 更多参数请自行查阅官网
第三步:调用API,传入请求参数,等待AI生成结果,获取返回值
CompletionResult completion = openAiService.createCompletion(completionRequest);
CompletionResult数据结构
{
"id": "cmpl-uqkvlQyYK7bGYrRHQ0eXlWi7",
"object": "text_completion",
"created": 1589478378,
"model": "gpt-3.5-turbo",
"choices": [
{
"text": "\n\nThis is indeed a test",
"index": 0,
"logprobs": null,
"finish_reason": "length"
}
],
"usage": {
"prompt_tokens": 5,
"completion_tokens": 7,
"total_tokens": 12
}
}
- id:
- 源码解释:A unique id assigned to this completion.(翻译:分配给此完成的唯一id。)
- 即此次请求的一个标识而已
- object:
- 源码解释:beta.openai.com/docs/api-re… The type of object returned, should be "text_completion"(翻译:beta.openai.com/docs/api-re… 返回的对象类型,应为“text_completion”)
- 对象类型,总是"text_completion"
- created:
- 源码解释:The creation time in epoch seconds.(翻译:创建时间(以纪元秒为单位)。)
- 创建完成时的Unix时间戳
- model:
- 源码解释:The GPT model used.(翻译:使用的GPT模型)
- 此次请求使用的模型,与第二步中的model参数保持一致
- choices(List类型):
- 源码解释:A list of generated completions.(翻译:生成的完成列表。)
- 即AI根据prompt所生成的内容列表,第二步中的参数
n
为多少,该集合就有多少条记录- text:生成的文本。 如果 CompletionRequest.echo 为 true,将包含提示
- index:返回列表中此完成的索引。
- logprobs:所选令牌和顶部 CompletionRequest.logprobs 令牌的对数概率
- finish_reason:GPT 停止生成的原因,例如“长度”。
- usage:
- 源码解释:The API usage for this request(翻译:此请求的 API 使用情况)
- 完成此次请求的token的使用统计。