likes
comments
collection
share

国内利用Azure OpenAI在Java中使用ChatGPT和DALL-E模型

作者站长头像
站长
· 阅读数 19

在ChatGPT和各类生成式AI大热的今天,利用AI赋能产品开发和内容创作的价值不言而喻,在工作和生活中充分利用ChatGPT可以大幅提升效率。然而,由于在中国的访问限制,直接使用OpenAI的ChatGPT,对于希望利用这项技术的开发者和企业来说是一个巨大的挑战。本文将分享,在Java环境下通过Azure OpenAI使用GPT大模型进行开发,希望帮助大家推动项目创新和提效。

本文源代码:

AzureOpenAIServiceClient.java

开通Azure服务和订阅

首先你需要有一个微软账户,可以到任意微软服务网站上注册,比如:Microsoft Azure。注册的时候地区选择美国的话可以为后面使用必应Chat提供方便。

然后,访问Azure控制台开通Azure服务,并创建订阅,第一次注册的话会有一定的免费试用额度。接着访问Azure OpenAI Service了解微软提供的OpenAI模型的服务,并在你的Azure控制台上开通Azure OpenAI服务。可以阅读这篇文章Introducing GPT-4 in Azure OpenAI Service获取申请链接,填写表单 "Request Access to Azure OpenAI Service"进行对所需要的模型进行申请。

开通完成之后,你的Azure里就会多一个这样的图标了:

国内利用Azure OpenAI在Java中使用ChatGPT和DALL-E模型

随后,我们就可以在Azure AI studio中创建和管理模型Deployments:

国内利用Azure OpenAI在Java中使用ChatGPT和DALL-E模型

选择你的模型:

国内利用Azure OpenAI在Java中使用ChatGPT和DALL-E模型

创建成功后,我们就可以利用示例代码,在Java中通过Azure OpenAI的API请求完成使用Chat功能了。Azure AI Studio上还有很多好玩的功能,如果你申请了OpenAI的图片生成模型DALL·E的访问权限,那么这里还可以试用“DALL·E playground”来根据你的描述生成图片:

国内利用Azure OpenAI在Java中使用ChatGPT和DALL-E模型

除此之外,也可以在这里使用聊天功能和文本完成功能:

国内利用Azure OpenAI在Java中使用ChatGPT和DALL-E模型

通过代码调用服务

通过示例代码AzureOpenAIServiceClient.java我们可以了解到,实际上与Azure OpenAI服务进行通信的主要是通过向我们在Azure中注册服务中的endpoint发送HTTP请求,来完成的。在这段代码中,首先导入了必要的HTTP请求依赖库。然后定义了一个名为AzureOpenAIServiceClient的类,它维护了与Azure OpenAI服务通信所需的一些配置参数,包括:

  • API密钥(apiKey):可以在你的Azure控制台相应的OpenAI service页面找到。见下图。
  • 服务入口地址URL(endpoint):一般形如https://{你的AzureOpenAI服务名字}.openai.azure.com。可以在你的Overview页面看到。
  • 模型部署名(deployment):你之前起的模型名字。
  • API版本(apiVersion):目前的常用版本是2023-03-15-preview

国内利用Azure OpenAI在Java中使用ChatGPT和DALL-E模型

目前的核心功能,chatCompletion方法,接受一个ChatRequest对象和operation(这里其实就是chat/completions)作为参数,并调用callAzureAPI方法,将请求对象转换为JSON字符串,并发送到OpenAI RESTful API服务完成请求:

    private String callAzureAPI(String operation, String requestBodyString) {
        MediaType mediaType = MediaType.parse("application/json");
        String url = String.format("%s/openai/deployments/%s/%s?api-version=%s", endpoint, deployment, operation, apiVersion);

        logger.info("Request body: {}", requestBodyString);

        RequestBody body = RequestBody.create(requestBodyString, mediaType);
        Request httpRequest = new Request.Builder().url(url).post(body)
                .addHeader("api-key", apiKey).build();

        try (Response response = client.newCall(httpRequest).execute()) {
            if (!response.isSuccessful()) {
                throw new RuntimeException("Unexpected response code: " + response);
            }
            return Objects.requireNonNull(response.body()).string();
        } catch (Exception e) {
            throw new RuntimeException("Error occurred while invoking Azure OpenAI API: " + e.getMessage(), e);
        }
    }

其中,ChatRequest对象中的几个参数的含义解释如下:

Azure OpenAI HTTP请求中的几个参数的含义如下:

  • max_tokens: 生成文本的最大长度。
  • temperature: 生成文本的随机性,取值从0到1,较高的“温度”值意味着模型将冒更多的风险。0表示随机性最低,创造性最差。
  • frequency_penalty: 使用词频惩罚。较高的频率惩罚将阻止模型重复。
  • presence_penalty: 使用存在惩罚。较高的存在惩罚将鼓励模型专注于输入提示本身。
  • top_p: 从模型预测中选择概率最高的标记,直到达到指定的总概率。默认为1。也就是说,一旦该分布超过top_p值,就会停止生成文本。例如,top_p为0.3表示仅考虑组成前30%概率质量的标记。
  • stop: 停止生成文本,当模型生成某些指定字符时,就停止不在生成。默认为空。

代码使用示例

接下来,我们就可以写一个简单的用例,来试用该功能了,先让它讲个笑话。

    AzureOpenAIServiceClient azureOpenAIServiceClient =
            new AzureOpenAIServiceClient(apiKey, deployment, endpoint, apiVersion);
    ChatRequest request = new ChatRequest();
    request.setTemperature(0.9);
    request.setMessages(Arrays.asList(
            new ChatMessage(ChatMessage.Role.SYSTEM, "You are an AI assistant that helps people find fun and jokes, to make people laugh a lot."),
            new ChatMessage(ChatMessage.Role.USER, "tell me 3 jokes")
    ));
    logger.info(azureOpenAIServiceClient.chatCompletion(request));

完成一次尬聊,得到很难get到笑点的三则笑话:

{
    "id": "***",
    "object": "chat.completion",
    "created": 1680000000,
    "model": "gpt-35-turbo",
    "choices": [
        {
            "index": 0,
            "finish_reason": "stop",
            "message": {
                "role": "assistant",
                "content": "Sure, here are three jokes for you:\n\n1. Why don't scientists trust atoms? Because they make up everything!\n\n2. Why did the tomato turn red? Because it saw the salad dressing!\n\n3. Why did the bicycle fall over? Because it was two-tired!"
            }
        }
    ],
    "usage": {
        "completion_tokens": 14,
        "prompt_tokens": 37,
        "total_tokens": 51
    }
}

试用一下就可以发现,全程使用国内网络也可以正常调用,没有任何问题。

此外,代码中还提供了callAzureOpenAIImageAPI方法,向Azure OpenAI服务发送一个图像生成的API请求。请求包括描述、生成图像的数量和所需图像的尺寸,并从中获取生成图像的ID。接着,我们可以以这个id作为参数调用getGeneratedImageStatus方法,通过生成图像的ID向Azure OpenAI服务请求图像状态。一旦图像生成状态为"succeeded",我们就可以获取到图像生成信息URL了,详见代码AzureOpenAIServiceClientTest.java

后续

一旦将完成在Java一端的接入,我们就可以将其集成到各项和聊天、文档生成、数据推理分析等等相关的应用功能当中。如果你感兴趣,可以持续关注 微软HydraLab 项目,我们将在其中持续探索大语言模型赋能智能化测试的如下方向:

  • 智能日志和结果分析解读。
  • 智能探索型测试。
  • 测试用例生成和优化。
  • 基于测试结果的诊断建议。
  • ...

并在代码库中逐步分享一些相关场景prompt、向量模型和可复用代码。如果申请Azure OpenAI Service遇到问题,可以私信我联系。