跳到主要内容

Azure OpenAI

备注

这是 Azure OpenAI 集成的文档,它使用来自微软的 Azure SDK,如果您使用的是微软 Java 技术栈(包括高级 Azure 身份验证机制),它会工作得最好。

LangChain4j 提供了 4 种不同的 OpenAI 集成方式来使用聊天模型,这是第 3 种:

  • OpenAI 使用 OpenAI REST API 的自定义 Java 实现,与 Quarkus(因为它使用 Quarkus REST 客户端)和 Spring(因为它使用 Spring 的 RestClient)配合最佳。
  • OpenAI 官方 SDK 使用官方 OpenAI Java SDK。
  • Azure OpenAI 使用来自微软的 Azure SDK,如果您使用的是微软 Java 技术栈(包括高级 Azure 身份验证机制),它会工作得最好。
  • GitHub Models 使用 Azure AI 推理 API 访问 GitHub 模型。

Azure OpenAI 提供托管在 Azure 上的 OpenAI 语言模型(gpt-4gpt-4o 等),使用 Azure OpenAI Java SDK

Azure OpenAI 文档

Maven 依赖

纯 Java

langchain4j-azure-open-ai 库可在 Maven Central 上获取。

<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-azure-open-ai</artifactId>
<version>1.0.0-beta3</version>
</dependency>

Spring Boot

Spring Boot 启动器可用于更轻松地配置 langchain4j-azure-open-ai 库。

<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-azure-open-ai-spring-boot-starter</artifactId>
<version>1.0.0-beta3</version>
</dependency>
备注

在使用任何 Azure OpenAI 模型之前,您需要部署它们。

使用 API 密钥创建 AzureOpenAiChatModel

纯 Java

ChatLanguageModel model = AzureOpenAiChatModel.builder()
.endpoint(System.getenv("AZURE_OPENAI_URL"))
.apiKey(System.getenv("AZURE_OPENAI_KEY"))
.deploymentName("gpt-4o")
...
.build();

这将创建一个具有默认模型参数(例如 0.7 温度等)的 AzureOpenAiChatModel 实例, 并使用存储在 AZURE_OPENAI_KEY 环境变量中的 API 密钥。 可以通过在构建器中提供值来自定义默认模型参数。

Spring Boot

application.properties 中添加:

langchain4j.azure-open-ai.chat-model.endpoint=${AZURE_OPENAI_URL}
langchain4j.azure-open-ai.chat-model.service-version=...
langchain4j.azure-open-ai.chat-model.api-key=${AZURE_OPENAI_KEY}
langchain4j.azure-open-ai.chat-model.non-azure-api-key=${OPENAI_API_KEY}
langchain4j.azure-open-ai.chat-model.deployment-name=gpt-4o
langchain4j.azure-open-ai.chat-model.max-tokens=...
langchain4j.azure-open-ai.chat-model.temperature=...
langchain4j.azure-open-ai.chat-model.top-p=
langchain4j.azure-open-ai.chat-model.logit-bias=...
langchain4j.azure-open-ai.chat-model.user=
langchain4j.azure-open-ai.chat-model.stop=...
langchain4j.azure-open-ai.chat-model.presence-penalty=...
langchain4j.azure-open-ai.chat-model.frequency-penalty=...
langchain4j.azure-open-ai.chat-model.seed=...
langchain4j.azure-open-ai.chat-model.strict-json-schema=...
langchain4j.azure-open-ai.chat-model.timeout=...
langchain4j.azure-open-ai.chat-model.max-retries=...
langchain4j.azure-open-ai.chat-model.log-requests-and-responses=...
langchain4j.azure-open-ai.chat-model.user-agent-suffix=
langchain4j.azure-open-ai.chat-model.custom-headers=...

上述部分参数的描述可以在这里找到。

此配置将创建一个 AzureOpenAiChatModel bean(具有默认模型参数), 可以由 AI 服务使用, 或在需要的地方自动装配,例如:

@RestController
class ChatLanguageModelController {

ChatLanguageModel chatLanguageModel;

ChatLanguageModelController(ChatLanguageModel chatLanguageModel) {
this.chatLanguageModel = chatLanguageModel;
}

@GetMapping("/model")
public String model(@RequestParam(value = "message", defaultValue = "Hello") String message) {
return chatLanguageModel.chat(message);
}
}

使用 Azure 凭证创建 AzureOpenAiChatModel

API 密钥可能存在一些安全问题(可能被提交、传递等)。 如果您想提高安全性,建议使用 Azure 凭证。 为此,需要将 azure-identity 依赖项添加到项目中。

<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-identity</artifactId>
<scope>compile</scope>
</dependency>

然后,您可以使用 DefaultAzureCredentialBuilder API 创建 AzureOpenAiChatModel

ChatLanguageModel model = AzureOpenAiChatModel.builder()
.deploymentName("gpt-4o")
.endpoint(System.getenv("AZURE_OPENAI_URL"))
.tokenCredential(new DefaultAzureCredentialBuilder().build())
.build();
备注

请注意,您需要使用托管身份部署模型。查看 Azure CLI 部署脚本获取更多信息。

工具

工具,也称为"函数调用",允许模型调用 Java 代码中的方法,包括并行工具调用。 "函数调用"在 OpenAI 文档中有描述

备注

LangChain4j 中有关如何使用"函数调用"的完整教程在这里

函数可以使用 ToolSpecification 类指定,或者更简单地使用 @Tool 注解,如下例所示:

class StockPriceService {

private Logger log = Logger.getLogger(StockPriceService.class.getName());

@Tool("获取公司的股票价格,通过其股票代码")
public double getStockPrice(@P("公司股票代码") String ticker) {
log.info("获取 " + ticker + " 的股票价格");
if (Objects.equals(ticker, "MSFT")) {
return 400.0;
} else {
return 0.0;
}
}
}

然后,您可以在 AI Assistant 中使用 StockPriceService,如下所示:


interface Assistant {
String chat(String userMessage);
}

public class Demo {
String functionCalling(Model model) {
String question = "当前微软股票价格是否高于 450 美元?";
StockPriceService stockPriceService = new StockPriceService();

Assistant assistant = AiServices.builder(Assistant.class)
.chatLanguageModel(model)
.tools(stockPriceService)
.build();

String answer = assistant.chat(question);

model.addAttribute("answer", answer);
return "demo";
}
}

结构化输出

结构化输出确保模型的响应符合 JSON 模式。

备注

LangChain4j 中使用结构化输出的文档可在这里获取,下面的部分将提供 Azure OpenAI 特定的信息。

需要将模型配置为 strictJsonSchema 参数设置为 true,以强制遵守 JSON 模式:

ChatLanguageModel model = AzureOpenAiChatModel.builder()
.endpoint(System.getenv("AZURE_OPENAI_URL"))
.apiKey(System.getenv("AZURE_OPENAI_KEY"))
.deploymentName("gpt-4o")
.strictJsonSchema(true)
.supportedCapabilities(Set.of(RESPONSE_FORMAT_JSON_SCHEMA))
.build();
备注

如果 strictJsonSchema 设置为 false 并且您提供了 JSON 模式,模型仍会尝试生成符合该模式的响应,但如果响应不符合模式,它不会失败。这样做的一个原因是为了获得更好的性能。

然后,您可以将此模型与高级 Assistant API 或低级 ChatLanguageModel API 一起使用,如下所述。 当与高级 Assistant API 一起使用时,配置 supportedCapabilities(Set.of(RESPONSE_FORMAT_JSON_SCHEMA)) 以启用带有 JSON 模式的结构化输出。

使用高级 Assistant API

与前面部分中的工具类似,结构化输出可以自动与 AI Assistant 一起使用:


interface PersonAssistant {
Person extractPerson(String message);
}

class Person {
private final String name;
private final List<String> favouriteColors;

public Person(String name, List<String> favouriteColors) {
this.name = name;
this.favouriteColors = favouriteColors;
}

public String getName() {
return name;
}

public List<String> getFavouriteColors() {
return favouriteColors;
}
}

这个 Assistant 将确保响应符合与 Person 类对应的 JSON 模式,如下例所示:

String question = "Julien 喜欢蓝色、白色和红色";

PersonAssistant assistant = AiServices.builder(PersonAssistant.class)
.chatLanguageModel(chatLanguageModel)
.build();

Person person = assistant.extractPerson(question);

使用低级 ChatLanguageModel API

这个过程与高级 API 类似,但这次需要手动配置 JSON 模式,以及将 JSON 响应映射到 Java 对象。

一旦模型配置完成,必须在每个请求的 ChatRequest 对象中指定 JSON 模式。 然后,模型将生成符合该模式的响应,如下例所示:

ChatRequest chatRequest = ChatRequest.builder()
.messages(UserMessage.from("Julien 喜欢蓝色、白色和红色"))
.responseFormat(ResponseFormat.builder()
.type(JSON)
.jsonSchema(JsonSchema.builder()
.name("Person")
.rootElement(JsonObjectSchema.builder()
.addStringProperty("name")
.addProperty("favouriteColors", JsonArraySchema.builder()
.items(new JsonStringSchema())
.build())
.required("name", "favouriteColors")
.build())
.build())
.build())
.build();

String answer = chatLanguageModel.chat(chatRequest).aiMessage().text();

在此示例中,answer 将是:

{
"name": "Julien",
"favouriteColors": ["蓝色", "白色", "红色"]
}

然后,通常会使用 Jackson 等库将此 JSON 响应反序列化为 Java 对象。

创建 AzureOpenAiStreamingChatModel 以流式传输结果

此实现类似于上面的 AzureOpenAiChatModel,但它逐个令牌地流式传输响应。

纯 Java

StreamingChatLanguageModel model = AzureOpenAiStreamingChatModel.builder()
.endpoint(System.getenv("AZURE_OPENAI_URL"))
.apiKey(System.getenv("AZURE_OPENAI_KEY"))
.deploymentName("gpt-4o")
...
.build();

Spring Boot

application.properties 中添加:

langchain4j.azure-open-ai.streaming-chat-model.endpoint=${AZURE_OPENAI_URL}
langchain4j.azure-open-ai.streaming-chat-model.service-version=...
langchain4j.azure-open-ai.streaming-chat-model.api-key=${AZURE_OPENAI_KEY}
langchain4j.azure-open-ai.streaming-chat-model.deployment-name=gpt-4o
langchain4j.azure-open-ai.streaming-chat-model.max-tokens=...
langchain4j.azure-open-ai.streaming-chat-model.temperature=...
langchain4j.azure-open-ai.streaming-chat-model.top-p=...
langchain4j.azure-open-ai.streaming-chat-model.logit-bias=...
langchain4j.azure-open-ai.streaming-chat-model.user=...
langchain4j.azure-open-ai.streaming-chat-model.stop=...
langchain4j.azure-open-ai.streaming-chat-model.presence-penalty=...
langchain4j.azure-open-ai.streaming-chat-model.frequency-penalty=...
langchain4j.azure-open-ai.streaming-chat-model.seed=...
langchain4j.azure-open-ai.streaming-chat-model.timeout=...
langchain4j.azure-open-ai.streaming-chat-model.max-retries=...
langchain4j.azure-open-ai.streaming-chat-model.log-requests-and-responses=...
langchain4j.azure-open-ai.streaming-chat-model.user-agent-suffix=...
langchain4j.azure-open-ai.streaming-chat-model.customHeaders=...

示例