Java AI 實戰:本地模型JSON結構化輸出
在人工智能和機器學習領域,大語言模型(LLM)的應用日益廣泛。Ollama 作為一個強大的開源 LLM 工具,不僅可以進行自然語言對話,還能生成結構化的輸出數據。本文將詳細介紹如何使用 Ollama 生成 JSON 格式的輸出,并提供完整的 Java 實現方案。
注意:本文采用原生 HTTP 調用方式實現與 Ollama 的交互,不依賴任何第三方 SDK(如 Spring AI、LangChain4j 等)。這種方式可以讓你更好地理解底層實現原理,并且可以根據實際需求自由選擇是否使用其他 SDK。
為什么選擇結構化輸出?
在實際應用中,我們經常需要將 LLM 的輸出集成到現有的系統中。這時,結構化的輸出格式(如 JSON)就顯得尤為重要:
- 易于解析:JSON 是一種標準的數據交換格式,可以輕松地轉換為編程語言中的對象
- 結構清晰:相比于純文本輸出,JSON 的層次結構更加清晰
- 便于集成:可以輕松地集成到現有的系統和工作流程中
技術實現
1. 環境準備
首先,我們需要在本地環境中安裝并運行 Ollama。
macOS 安裝
# 使用 Homebrew 安裝
brew install ollama
Linux 安裝
# 使用官方腳本安裝
curl -fsSL https://ollama.com/install.sh | sh
啟動 Ollama 服務
安裝完成后,在終端運行:
# 啟動 Ollama 服務
ollama serve
拉取并運行模型
打開新的終端窗口,運行以下命令拉取通義千問2.5模型:
# 拉取通義千問2.5 32B參數量模型
ollama pull qwen2.5:32b
你可以通過以下命令測試模型是否正常工作:
# 測試模型
ollama run qwen2.5:32b "你好,請做個自我介紹"
驗證 API 服務
確保 Ollama API 服務正常運行:
# 測試 API 服務是否正常
curl http://localhost:11434/api/version
如果返回版本信息,說明服務已經準備就緒。
2. Java 代碼實現
我們將使用 Spring Boot 框架來實現一個簡單的示例。首先創建必要的 POJO 類:
@Data
@Builder
public class ChatMessage {
private String role;
private String content;
}
@Data
@Builder
public class ChatCompletionRequest {
private String model;
private List<ChatMessage> messages;
private String format;
}
@Data
public class ChatCompletionResponse {
private String model;
private String createdAt;
private ChatMessage message;
private String done;
}
接下來,實現調用 Ollama API 的服務類:
@Service
@Slf4j
public class ChatCompletionService {
private static final String API_ENDPOINT = "http://localhost:11434/api/chat";
private final RestTemplate restTemplate;
public ChatCompletionService(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
public String generateStructuredResponse(String prompt) {
ChatCompletionRequest request = ChatCompletionRequest.builder()
.model("qwen2.5:32b")
.messages(List.of(ChatMessage.builder()
.role("user")
.content(prompt)
.build()))
.format("json")
.build();
ResponseEntity<ChatCompletionResponse> response = restTemplate.postForEntity(
API_ENDPOINT,
request,
ChatCompletionResponse.class
);
return Optional.ofNullable(response.getBody())
.map(ChatCompletionResponse::getMessage)
.map(ChatMessage::getContent)
.orElse("");
}
}
實踐示例
讓我們通過一個具體的例子來說明如何使用這個系統。假設我們想要獲取一款車型的推薦信息:
String prompt = """
請生成問界M9車型的推薦信息,返回JSON格式,結構如下:
{
"model": string,
"brand": string,
"priceRange": string,
"powerType": string,
"scenarios": string[],
"advantages": string[],
"recommendation": {
"trim": string,
"color": string,
"options": string[]
}
}
""";
String response = chatCompletionService.generateStructuredResponse(prompt);
Ollama 會返回類似這樣的 JSON 響應:
{
"model": "問界M9",
"brand": "問界AITO",
"priceRange": "50-70萬元",
"powerType": "增程式混動",
"scenarios": [
"商務接待",
"家庭出行",
"長途旅行",
"城市通勤"
],
"advantages": [
"華為智能座艙",
"超大空間",
"豪華舒適",
"智能駕駛",
"低油耗"
],
"recommendation": {
"trim": "旗艦版",
"color": "星際銀",
"options": [
"全自動泊車輔助",
"行政座椅套件",
"全景天幕"
]
}
}
最佳實踐
在使用 Ollama 生成結構化輸出時,有以下幾點建議:
- 明確的提示詞:在提示詞中明確指定你期望的 JSON 結構,并指定format json
- 錯誤處理:添加適當的錯誤處理機制,因為 LLM 的輸出可能不總是完全符合預期
- 輸出驗證:使用 JSON Schema 驗證輸出的格式是否符合要求
- 性能優化:考慮添加緩存機制,避免重復請求相同的內容
結論
Ollama 的結構化輸出功能為我們提供了一種強大的方式來集成 AI 能力到現有系統中。通過使用 JSON 格式,我們可以更容易地處理和使用 AI 生成的內容。本文提供的 Java 實現方案可以作為一個起點,幫助你開始使用 Ollama 的結構化輸出功能。