本次交互的阿里的通义千问。一共两种方法。

第一种方法:

需要导入的包如下:

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dashscope-sdk-java</artifactId>
            <version>2.17.1</version>
        </dependency>
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.9.3</version> <!-- 或使用最新稳定版本 -->
        </dependency>

示范代码如下:

public void ChatModel() throws NoApiKeyException, InputRequiredException {
        Generation gen = new Generation();
        Message systemMsg = Message.builder()
                .role(Role.SYSTEM.getValue())
                .content("你是一个有用的小助手。")
                .build();
        Message userMsg = Message.builder()
                .role(Role.USER.getValue())
                .content("你是谁?")
                .build();
        GenerationParam param = GenerationParam.builder()
                .apiKey(apiKeyALibaba)
                .model("qwen-plus")
                .messages(Arrays.asList(systemMsg, userMsg))
                .build();
        GenerationResult call = gen.call(param);
        System.out.println("call="+call);
    }

上面那个我感觉可读性有点差,如果要想知道到底是如何运行的。不了解具体情况,实际上拿postman举例,就是下图:

只要你编辑好请求内容就可以了,然后大模型会回复信息的。

改成代码形式就是下图:

public static void main(String[] args) throws NoApiKeyException, InputRequiredException {
        chatUrl();
    }
    public static void chatUrl(){
        OkHttpClient client = new OkHttpClient();
        String jsonInputString = """
                {
                    "model": "qwen-plus",\s
                    "messages": [
                        {
                            "role": "system",
                            "content": "You are a helpful assistant."
                        },
                        {
                            "role": "user",\s
                            "content": "你是谁?"
                        }
                    ]
                }
                """;
        RequestBody body = RequestBody.create(jsonInputString, MediaType.parse("application/json; charset=utf-8;Authorization=sk-d33734bead8941ae978356e06aee590e"));
        Request request = new Request.Builder()
                .url("https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions") // 阿里的模型请求地址 URL
                .post(body)
                .addHeader("Content-Type", "application/json") // 设置请求头 Content-Type
                .addHeader("Authorization", "阿里的apiKey") // 添加授权头(例如 Bearer Token)
                .build();
        try (Response response = client.newCall(request).execute()) {
            System.out.println("回复: " + response.body().string());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

实际上非常简单,就是发送指定格式的信息给指定的网址,然后等待回复就可以了。

第二种就是不依靠阿里的包:

需要额外添加导入的包就是json的:

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.15.0</version> <!-- 使用最新版本 -->
        </dependency>

示范代码如下:

public static void main(String[] args) throws JsonProcessingException {
    Test01();
}
    public static void Test01() throws JsonProcessingException {
        Message systemMsg = Message.builder().role(Role.SYSTEM).content("You are a helpful assistant.").build();
        Message userMsg = Message.builder().role(Role.USER).content("你是谁?").build();
        Messages messages = Messages.builder().model("qwen-plus").messages(Arrays.asList(systemMsg, userMsg)).build();
        ObjectMapper objectMapper = new ObjectMapper();
        String s = objectMapper.writeValueAsString(messages);
        System.out.println("s="+s);
        OkHttpClient client = new OkHttpClient();
        RequestBody body = RequestBody.create(s, MediaType.parse("application/json; charset=utf-8;Authorization=sk-d33734bead8941ae978356e06aee590e"));
        Request request = new Request.Builder()
                .url("https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions") // 阿里的地址
                .post(body)
                .addHeader("Content-Type", "application/json") // 设置请求头 Content-Type
                .addHeader("Authorization", "阿里的apikey") // 添加授权头(例如 Bearer Token)
                .build();
        try (Response response = client.newCall(request).execute()) {
            System.out.println("回复: " + response.body().string());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

其中的Message和Messages以及Role都是我自己建的类,代码如下:

先说一下一些特点,就是我明明用了@data为什么还要搞get和set方法呢,这个是因为json格式化时报错,说没用get和set方法,所以需要。还有在Role那个枚举类中,get方法要@JsonValue是因为Jackson,

Jackson 默认将枚举的 name() 方法返回的值(即大写的常量名)作为 JSON 中的表示。如果您没有特别配置 Jackson,序列化过程就会使用这个名称。

@Data
@Builder // 支持构建器模式
@Accessors(fluent = true) // 支持流式访问
public class Message {
    private Role role;
    private String content;

    public Role getRole() {
        return role;
    }

    public void setRole(Role role) {
        this.role = role;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}
@Data
@Builder // 支持构建器模式
@Accessors(fluent = true) // 支持流式访问
public class Messages {
    private String model;
    private List<Message> messages;

    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }

    public List<Message> getMessages() {
        return messages;
    }

    public void setMessages(List<Message> messages) {
        this.messages = messages;
    }
}
public enum Role {
    SYSTEM("system"),
    USER("user"),
    ASSISTANT("assistant");
    // 字段
    private final String roleName;

    // 构造函数

    Role(String roleName) {
        this.roleName = roleName;
    }

    // Getter 方法
    @JsonValue
    public String getRoleName() {
        return roleName;
    }
}

结果如下:

大致就这样,调用openAI的也差不多。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐