引言
随着人工智能技术的飞速发展,大语言模型(LLM)已经从前沿技术逐渐走向实际应用。作为Java开发者,如何将这些强大的AI能力集成到我们的企业级应用中,成为了一个值得深入探讨的话题。本文将为您介绍四种不同的方式,帮助您在Java生态系统中轻松玩转AI大模型
在现代软件开发中,AI大模型的应用越来越广泛。本文将介绍四种主流的接入方式,帮助您在Java项目中高效地调用AI大模型,并通过具体示例展示如何实现与阿里云Qwen3模型的交互。
四种接入方式:
SDK接入:利用官方提供的软件开发工具包(SDK),这是最直接且便捷的集成方式。
HTTP接入:通过REST API发送HTTP请求来调用模型,适用于需要高度自定义的情况。
Spring AI:基于Spring框架的AI扩展,简化了AI功能的集成过程。
LangChain4j:一个专注于构建LLM应用的Java框架,提供了丰富的组件和工具。
我们平台选择阿里云百炼平台使用阿里云Qwen3模型作为示例,因为它对Java生态有良好的支持,易于与现有Java框架集成,而且也是最近新出的模型,更方面都很不错
1.SDK接入
SDK通常是官方直接提供的集成方式
我们首先要根据官方文档安装SDK,我们可以去Maven中央仓库中查找版本号、
打开项目在pom.xml文件中,添加以下的依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dashscope-sdk-java</artifactId>
<!-- 请将 'the-latest-version' 替换为最新版本号:https://mvnrepository.com/artifact/com.alibaba/dashscope-sdk-java -->
<version>the-latest-version</version>
</dependency>
我们现在需要申请一个API的key,申请方式可阅读官方文档:大模型服务平台百炼控制台
示例代码
// 建议dashscope SDK的版本 >= 2.12.0
import java.util.Arrays;
import java.lang.System;
import com.alibaba.dashscope.aigc.generation.Generation;
import com.alibaba.dashscope.aigc.generation.GenerationParam;
import com.alibaba.dashscope.aigc.generation.GenerationResult;
import com.alibaba.dashscope.common.Message;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.utils.JsonUtils;
public class SdkAi {
private static final String API_KEY = "你的apiKey";
public static GenerationResult callWithMessage() throws ApiException, 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("你能用java给我写一个快排吗?")
.build();
GenerationParam param = GenerationParam.builder()
// 若没有配置环境变量,请用百炼API Key将下行替换为:.apiKey("sk-xxx")
.apiKey(API_KEY)
// 此处以qwen-plus为例,可按需更换模型名称。模型列表:https://help.aliyun.com/zh/model-studio/getting-started/models
.model("qwen-plus")
.messages(Arrays.asList(systemMsg, userMsg))
.resultFormat(GenerationParam.ResultFormat.MESSAGE)
.build();
return gen.call(param);
}
public static void main(String[] args) {
try {
GenerationResult result = callWithMessage();
System.out.println(JsonUtils.toJson(result));
} catch (ApiException | NoApiKeyException | InputRequiredException e) {
// 使用日志框架记录异常信息
System.err.println("调用生成服务时出错: " + e.getMessage());
}
System.exit(0);
}
}
输出示例
2.HTTP接入
有些编程语言对一些大模型平台不支持SDK,这个时候我们可以选择使用HTTP请求调用大模型
示例代码
package com.sun.hd;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
public class HTTPClient {
public static void main(String[] args) {
String apiKey = "你的apiKey";
// 构建请求URL
String url = "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions";
// 构建请求体
JSONObject requestBody = JSONUtil.createObj()
.set("model", "qwen-plus")
.set("messages", JSONUtil.createArray()
.set(JSONUtil.createObj()
.set("role", "system")
.set("content", "You are a helpful assistant."))
.set(JSONUtil.createObj()
.set("role", "user")
.set("content", "你是谁?")));
try {
// 发送POST请求
HttpResponse response = HttpRequest.post(url)
.header("Authorization", "Bearer " + apiKey)
.header("Content-Type", "application/json")
.body(requestBody.toString())
.execute();
// 输出响应结果
System.out.println("Status: " + response.getStatus());
System.out.println("Response: " + response.body());
// 解析并输出AI的回答内容
if (response.getStatus() == 200) {
String responseBody = response.body();
JSONObject jsonResponse = JSONUtil.parseObj(responseBody);
// 提取AI的回答
if (jsonResponse.containsKey("choices")) {
JSONObject choice = jsonResponse.getJSONArray("choices").getJSONObject(0);
JSONObject message = choice.getJSONObject("message");
String aiResponse = message.getStr("content");
System.out.println("AI回答的内容: " + aiResponse);
}
} else {
System.err.println("请求失败,状态码: " + response.getStatus());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出示例
3.SpringAI接入
1.引言
背景:简述 Spring 生态系统的发展历程,并引出 Spring AI作为其新成员的诞生
目的:解释 Spring AI 的主要目标,即简化 AI 功能与 Spring 应用的集成
2. Spring AI 的核心价值
简化 AI 集成
统一接口:Spring AI 提供了标准化的 API,使得开发者可以轻松地将不同的 AI 服务集成到 Spring 应用中
提高效率:通过封装复杂的 AI 操作,Spring AI 让开发者能够专注于业务逻辑,而不是底层技术细节
3. Spring AI 的关键特性
详细解析 Spring AI 的功能特性
3.1 跨 AI 供应商的可移植 API 支持
适用场景:适用于聊天、文本转图像和嵌入模型等场景
API 类型:支持同步和流式 API 选项
模型功能访问:可以访问特定于模型的功能
3.2 支持主流 AI 模型供应商
供应商列表:如 Anthropic、OpenAI、微软、亚马逊、谷歌和 Ollama 等
模型类型:包括聊天补全、嵌入、文本转图像、音频转录、文本转语音等
3.3 结构化输出
POJO 映射:将 AI 模型的输出映射到普通 Java 对象(POJO),便于数据处理
3.4 支持主流向量数据库
数据库列表:如 Apache Cassandra、Azure Cosmos DB、Elasticsearch、Milvus、PostgreSQL/PGVector 等
应用场景:适用于需要高效存储和检索向量数据的场景
3.5 跨向量存储供应商的可移植 API
SQL 元数据过滤 API:提供灵活的数据查询和过滤能力
3.6 工具/函数调用
客户端工具和函数:允许模型请求执行客户端工具和函数,实现更丰富的功能
3.7 可观测性
监控信息:提供与 AI 相关操作的监控信息,便于性能优化和问题排查
3.8 文档 ETL 框架
数据工程场景:适用于数据预处理和转换的场景
3.9 AI 模型评估工具
评估生成内容:帮助评估生成内容的质量并防范幻觉响应
3.10 Spring Boot 自动配置和启动器
简化集成:适用于 AI 模型和向量存储的快速集成
3.11 ChatClient API
流式 API:与 AI 聊天模型通信的流式 API,类似于 WebClient 和 RestClient API
3.12 Advisors API
封装生成式 AI 模式:转换发送至语言模型(LLM)和从语言模型返回的数据,提供跨模型的可移植性
3.13 支持聊天对话记忆和检索增强生成(RAG)
增强生成:通过记忆和检索机制,提升生成内容的相关性和准确性
依赖引入
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter</artifactId>
<version>1.0.0-M6.1</version>
</dependency>
示例代码
@Component
public class SpringAiClient implements CommandLineRunner {
@Resource
private DashScopeApi.ChatModel dashscopeChatModel;
@Override
public void run(String... args) throws Exception {
AssistantMessage output = dashscopeChatModel.call(new Prompt("你好啊,我是天天困"))
.getResult()
.getOutput();
System.out.println(output.getText());
}
}
注意使用SpringAI应该使用jdk17版本及以上SpringBoot3版本
4.LangChain4接入
LangChain4j 是 LangChain 的 Java 实现,旨在为 Java 开发者提供一个强大的工具集,用于构建复杂的 LLM 应用。它支持多种 LLM,并提供了丰富的 API 和工具,方便开发者进行模型调用、对话管理等操作
LangChain4主要功能
模型调用:轻松调用各种 LLM,获取模型的预测结果
对话管理:管理多轮对话,维护对话状态
工具集成:集成外部工具和 API,扩展 LLM 的功能
LangChain4j 与 Spring AI 的比较
LangChain4j 和 Spring AI 都是用于构建 AI 应用的框架,它们有以下相似之处:
目标一致:都致力于简化 AI 应用的开发。
功能丰富:都提供了丰富的工具和抽象层,方便开发者使用。
然而,它们也有一些差异:
语言不同:LangChain4j 是 Java 实现,而 Spring AI 是 Spring 生态的一部分。
模型支持:LangChain4j 支持更多的社区模型,而 Spring AI 更注重与 Spring 生态的集成。
它的官方是没有支持阿里系列的大模型,我们只能使用社区版本的整合模型
我们可以去阅读官网文档看看他支持集成的模型列表
官方提供了DashScope大模型的集成方法
引入依赖:
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-community-dashscope</artifactId>
<version>${latest version here}</version>
</dependency>
示例代码
public class LangChainAi {
private static final String API_KEY = "";
public static void main(String[] args) {
ChatLanguageModel qwenModel = QwenChatModel.builder()
.apiKey(API_KEY)
.modelName("qwen-max")
.build();
String result = qwenModel.chat("你好我是天天困");
System.out.println(result);
}
}
总结
这上述四种方式我自己是比较推荐实用Spring提供的,他是属于Spring生态,我们开发都离不开Spring的框架,而且他简单易上手,也可以实现一些复杂的功能开发