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-4
、gpt-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 对象。