Simple-OpenAI:用于OpenAI API集成的全面Java库
人工智能(AI)正日益在现代软件开发中变得越来越重要,提供的功能范围从自然语言处理到图像识别。OpenAI的API是一个主要的服务,用于添加AI功能,但将其集成到Java应用程序中可能会面临挑战,因为API调用和响应处理的复杂性。
这就是简单-Openai库发挥作用的地方。设计成一个轻量级、易于使用的包装器,围绕OpenAI的API,它旨在简化将OpenAI强大的人工智能服务集成到Java应用程序中。考虑到简单和一致性开发,该库为与OpenAI的API进行交互提供了精简的接口,使开发人员更容易将先进的人工智能功能融入其项目中。
图书馆是开源的,并且可在GitHub上找到:Simple-OpenAI存储库
主要特点
- 综合API覆盖:Simple-OpenAI支持广泛的OpenAI服务,包括:- 音频(语音,转录,翻译)- 批处理(聊天完成的批处理)- 聊天完成(文本生成,流式处理,函数调用,视觉,结构化输出)- 完成(传统文本生成)- 嵌入(文本向量化)- 文件(上传文件)- 微调(自定义模型)- 图像(生成,编辑,变化)- 模型(列表)- 审核(检查有害文本)- 上传(分部上传大文件)- 助手Beta v2(助手,线程,消息,运行,步骤,向量存储,流式处理,函数调用,视觉,结构化输出)
- 异步操作:这个库利用CompletableFuture来处理异步方法的响应,允许在您的应用程序中进行非阻塞操作。
- 流媒体支持: 适用服务支持实时流式回应,实现动态和交互式的AI功能。
- 功能调用:在聊天完成过程中实现自定义功能的无缝集成,使得更复杂和定制的人工智能互动成为可能。
- 结构化输出:能够定义和接收特定的JSON结构响应,确保一致且易于解析的人工智能生成内容。
- 额外的OpenAI提供商:支持Azure OpenAI和Anyscale,扩大了该库与不同AI服务提供商的兼容性。
技术实现
核心组件
- 简单的OpenAI类:与OpenAI API 交互的主要入口点。它是使用建造者模式构建的,允许灵活配置:var openAI = SimpleOpenAI.builder() .apiKey(System.getenv("OPENAI_API_KEY")) .build();
- 特定服务类别:每个OpenAI服务都由自己的类表示,封装了相关的API调用和数据结构。
- 请求和响应对象:为每个API端点提供了强类型的请求和响应对象,确保类型安全性和易用性。
- FunctionExecutor:用于管理和执行聊天完成过程中的自定义功能的实用程序类。
关键的设计模式和原则
- 生成器模式:广泛用于创建请求对象,允许清晰和灵活的参数设置。
- 依赖注入:该库允许自定义HTTP客户端注入,实现对网络请求的高级配置。
- 流式API: 利用Java的Stream API处理来自OpenAI流式端点的实时数据。
- 功能接口:使用Java的功能接口定义自定义函数,实现业务逻辑的无缝集成。
用法例子
聊天完成
var chatRequest = ChatRequest.builder()
.model("gpt-4o-mini")
.message(SystemMessage.of("You are an expert in AI."))
.message(UserMessage.of("Write a technical article about ChatGPT, no more than 100 words."))
.temperature(0.0)
.maxTokens(300)
.build();
var futureChat = openAI.chatCompletions().create(chatRequest);
var chatResponse = futureChat.join();
System.out.println(chatResponse.firstContent());
与流媒体完成的聊天
var chatRequest = ChatRequest.builder()
.model("gpt-4o-mini")
.message(SystemMessage.of("You are an expert in AI."))
.message(UserMessage.of("Write a technical article about ChatGPT, no more than 100 words."))
.temperature(0.0)
.maxTokens(300)
.build();
var futureChat = openAI.chatCompletions().createStream(chatRequest);
var chatResponse = futureChat.join();
chatResponse.filter(chatResp -> chatResp.getChoices().size() > 0 && chatResp.firstContent() != null)
.map(Chat::firstContent)
.forEach(System.out::print);
System.out.println();
功能调用
public static class Weather implements Functional {
@JsonPropertyDescription("The city and state, e.g., San Francisco, CA")
@JsonProperty(required = true)
public String location;
@JsonPropertyDescription("The temperature unit to use. Infer this from the user's location.")
@JsonProperty(required = true)
public String unit;
@Override
public Object execute() {
// Simulated weather data
double centigrades = Math.random() * (40.0 - 10.0) + 10.0;
double fahrenheit = centigrades * 9.0 / 5.0 + 32.0;
String shortUnit = unit.substring(0, 1).toUpperCase();
return shortUnit.equals("C") ? centigrades : (shortUnit.equals("F") ? fahrenheit : 0.0);
}
}
var functionExecutor = new FunctionExecutor();
functionExecutor.enrollFunction(
FunctionDef.builder()
.name("get_weather")
.description("Get the current weather of a location")
.functionalClass(Weather.class)
.strict(Boolean.TRUE)
.build());
var chatRequest = ChatRequest.builder()
.model("gpt-4o-mini")
.messages(messages)
.tools(functionExecutor.getToolFunctions())
.build();
var futureChat = openAI.chatCompletions().create(chatRequest);
var chatResponse = futureChat.join();
var chatMessage = chatResponse.firstMessage();
var chatToolCall = chatMessage.getToolCalls().get(0);
var result = functionExecutor.execute(chatToolCall.getFunction());
messages.add(chatMessage);
messages.add(ToolMessage.of(result.toString(), chatToolCall.getId()));
chatRequest = ChatRequest.builder()
.model("gpt-4o-mini")
.messages(messages)
.tools(functionExecutor.getToolFunctions())
.build();
futureChat = openAI.chatCompletions().create(chatRequest);
chatResponse = futureChat.join();
System.out.println(chatResponse.firstContent());
结构化输出
public static class MathReasoning {
public List<Step> steps;
public String finalAnswer;
public static class Step {
public String explanation;
public String output;
}
}
var chatRequest = ChatRequest.builder()
.model("gpt-4o-mini")
.message(SystemMessage.of("You are a helpful math tutor."))
.message(UserMessage.of("How can I solve 8x + 7 = -23"))
.responseFormat(ResponseFormat.jsonSchema(JsonSchema.builder()
.name("MathReasoning")
.schemaClass(MathReasoning.class)
.build()))
.build();
var chatResponse = openAI.chatCompletions().createStream(chatRequest).join();
chatResponse.filter(chatResp -> chatResp.getChoices().size() > 0 && chatResp.firstContent() != null)
.map(Chat::firstContent)
.forEach(System.out::print);
System.out.println();
高级功能
- Azure OpenAI 支持:该库提供SimpleOpenAIAzure类,用于与Azure的OpenAI服务集成,与微软基于云的人工智能解决方案兼容。
- 支持任意规模:对于使用任意规模AI服务的用户,SimpleOpenAIAnyscale类提供了一个定制的界面,实现无缝集成。
- 向量存储:该库支持向量存储操作,可以高效地从大型数据集中进行语义搜索和信息检索。
- 助理v2 API:全面支持OpenAI最新的助理API,实现具有先进功能的AI助理的创建和管理。
结论
Simple-OpenAI 是一个强大灵活的 Java 库,用于将 OpenAI 的服务集成到 Java 应用程序中。它全面覆盖了 OpenAI 的 API,结合用户友好的设计和高级功能,如函数调用和结构化输出,使其成为开发人员在项目中利用人工智能功能的无价工具。无论您是构建聊天机器人、内容生成系统还是复杂的人工智能应用程序,Simple-OpenAI 为与 OpenAI 最先进的人工智能技术无缝集成提供了基础。
有关更多信息、示例和参与该项目的方法,请访问Simple-OpenAI GitHub代码库。