Java大模型集成攻略
本文將介紹在 Java 項目中集成各種大模型的方法,并以阿里巴巴 DashScope SDK 為例進行重點講解。項目環境:SpringBoot 3.4.4,JDK 21,Maven 3.8.4。
SDK 接入
SDK(軟件開發工具包)是官方提供的集成工具,通常包含完善的類型定義和錯誤處理機制,讓集成更便捷。
下面以阿里巴巴 DashScope SDK 為例,演示如何在 Java 項目中集成。
1. 安裝 DashScope SDK
? 首先,參考官方文檔安裝 SDK:安裝 SDK 官方指南
? 選擇 SDK 版本時,建議前往 Maven 中央倉庫確認最新版本號:Maven中央倉庫版本信息
? 在項目的 pom.xml 文件中添加以下依賴:
<!-- https://mvnrepository.com/artifact/com.alibaba/dashscope-sdk-java -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dashscope-sdk-java</artifactId>
<version>2.19.1</version>
</dependency>
2. 在阿里云百煉平臺申請 API Key。請務必妥善保管,防止泄露:
https://bailian.console.aliyun.com/?tab=app#/app-center
圖片
3. 在項目中創建一個名為 demo.invoke 的包,用于存放調用大模型的示例代碼。
詳細代碼示例請參考官方文檔:通過 API 調用通義千問,如下圖所示:
圖片
為了安全地管理 API 密鑰,可以創建一個接口來存儲它。注意:在生產環境中,強烈建議使用配置文件或環境變量管理 API Key,避免將其硬編碼到代碼中。
public interface TestApiKey {
// 請將下方的 "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 替換為您的真實有效 API Key
String API_KEY = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
}
以下是使用 SDK 調用模型的完整 Java 示例代碼:
// 建議 DashScope SDK 版本 >= 2.12.0
// 導入所需的Java標準庫類
import java.util.Arrays;
import java.lang.System;
// 導入阿里云靈積 DashScope SDK 相關類
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;
/**
* 阿里云靈積 AI SDK 調用示例。
* <p>
* 本類演示了如何使用 DashScope SDK 調用阿里云靈積大模型進行對話,
* 包括消息構建、參數設置、API 調用及異常處理。
*/
public class SdkAiInvoke {
/**
* 調用阿里云靈積大模型生成接口,傳入對話消息,并返回生成結果。
*
* @return GenerationResult 生成結果對象,包含模型回復等信息。
* @throws ApiException API 調用異常。
* @throws NoApiKeyException 未配置 API Key 異常。
* @throws InputRequiredException 輸入參數缺失異常。
*/
public static GenerationResult callWithMessage() throws ApiException, NoApiKeyException, InputRequiredException {
// 創建 Generation 實例,用于發起生成請求
Generation gen = new Generation();
// 構建系統消息,設定 AI 助手的角色和行為
// Role.SYSTEM 代表系統角色,用于設定 AI 的行為或身份。
// content 字段為系統提示內容,用以指導 AI 如何回復。
Message systemMsg = Message.builder()
.role(Role.SYSTEM.getValue())
.content("You are a helpful assistant.")
.build();
// 構建用戶消息,模擬用戶輸入
// Role.USER 代表用戶角色,content 字段為用戶輸入內容。
Message userMsg = Message.builder()
.role(Role.USER.getValue())
.content("你是誰?")
.build();
// 構建生成參數,包括 API Key、模型名稱、消息列表、返回格式等
// GenerationParam 用于封裝所有請求參數。
GenerationParam param = GenerationParam.builder()
// 設置 API Key。TestApiKey.API_KEY 從接口獲取。
// 生產環境建議通過環境變量配置,或直接使用 .apiKey("sk-您的真實APIKey") 替換此行。
.apiKey(TestApiKey.API_KEY)
// 此處以qwen-plus為例,可按需更換模型名稱。模型列表:https://help.aliyun.com/zh/model-studio/getting-started/models
.model("qwen-plus")
// .messages() 傳入對話消息列表,通常順序為系統消息、用戶消息。
.messages(Arrays.asList(systemMsg, userMsg))
// .resultFormat() 設置返回結果的格式為消息格式。
.resultFormat(GenerationParam.ResultFormat.MESSAGE)
.build();
// 調用生成接口,獲取模型回復
// gen.call(param) 方法向阿里云靈積大模型服務發起請求。
// 返回 GenerationResult 對象,其中包含模型回復、Token 用量等信息。
return gen.call(param);
}
/**
* 主方法,程序入口。
*
* @param args 命令行參數
*/
public static void main(String[] args) {
try {
// 調用 callWithMessage() 方法,獲取 AI 回復結果。
// GenerationResult 對象中包含了模型回復內容、Token 用量等詳細信息。
GenerationResult result = callWithMessage();
// 將結果對象轉為 JSON 字符串并打印
// JsonUtils.toJson(result) 方法將 Java 對象序列化為 JSON 字符串,方便查看完整的響應結構。
System.out.println(JsonUtils.toJson(result));
// 示例輸出結構如下(已注釋):
// {
// "requestId": "...", // 請求唯一標識
// "usage": {
// "input_tokens": ..., // 輸入token數
// "output_tokens": ..., // 輸出token數
// "total_tokens": ... // 總token數
// },
// "output": {
// "choices": [
// {
// "finish_reason": "stop", // 結束原因
// "message": {
// "role": "assistant", // 回復角色
// "content": "..." // AI回復內容
// }
// }
// ]
// }
// }
} catch (ApiException | NoApiKeyException | InputRequiredException e) {
// 捕獲并處理調用生成服務時可能發生的異常。
// ApiException:API 調用異常,可能由網絡問題、服務端錯誤等引起。
// NoApiKeyException:未配置 API Key 時拋出的異常。
// InputRequiredException:必要輸入參數缺失時拋出的異常。
// 此處直接打印到標準錯誤輸出。在實際項目中,建議使用日志框架記錄異常,以便追蹤和排查問題。
System.err.println("調用生成服務時發生錯誤: " + e.getMessage());
}
// 程序執行完畢,正常退出。
System.exit(0);
}
}
4. 運行項目后,可以看到 AI 的回復:
圖片
HTTP 接入
如果 SDK 不支持您的編程語言,或者您需要更靈活地控制請求,可以直接通過 HTTP 請求調用 AI 大模型的 API。
?? 建議:如果官方提供了 SDK,優先使用 SDK。僅當 SDK 不支持或不適用時,才考慮直接通過 HTTP 調用。
HTTP 調用的詳細說明請參考官方文檔:通過 API 調用通義千問
圖片
您可以讓 AI 將上述 CURL 命令轉換為使用 Java Hutool 工具類的網絡請求代碼。示例 Prompt 如下:
將上述請求轉換為 Hutool 工具類的請求代碼
圖片
AI 生成的代碼如下(可根據實際需求調整):
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
/**
* 本類演示了如何通過 HTTP 請求調用阿里云通義千問大模型接口進行文本生成,
* 并使用 Hutool 工具庫簡化 HTTP 請求和 JSON 構建。
*/
public class HttpAiInvoke {
public static void main(String[] args) {
// 定義接口請求的 URL,替換為實際的 API 地址
String url = "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation";
// 創建請求頭的 Map,用于存放 HTTP 請求頭信息
Map<String, String> headers = new HashMap<>();
// 設置 Authorization 頭,使用 Bearer 方式攜帶 API 密鑰
headers.put("Authorization", "Bearer " + TestApiKey.API_KEY);
// 設置 Content-Type 頭,指定請求體為 JSON 格式
headers.put("Content-Type", "application/json");
// 構建請求體的 JSON 對象
JSONObject requestBody = new JSONObject();
// 指定使用的模型名稱
requestBody.put("model", "qwen-plus");
// 創建 input 字段的 JSON 對象
JSONObject input = new JSONObject();
// 創建消息數組,包含 system 和 user 兩種角色的消息
JSONObject[] messages = new JSONObject[2];
// 構建 system 消息,指定 AI 助手的身份和行為
JSONObject systemMessage = new JSONObject();
systemMessage.put("role", "system");
systemMessage.put("content", "You are a helpful assistant.");
messages[0] = systemMessage;
// 構建 user 消息,指定用戶輸入的內容
JSONObject userMessage = new JSONObject();
userMessage.put("role", "user");
userMessage.put("content", "你是誰?");
messages[1] = userMessage;
// 將消息數組放入 input 對象
input.put("messages", messages);
// 將 input 對象放入請求體
requestBody.put("input", input);
// 構建參數對象,設置返回結果格式為 message
JSONObject parameters = new JSONObject();
parameters.put("result_format", "message");
// 將參數對象放入請求體
requestBody.put("parameters", parameters);
// 發送 HTTP POST 請求,攜帶請求頭和請求體
HttpResponse response = HttpRequest.post(url)
.addHeaders(headers)
.body(requestBody.toString())
.execute();
// 判斷響應是否成功
if (response.isOk()) {
// 請求成功時輸出響應內容
System.out.println("請求成功,響應內容:");
System.out.println(response.body());
} else {
// 請求失敗時輸出狀態碼和響應內容
System.out.println("請求失敗,狀態碼:" + response.getStatus());
System.out.println("響應內容:" + response.body());
}
}
}
SpringAI 接入
關于 Spring AI 的基礎知識,可以參考我之前的文章:Spring AI 搭建本地 AI。
Spring AI 默認并不支持所有大模型(特別是國產模型),它主要支持與 OpenAI API 兼容的大模型集成(詳見官方模型對比)。因此,要調用阿里系大模型(如通義千問),推薦使用阿里封裝的 Spring AI Alibaba 框架。該框架能便捷地集成阿里系大模型,并與標準 Spring AI 兼容。
您可以參考以下官方文檔來完成大模型的調用流程:
? 靈積模型接入指南
? 通義千問接入指南
1. 引入依賴:
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter</artifactId>
<version>1.0.0-M6.1</version>
</dependency>
官方提示:由于部分 spring-ai 相關依賴包尚未發布到 Maven 中央倉庫,如果遇到 spring-ai-core 等依賴解析問題,請在項目的 pom.xml 文件的 <repositories> 配置中添加以下倉庫:
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
2. 編寫配置:
spring:
application:
name: spring-ai-alibaba-qwq-chat-client-example
ai:
dashscope:
# 請替換為您的 API Key 或通過環境變量設置
api-key: ${AI_DASHSCOPE_API_KEY}
chat:
options:
model: qwen-plus
3. 編寫示例代碼 (注意注入 dashscopeChatModel):
import jakarta.annotation.Resource;
import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component; // 確保導入 Component 注解
@Component // 將此類聲明為 Spring 組件
public class SpringAiAiInvoke implements CommandLineRunner {
/**
* 注入 ChatModel 實例,代表一個可用的 AI 聊天模型。
* 通過 @Resource 注解自動裝配,bean 名稱為 dashscopeChatModel。
*/
@Resource
private ChatModel dashscopeChatModel;
/**
* 應用啟動時自動調用的方法。
* 該方法向 AI 聊天模型發送問候語,并打印 AI 的回復。
*
* @param args 啟動參數
* @throws Exception 可能拋出的異常
*/
@Override
public void run(String... args) throws Exception {
// 創建一個新的 Prompt 實例,內容為“你好,我是 NEO”
Prompt prompt = new Prompt("你好,我是 NEO");
// 調用 dashscopeChatModel 的 call 方法,傳入 prompt,獲取 AI 回復
AssistantMessage assistantMessage = dashscopeChatModel.call(prompt)
.getResult() // 獲取調用結果對象
.getOutput(); // 獲取 AI 輸出的消息對象
// 打印 AI 助手的回復文本到控制臺
System.out.println("Assistant Response: " + assistantMessage.getText());
}
}
上述代碼實現了 CommandLineRunner 接口。啟動 Spring Boot 項目時,會自動注入大模型 ChatModel 依賴,并執行一次該類的 run 方法,用于測試。
圖片
?? 上述代碼通過 ChatModel 對象調用大模型,適合簡單對話場景。Spring AI 還提供了 ChatClient 調用方式,支持會話記憶等高級功能,更適合復雜場景,后續會有詳細介紹。
LangChain4j
與 Spring AI 類似,LangChain4j 是一個用于構建基于大語言模型(LLM)應用的 Java 框架。作為知名 AI 框架 LangChain 的 Java 版,它提供了豐富的工具和抽象,簡化了與 LLM 的交互及應用開發。
LangChain 官方目前未直接支持阿里系大模型,但可以使用社區版整合的大模型包。
圖片
支持的模型列表可在其官方文檔中查詢:LangChain4j模型集成
要接入阿里云靈積模型,可參考官方文檔:DashScope模型集成,其中包含依賴和示例代碼。
1. 引入依賴:
<!-- https://mvnrepository.com/artifact/dev.langchain4j/langchain4j-community-dashscope -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-community-dashscope</artifactId>
<version>1.0.0-beta2</version> <!-- 請檢查并使用最新穩定版 -->
</dependency>
值得注意的是,LangChain4j 也提供了 Spring Boot Starter,方便在 Spring 項目中使用(最新版本號可在 Maven 中央倉庫查詢)。本示例僅為演示,且已引入 Spring AI Starter,故不再引入 LangChain Starter,以避免潛在沖突。
2. 編寫示例代碼:參考官方文檔創建一個 ChatModel 并調用,其用法與 Spring AI 類似。
import dev.langchain4j.community.model.dashscope.QwenChatModel;
public class LangChainAiInvoke {
/**
* 程序主入口。
* 運行后會向 Qwen Max 模型發送消息,并輸出模型回復。
*
* @param args 命令行參數(本示例未使用)
*/
public static void main(String[] args) {
// 創建 QwenChatModel 的構建器,用于配置模型參數
QwenChatModel qwenChatModel = QwenChatModel.builder()
// 設置 API Key,用于身份認證,必須替換為你自己的有效 Key
.apiKey(TestApiKey.API_KEY) // 確保 TestApiKey.API_KEY 已正確配置
// 指定要使用的模型名稱,這里選擇 "qwen-max"
.modelName("qwen-max") // 可根據需求選擇其他模型,如 qwen-plus, qwen-turbo 等
// 構建出 QwenChatModel 實例,后續可以用它與大模型對話
.build();
// 向 Qwen Max 發送一條消息,chat 方法會返回模型的回復內容
String response = qwenChatModel.chat("你好,Qwen Max!請問你能幫我做什么?");
// 將模型的回答輸出到控制臺,方便查看結果
System.out.println("Qwen Max的回答: " + response);
}
}
最后,直接運行 main 方法即可測試。
接入方式對比
以下是四種 AI 大模型接入方式的優缺點對比:
接入方式 | 優點 | 缺點 | 適用場景 |
SDK 接入 | ? 類型安全,編譯時檢查 | ? 依賴特定版本 | ? 需要深度集成 |
HTTP 接入 | ? 無編程語言限制 | ? 需手動處理錯誤 | ? SDK 不支持的編程語言 |
Spring AI | ? 統一的抽象接口 | ? 存在額外抽象層 | ? Spring 應用 |
LangChain4j | ? 提供完整的 AI 應用工具鏈 | ? 學習曲線較陡峭 | ? 構建復雜 AI 應用 |
個人推薦優先考慮 Spring AI。它屬于主流的 Spring 生態,簡單易學,社區資源豐富,能滿足大多數 AI 項目的開發需求。掌握一個 AI 開發框架后,學習其他類似框架也會更容易。