⚠️ 注意:该项目已于2024年6月6日停止维护并归档。感谢所有为此项目做出贡献和支持的人。尽管该代码库将保留其当前状态,但不会提供进一步的更新或支持。请随意分叉和修改代码。
⚠️OpenAI 已弃用所有基于引擎的 API。有关更多信息,请参见下文的弃用端点。
OpenAI-Java
用于使用 OpenAI GPT API 的 Java 库。支持 GPT-3、ChatGPT 和 GPT-4。
包括以下构件:
api
:用于 GPT API 的请求/响应 POJO。client
:用于 GPT 端点的基本 Retrofit 客户端,包含api
模块。service
:一个基本的服务类,用于创建和调用客户端。这是最简单的入门方式。
以及一个使用该服务的示例项目。
支持的 API
OpenAI 已弃用
导入
Gradle
implementation 'com.theokanning.openai-gpt3-java:<api|client|service>:<version>'
Maven
<dependency>
<groupId>com.theokanning.openai-gpt3-java</groupId>
<artifactId>{api|client|service}</artifactId>
<version>version</version>
</dependency>
使用
仅数据类
如果您想要创建自己的客户端,只需从 api
模块导入 POJO。您的客户端需要使用蛇形命名法才能与 OpenAI API 一起使用。
Retrofit 客户端
如果您使用 Retrofit,可以导入 client
模块并使用 OpenAiApi。
您需要将认证令牌添加为请求头(参见 AuthenticationInterceptor),并设置转换工厂以使用蛇形命名法并仅包含非空字段。
OpenAiService
如果您想要最快的解决方案,导入 service
模块并使用 OpenAiService。
⚠️客户端模块中的 OpenAiService 已弃用,请切换到服务模块中的新版本。
OpenAiService service = new OpenAiService("your_token");
CompletionRequest completionRequest = CompletionRequest.builder()
.prompt("Somebody once told me the world is gonna roll me")
.model("babbage-002")
.echo(true)
.build();
service.createCompletion(completionRequest).getChoices().forEach(System.out::println);
自定义 OpenAiService
如果您需要自定义 OpenAiService,请创建自己的 Retrofit 客户端并将其传递给构造函数。 例如,添加请求日志记录(在添加日志记录 gradle 依赖项后):
ObjectMapper mapper = defaultObjectMapper();
OkHttpClient client = defaultClient(token, timeout)
.newBuilder()
.interceptor(HttpLoggingInterceptor())
.build();
Retrofit retrofit = defaultRetrofit(client, mapper);
OpenAiApi api = retrofit.create(OpenAiApi.class);
OpenAiService service = new OpenAiService(api);
添加代理
要使用代理,请按如下方式修改 OkHttp 客户端:
ObjectMapper mapper = defaultObjectMapper();
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(host, port));
OkHttpClient client = defaultClient(token, timeout)
.newBuilder()
.proxy(proxy)
.build();
Retrofit retrofit = defaultRetrofit(client, mapper);
OpenAiApi api = retrofit.create(OpenAiApi.class);
OpenAiService service = new OpenAiService(api);
函数
您可以使用 ChatFunction 类轻松创建函数并定义其执行器,使用任何自定义类来定义其可用参数。借助名为 FunctionExecutor 的执行器,您还可以轻松处理这些函数。
首先,我们声明函数参数:
public class Weather {
@JsonPropertyDescription("城市和州,例如:León, Guanajuato")
public String location;
@JsonPropertyDescription("温度单位,可以是 'celsius' 或 'fahrenheit'")
@JsonProperty(required = true)
public WeatherUnit unit;
}
public enum WeatherUnit {
CELSIUS, FAHRENHEIT;
}
public static class WeatherResponse {
public String location;
public WeatherUnit unit;
public int temperature;
public String description;
// 构造函数
}
接下来,我们声明函数本身并将其与执行器关联,在此示例中,我们将从某个 API 假定响应:
ChatFunction.builder()
.name("get_weather")
.description("获取某个位置的当前天气")
.executor(Weather.class, w -> new WeatherResponse(w.location, w.unit, new Random().nextInt(50), "sunny"))
.build()
然后,我们使用 'service' 模块中的 FunctionExecutor 对象来帮助执行并转换为一个准备好进行对话的对象:
List<ChatFunction> functionList = // 包含函数的列表
FunctionExecutor functionExecutor = new FunctionExecutor(functionList);
List<ChatMessage> messages = new ArrayList<>();
ChatMessage userMessage = new ChatMessage(ChatMessageRole.USER.value(), "告诉我巴塞罗那的天气。");
messages.add(userMessage);
ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest
.builder()
.model("gpt-3.5-turbo-0613")
.messages(messages)
.functions(functionExecutor.getFunctions())
.functionCall(new ChatCompletionRequestFunctionCall("auto"))
.maxTokens(256)
.build();
ChatMessage responseMessage = service.createChatCompletion(chatCompletionRequest).getChoices().get(0).getMessage();
ChatFunctionCall functionCall = responseMessage.getFunctionCall(); // 可能为 null,但在这种情况下,它肯定是对我们的 'get_weather' 函数的调用。
ChatMessage functionResponseMessage = functionExecutor.executeAndConvertToMessageHandlingExceptions(functionCall);
messages.add(response);
注意:
FunctionExecutor
类是 'service' 模块的一部分。
您还可以创建自己的函数执行器。ChatFunctionCall.getArguments()
返回的对象是一个 JsonNode,为简单起见,它应该能够帮助您实现这一点。
有关更深入的示例,请参阅使用函数的对话示例:OpenAiApiFunctionsExample.java。 或使用函数和流的示例:OpenAiApiFunctionsWithStreamExample.java。
流线程关闭
如果您希望在流响应后立即关闭进程,请调用 OpenAiService.shutdownExecutor()
。
对于非流调用,这是不必要的。
运行示例项目
所有示例项目需要的只是您的 OpenAI API 令牌
export OPENAI_TOKEN="sk-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
您可以尝试使用以下命令来尝试该项目的所有功能:
./gradlew runExampleOne
您还可以尝试使用函数的新功能:
./gradlew runExampleTwo
或启用 'stream' 模式的函数:
./gradlew runExampleThree
常见问题
是否支持 GPT-4?
是的!GPT-4 使用 ChatCompletion API,您可以在此处查看最新的模型选项。
截至 2023 年 4 月 1 日,GPT-4 目前处于有限测试阶段,因此在尝试使用它之前,请确保您有访问权限。
是否支持函数?
当然!使用您自己的函数非常简单,无需担心繁琐的工作。 如上所述,您可以参考 [OpenAiApiFunctionsExample.java](example/src/main/java/example/OpenAiApi