Java中如何和大模型交互
先说一下一些特点,就是我明明用了@data为什么还要搞get和set方法呢,这个是因为json格式化时报错,说没用get和set方法,所以需要。方法返回的值(即大写的常量名)作为 JSON 中的表示。上面那个我感觉可读性有点差,如果要想知道到底是如何运行的。实际上非常简单,就是发送指定格式的信息给指定的网址,然后等待回复就可以了。只要你编辑好请求内容就可以了,然后大模型会回复信息的。本次交互的阿里
·
本次交互的阿里的通义千问。一共两种方法。
第一种方法:
需要导入的包如下:
<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的也差不多。
更多推荐


所有评论(0)