4、Spring AI_DeepSeek模型_結構化輸出

一、前言

Spring AI 提供跨 AI 供應商(如 OpenAI、Hugging Face 等)的一致性 API, 通過分裝的ChatModelChatClient即可輕松調動LLM進行流式或非流式對話。

本專欄主要圍繞著通過OpenAI兼容接口調用各種大語言模型展開學習(因為大部分模型都兼容OpenAI方式調用接口),本篇文章目標:探索Spring AI的結構化輸出,即將 LLM 的非結構化文本輸出轉換為結構化數據(如 Java 對象、Map、List 或 JSON)

二、轉化器Converter概述

2.1 核心作用

在調用 LLM 之前,轉換器將格式指令附加到提示中,為模型提供明確的指導,以生成所需的輸出結構。這些指令充當藍圖,塑造模型的響應以符合指定的格式。

在 LLM 調用后,轉換器將模型的輸出文本轉換為結構化類型的實例。此轉換過程涉及解析原始文本輸出并將其映射到相應的結構化數據表示形式,例如 JSON、XML 或特定領域的數據結構。

2.2 數據流向

PS : 轉換器有點類似Java中的AOP(攔截器)的作用,在調用LLM前注入結構化指令,在調用LLM后將非結構化文本后轉換成指定的結構化輸出!

2.3 三大核心轉換器對比

Spring AI通過三大核心轉換器實現將LLM的響應響應轉成特定的結構化輸出!

三、代碼

3.1 項目依賴

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.better</groupId><artifactId>spring-ai-parent</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><modules><module>models/chat/chat-openai-deepseek</module></modules><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.4.5</version><relativePath/></parent><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-openai</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.57</version></dependency></dependencies><!--Spring AI模塊的依賴版本管理--><dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><!--正式生產版本:1.0.0 GA(2025年5月20日發布)是首個穩定且支持生產環境的版本,ChatClient 成為官方推薦的核心 API--><version>1.0.0</version> <!-- GA 版本 --><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement></project>

3.2 配置yml

server:port: 8321
spring:ai:openai:base-url: https://api.deepseek.comapi-key: ${OPENAI_API_KEY}chat:options:model: deepseek-chat  # 可選模型:deepseek-chat/deepseek-reasonertemperature: 0.6      # 響應隨機性控制,默認值

3.3 Bean對象轉換器

    @GetMapping("/chat/bean")BookInfo chatBeanOutput(String author) {var userPromptTemplate = """告訴我作者{author}最有名的書名.""";BookInfo bookInfo = chatClient.prompt().user(userSpec -> userSpec.text(userPromptTemplate).param("author", author)).call().entity(BookInfo.class);log.info("LLM響應結果:{}", JSONObject.toJSONString(bookInfo));return bookInfo;}

執行結果:

3.4 Map轉換器

    @GetMapping("/chat/map")Map<String,Object> chatMapOutput() {Map<String, Object> result = chatClient.prompt().user(u -> u.text("Provide me a List of {subject}").param("subject", "an array of numbers from 1 to 9 under they key name 'numbers'")).call().entity(new ParameterizedTypeReference<Map<String, Object>>() {});log.info("LLM響應結果:{}", JSONObject.toJSONString(result));return result;}

執行結果:

3.5 List轉換器

    @GetMapping("/chat/list")List<String> chatListOutput() {List<String> flavors = chatClient.prompt().user(u -> u.text("List five {subject}").param("subject", "李笑來寫的書")).call().entity(new ListOutputConverter(new DefaultConversionService()));log.info("LLM響應結果:{}", JSONObject.toJSONString(flavors));return flavors;}

執行結果:

3.6 完整代碼

package com.better.springai.structured_output;import com.alibaba.fastjson2.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.converter.ListOutputConverter;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;
import java.util.Map;/*** 高級封裝ChatClient*/
@RestController
@Slf4j
class StructuredOutputController {private final ChatClient chatClient;StructuredOutputController(ChatClient.Builder chatClientBuilder) {this.chatClient = chatClientBuilder.build();}/*** 結構化輸出-轉成Bean對象* @param author* return com.better.springai.structured_output.BookInfo* @author luchuyan* @time 2025/7/23 8:33**/@GetMapping("/chat/bean")BookInfo chatBeanOutput(String author) {var userPromptTemplate = """告訴我作者{author}最有名的書名.""";BookInfo bookInfo = chatClient.prompt().user(userSpec -> userSpec.text(userPromptTemplate).param("author", author)).call().entity(BookInfo.class);log.info("LLM響應結果:{}", JSONObject.toJSONString(bookInfo));return bookInfo;}/*** 結構化輸出-轉成Map* return java.util.Map<java.lang.String,java.lang.Object>* @author luchuyan* @time 2025/7/23 8:34**/@GetMapping("/chat/map")Map<String,Object> chatMapOutput() {Map<String, Object> result = chatClient.prompt().user(u -> u.text("Provide me a List of {subject}").param("subject", "an array of numbers from 1 to 9 under they key name 'numbers'")).call().entity(new ParameterizedTypeReference<Map<String, Object>>() {});log.info("LLM響應結果:{}", JSONObject.toJSONString(result));return result;}/*** 結構化輸出-轉成List* return java.util.List<java.lang.String>* @author luchuyan* @time 2025/7/23 8:34**/@GetMapping("/chat/list")List<String> chatListOutput() {List<String> flavors = chatClient.prompt().user(u -> u.text("List five {subject}").param("subject", "李笑來寫的書")).call().entity(new ListOutputConverter(new DefaultConversionService()));log.info("LLM響應結果:{}", JSONObject.toJSONString(flavors));return flavors;}}

3.7 一定能結構化輸出嗎?

能不能轉成指定的結構化輸出主要還要看LLM的能力,如調用DeepSeek的推理模型一般就比調用非推理模型的效果好些,較大參數的模型比較少的好些 (如Qwen32B比Qwen7B好些~)。

在我們的業務中調用本地部署的Qwen2-7B模型,盡管在Prompt中要求模型按JSON結構化輸出,但往往不能如期所愿(非完整JSON格式導致解析時異常,如缺少了花括弧、帶了一些特殊字符等),我們的一個解決方案是再調一次騰訊元的混元模型進行修復,通過混元模型基本都能修復成正常的JSON!

四、參考資料

4.1 Spring AI官網文檔

  • Structured Output Converter :: Spring AI Reference

最后:如果文章對你有幫助,別忘了點贊支持一下,謝謝~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/90578.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90578.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90578.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Data Redis 從入門到精通:原理與實戰指南

一、Redis 基礎概念 Redis&#xff08;Remote Dictionary Server&#xff09;是開源的內存鍵值對數據庫&#xff0c;以高性能著稱。它支持多種數據結構&#xff08;String、Hash、List、Set、ZSet&#xff09;&#xff0c;并提供持久化機制&#xff08;RDB、AOF&#xff09;。 …

免費版酒店押金原路退回系統——仙盟創夢IDE

項目介紹?東方仙盟開源酒店押金管理系統是一款面向中小型酒店、民宿、客棧的輕量級前臺管理工具&#xff0c;專注于簡化房態管理、訂單處理和押金跟蹤流程。作為完全開源的解決方案&#xff0c;它無需依賴任何第三方服務&#xff0c;所有數據存儲在本地瀏覽器中&#xff0c;確…

10. isaacsim4.2教程-RTX Lidar 傳感器

1. 前言RTX Lidar 傳感器Isaac Sim的RTX或光線追蹤Lidar支持通過JSON配置文件設置固態和旋轉Lidar配置。每個RTX傳感器必須附加到自己的視口或渲染產品&#xff0c;以確保正確模擬。重要提示&#xff1a; 在運行RTX Lidar仿真時&#xff0c;如果你在Isaac Sim UI中停靠窗口&…

QT6 源,七章對話框與多窗體(14)棧式窗體 QStackedWidget:本類里代碼很少。舉例,以及源代碼帶注釋。

&#xff08;1&#xff09;這不是本章節要用到的窗體組件&#xff0c;只是跟著標簽窗體 QTabWidget 一起學了。這也是 QT 的 UI 界面里的最后幾個容器了。而且本類也很簡單。就了解一下它。 本類的繼承關系如下 &#xff1a; UI 設計界面 &#xff1a;運行效果 &#xff1a;&…

魔百和M401H_國科GK6323V100C_安卓9_不分地區免拆卡刷固件包

魔百和M401H_國科GK6323V100C_安卓9_不分地區免拆卡刷固件包刷機說明&#xff1a;1&#xff0c;進機頂盒設置&#xff08;密碼10086&#xff09;&#xff0c;在其他里&#xff0c;一直按左鍵約32下&#xff0c;打開調試模式2&#xff0c;進網絡設置&#xff0c;查看IP地址。3&a…

MySQL基礎02

一. 函數在 MySQL 中&#xff0c;函數是用于對數據進行特定處理或計算的工具&#xff0c;根據作用范圍和返回結果的不同&#xff0c;主要分為單行函數和聚合函數&#xff08;又稱分組函數&#xff09;。以下是詳細介紹&#xff1a;1.單行函數單行函數對每一行數據單獨處理&…

LabVIEW 視覺檢測SIM卡槽

針對SIM 卡槽生產中人工檢測效率低、漏檢誤檢率高的問題&#xff0c;設計了基于 LabVIEW 機器視覺的缺陷檢測系統。該系統通過光學采集與圖像處理算法&#xff0c;實現對卡槽引腳折彎、變形、漏銅等缺陷的自動檢測&#xff0c;誤報率為 0&#xff0c;平均檢測時間小于 750ms&am…

RocketMQ5.3.1的安裝

1、下載安裝 RocketMQ 的安裝包分為兩種&#xff0c;二進制包和源碼包。1 下載 Apache RocketMQ 5.3.1的源碼包后上傳到linux https://dist.apache.org/repos/dist/release/rocketmq/5.3.1/rocketmq-all-5.3.1-source-release.zip2 解壓編譯 $ unzip rocketmq-all-5.3.1-source…

FunASR實時多人對話語音識別、分析、端點檢測

核心功能&#xff1a;FunASR是一個基礎語音識別工具包&#xff0c;提供多種功能&#xff0c;包括語音識別&#xff08;ASR&#xff09;、語音端點檢測&#xff08;VAD&#xff09;、標點恢復、語言模型、說話人驗證、說話人分離和多人對話語音識別等。FunASR提供了便捷的腳本和…

opencv--day01--opencv基礎知識及基礎操作

文章目錄前言一、opencv基礎知識1.opencv相關概念1.1背景1.2特點1.3主要功能與應用1.4.opencv-python2.計算機中的圖像概念2.1圖像表示2.2圖像存儲彩色圖像二、opencv基礎操作1.圖像的讀取2.圖像的顯示3.保存圖像4.創建黑白圖及隨機像素彩圖5. 圖像切片&#xff08;圖片剪裁&am…

如何撤銷Git提交誤操作

要撤銷在主分支上的 git add . 和 git commit 操作&#xff0c;可以按照以下步驟安全回退&#xff1a; 完整回退步驟&#xff1a; # 1. 查看提交歷史&#xff0c;確認要回退的commit git log --oneline# 示例輸出&#xff1a; # d3f4g7h (HEAD -> main) 誤操作提交 # a1b2c3…

React+Three.js實現3D場景壓力/溫度/密度分布可視化

本文介紹了一個基于React和Three.js的3D壓力可視化解決方案&#xff0c;該方案能夠&#xff1a; 加載并渲染3D壓力模型數據 提供動態顏色映射功能&#xff0c;支持多種顏色方案&#xff1a;彩虹-rainbow,冷暖-cooltowarm,黑體-blackbody,灰度-grayscale 實現固定位置的顏色圖…

Go 官方 Elasticsearch 客戶端 v9 快速上手與進階實踐*

1、為什么選擇 go-elasticsearch&#xff1f; 版本同步&#xff1a;與 Elasticsearch 主版本保持一一映射&#xff0c;當前穩定分支為 v9&#xff0c;對應 ES 9.x 系列。(GitHub)完全覆蓋 REST API&#xff1a;所有 HTTP 端點都有等價方法&#xff0c;避免手寫 JSON/HTTP。可插…

`/etc/samba/smb.conf`筆記250720

/etc/samba/smb.conf筆記250720 /etc/samba/smb.conf 是 Samba 服務的核心配置文件&#xff0c;用于實現 Linux/Unix 與 Windows 系統間的文件和打印機共享。以下詳解其結構和常用參數&#xff1a; 配置文件結構 1. 全局設置段 [global] 控制 Samba 服務器的整體行為。 …

Java從入門到精通!第十六天,重點!(多線程和線程池)

一、多線程1&#xff0e;基本概念&#xff08;1&#xff09;程序&#xff08;Program&#xff09;&#xff1a;為了完成特定的任務&#xff0c;用某種計算機語言編寫的一組指令的集合&#xff0c;即指一段靜態的代碼&#xff08;源代碼經編譯之后形成的二進制格式的文件&#x…

軌道交通為什么要有信號系統?

軌道交通為什么要有信號系統&#xff1f;軌道交通信號系統與公路信號系統有什么不同&#xff1f; 在軌道交通中信號系統是必不可少的&#xff0c;其根本原因在于&#xff1a;在軌道交通中已經沒有辦法純靠人力去保證行車安全。 在公路交通中&#xff0c;信號其實是起輔助作用的…

docker 掛載卷

以下是針對您遇到的問題分步解答和解決方案&#xff1a;一、核心結論 ? 可以采用目錄方式&#xff1a;您的命令中的 -v /root/nginx05-vol/:/usr/share/nginx/html/ 是正確的目錄掛載語法。 ? 看不到新文件的可能原因主要集中在 權限問題、緩存機制 或 操作順序錯誤 上。二、…

uniapp 報錯 Not found ... at view.umd.min.js:1的問題

問題描述&#xff1a; uniapp的app中&#xff0c;當頁面中使用多個v-if后會出現這個報錯解決方案&#xff1a; 1、在v-if的地方加上key屬性&#xff08;key屬性要保證唯一&#xff09; 2、用v-show替換v-if&#xff08;不建議&#xff0c;可能會影響業務&#xff09;

水電站自動化升級:Modbus TCP與DeviceNet的跨協議協同應用

水電站的自動化系統就像一個精密的“神經中樞”&#xff0c;既要應對水流變化帶來的動態負載&#xff0c;又得保證閘門啟閉、水輪機調節等關鍵動作的精準性。我們去年參與的某水電站改造項目里&#xff0c;就遇到了一個典型問題&#xff1a;中控室的施耐德PLC采用Modbus TCP協議…

基于Matlab圖像處理的火災檢測系統設計與實現

隨著計算機視覺技術的快速發展&#xff0c;基于圖像處理的火災檢測系統在安全監控領域的應用得到了廣泛關注。本文提出了一種基于圖像處理的火災檢測系統&#xff0c;該系統通過對圖像進行預處理、顏色空間轉換、閾值化處理和形態學分析&#xff0c;自動檢測火災疑似區域。首先…