Spring AI 結構化輸出詳解

一、Spring AI 結構化輸出的定義與核心概念

Spring AI 提供了一種強大的功能,允許開發者將大型語言模型(LLM)的輸出從字符串轉換為結構化格式,如 JSON、XML 或 Java 對象。這種結構化輸出能力對于依賴可靠解析輸出值的下游應用程序至關重要。

通過 Spring AI 的結構化輸出轉換器,開發者可以快速將 AI 模型的結果轉換為可以傳遞給其他應用程序函數和方法的數據類型。轉換器在 LLM 調用之前將期望的輸出格式附加到 prompt 中,為模型提供生成所需輸出結構的明確指導。在 LLM 調用之后,轉換器獲取模型的輸出文本并將其轉換為結構化類型的實例。
在這里插入圖片描述

二、結構化輸出的技術原理

結構化輸出的技術原理可以分為以下幾個關鍵步驟:

  1. 附加格式說明
    在 LLM 調用之前,轉換器會將期望的輸出格式(output format instruction)附加到 prompt 中。這些指令充當藍圖,塑造模型的響應以符合指定的格式。例如:

    Your response should be in JSON format.
    The data structure for the JSON should match this Java class: java.util.HashMap
    Do not include any explanations, only provide a RFC8259 compliant JSON response following this format without deviation.
    
  2. 模型生成響應
    LLM 根據 prompt 中的格式說明生成符合要求的輸出。

  3. 解析與轉換
    轉換器獲取模型的輸出文本,并將其解析為結構化類型的實例。此過程涉及將原始文本輸出映射到相應的結構化數據表示,如 JSON、XML 或特定于域的數據結構。

三、Spring AI 提供的轉換器實現

Spring AI 提供了多種轉換器實現,以滿足不同的結構化輸出需求:

  1. BeanOutputConverter

    • 使用指定的 Java 類(例如 Bean)或 ParameterizedTypeReference 配置。
    • 指示 AI 模型生成符合 JSON 模式的響應,隨后利用 ObjectMapper 將 JSON 輸出反序列化為目標類的 Java 對象實例。
  2. MapOutputConverter

    • 指導 AI 模型生成符合 RFC8259 的 JSON 響應。
    • 包含一個轉換器實現,利用提供的 MessageConverter 將 JSON 負載轉換為 java.util.Map<String, Object> 實例。
  3. ListOutputConverter

    • 指導 AI 模型生成逗號分隔的格式化輸出。
    • 最終轉換器將模型文本輸出轉換為 java.util.List
四、結構化輸出的應用場景

結構化輸出技術廣泛應用于以下場景:

  1. 智能助手
    將模型輸出轉換為結構化數據,用于驅動智能助手的應用邏輯。

  2. 數據分析
    將模型生成的分析結果轉換為結構化格式,便于后續的數據處理和可視化。

  3. 內容生成
    將模型生成的內容轉換為特定的結構化格式,用于內容管理系統或自動化生成報告。

五、結構化輸出的實現方式

以下是一些使用 Spring AI 結構化輸出的代碼示例:

1. 使用 BeanOutputConverter
import com.alibaba.cloud.ai.client.ChatClient;
import com.alibaba.cloud.ai.client.model.ChatModel;
import com.alibaba.cloud.ai.client.output.BeanOutputConverter;public class StructuredOutputExample {public static void main(String[] args) {ChatModel chatModel = ChatModel.create("your-model-id");// 定義目標類record ActorsFilms(String actor, List<String> movies) {}// 創建 BeanOutputConverterBeanOutputConverter<ActorsFilms> beanOutputConverter = new BeanOutputConverter<>(ActorsFilms.class);// 獲取格式說明String format = beanOutputConverter.getFormat();// 構建 promptString actor = "Tom Hanks";String template = """Generate the filmography of 5 movies for {actor}.{format}""";// 調用模型Generation generation = chatModel.call(new PromptTemplate(template, Map.of("actor", actor, "format", format)).create()).getResult();// 轉換為目標類ActorsFilms actorsFilms = beanOutputConverter.convert(generation.getOutput().getContent());System.out.println("Actor: " + actorsFilms.actor());System.out.println("Movies: " + actorsFilms.movies());}
}
2. 使用 MapOutputConverter
import com.alibaba.cloud.ai.client.ChatClient;
import com.alibaba.cloud.ai.client.model.ChatModel;
import com.alibaba.cloud.ai.client.output.MapOutputConverter;import java.util.Map;public class MapOutputExample {public static void main(String[] args) {ChatModel chatModel = ChatModel.create("your-model-id");// 創建 MapOutputConverterMapOutputConverter mapOutputConverter = new MapOutputConverter();// 構建 promptString subject = "an array of numbers from 1 to 9 under their key name 'numbers'";String prompt = "Provide me a List of " + subject;// 調用模型Generation generation = chatModel.call(new Prompt(prompt)).getResult();// 轉換為 MapMap<String, Object> result = mapOutputConverter.convert(generation.getOutput().getContent());System.out.println("Result: " + result);}
}
3. 使用 ListOutputConverter
import com.alibaba.cloud.ai.client.ChatClient;
import com.alibaba.cloud.ai.client.model.ChatModel;
import com.alibaba.cloud.ai.client.output.ListOutputConverter;import java.util.List;public class ListOutputExample {public static void main(String[] args) {ChatModel chatModel = ChatModel.create("your-model-id");// 創建 ListOutputConverterListOutputConverter listOutputConverter = new ListOutputConverter(new DefaultConversionService());// 構建 promptString subject = "ice cream flavors";String prompt = "List five " + subject;// 調用模型Generation generation = chatModel.call(new Prompt(prompt)).getResult();// 轉換為 ListList<String> flavors = listOutputConverter.convert(generation.getOutput().getContent());System.out.println("Flavors: " + flavors);}
}
4. 使用 ChatClient 進行結構化輸出
import com.alibaba.cloud.ai.client.ChatClient;
import com.alibaba.cloud.ai.client.model.ChatModel;public class ChatClientExample {public static void main(String[] args) {ChatModel chatModel = ChatModel.create("your-model-id");// 定義目標類record ActorsFilms(String actor, List<String> movies) {}// 使用 ChatClient 轉換為 ActorsFilms 對象ActorsFilms actorsFilms = ChatClient.create(chatModel).prompt().user(u -> u.text("Generate the filmography of 5 movies for {actor}.").param("actor", "Tom Hanks")).call().entity(ActorsFilms.class);System.out.println("Actor: " + actorsFilms.actor());System.out.println("Movies: " + actorsFilms.movies());}
}
六、結構化輸出的未來發展方向
  1. 多模態輸出
    結合文本、圖像、音頻等多種模態數據,提升輸出的多樣性和準確性。

  2. 實時轉換
    提高轉換器的實時性,支持更快速的輸出解析和轉換。

  3. 領域特定轉換
    針對特定領域(如醫療、法律)提供定制化的結構化輸出轉換器。

  4. 自動化優化
    通過機器學習技術自動優化轉換器的性能和準確性。

七、總結

Spring AI 的結構化輸出功能為開發者提供了一種強大的工具,可以將 LLM 的輸出轉換為結構化格式,從而滿足下游應用程序的需求。通過使用 Spring AI 提供的轉換器實現,開發者可以輕松地將模型輸出轉換為 JSON、XML 或 Java 對象,提高開發效率和應用可靠性。隨著技術的不斷發展,結構化輸出將在更多領域發揮重要作用,為開發者提供更多智能化的解決方案。

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

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

相關文章

THM Billing

1. 信息收集 (1) Nmap 掃描 bashnmap -T4 -sC -sV -p- 10.10.189.216 輸出關鍵信息&#xff1a; PORT STATE SERVICE VERSION22/tcp open ssh OpenSSH 8.4p1 Debian 5deb11u380/tcp open http Apache 2.4.56 (Debian) # MagnusBilling 應用3306/tcp open …

布局決定終局:基于開源AI大模型、AI智能名片與S2B2C商城小程序的戰略反推思維

摘要&#xff1a;在商業競爭日益激烈的當下&#xff0c;布局與終局預判成為企業成功的關鍵要素。本文探討了布局與終局預判的智慧性&#xff0c;強調其雖無法做到百分之百準確&#xff0c;但能顯著提升思考能力。終局思維作為重要戰略工具&#xff0c;并非一步到位的戰略部署&a…

貪心算法 day08(加油站+單調遞增的數字+壞了的計算機)

目錄 1.加油站 2.單調遞增的數字 3.壞了的計算器 1.加油站 鏈接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; gas[index] - cost[index]&#xff0c;ret 表示的是在i位置開始循環時剩余的油量 a到達的最大路徑假設是f那么我們可以得出 a b …

【技術派部署篇】云服務器部署技術派

1 環境搭建 1.1 JDK安裝 # ubuntu sudo apt update # 更新apt apt install openjdk-8-jdk # 安裝JDK安裝完畢之后&#xff0c;執行 java -version 命令進行驗證&#xff1a; 1.2 Maven安裝 cd ~ mkdir soft cd soft wget https://dlcdn.apache.org/maven/maven-3/3.8.8/bina…

Linux:35.其他IPC和IPC原理+信號量入門

通過命名管道隊共享內存的數據發送進行保護的bug&#xff1a; 命名管道掛掉后&#xff0c;進程也掛掉了。 6.systemV消息隊列 原理:進程間IPC:原理->看到同一份資源->維護成為一個隊列。 過程&#xff1a; 進程A,進程B進行通信。 讓操作系統提供一個隊列結構&#xff0c;…

【數據結構】紅黑樹超詳解 ---一篇通關紅黑樹原理(含源碼解析+動態構建紅黑樹)

一.什么是紅黑樹 紅黑樹是一種自平衡的二叉查找樹&#xff0c;是計算機科學中用到的一種數據結構。1972年出現&#xff0c;最初被稱為平衡二叉B樹。1978年更名為“紅黑樹”。是一種特殊的二叉查找樹&#xff0c;紅黑樹的每一個節點上都有存儲表示節點的顏色。每一個節點可以是…

2024年第十五屆藍橋杯CC++大學A組--成績統計

2024年第十五屆藍橋杯C&C大學A組--成績統計 題目&#xff1a; 動態規劃&#xff0c; 對于該題&#xff0c;考慮動態規劃解法&#xff0c;先取前k個人的成績計算其方差&#xff0c;并將成績記錄在數組中&#xff0c;記錄當前均值&#xff0c;設小藍已檢查前i-1個人的成績&…

vue2使用ezuikit-js播放螢石視頻

需求&#xff1a;需要在大屏上播放螢石視頻&#xff0c;用到官方的ezuikit-js插件實現&#xff0c;并實現視頻播放切換功能。有個問題至今沒有解決&#xff0c;就是螢石視頻的寬高是固定的&#xff0c;不會根據大屏縮放進行自適應。我這邊做了簡單的刷新自適應。 1.下載ezuikit…

愛普生TG-5510CA和TG-5510CB晶振成為服務器中的理想之選

在數字化時代&#xff0c;服務器作為數據存儲、處理與傳輸的核心樞紐&#xff0c;其性能的優劣直接影響著整個信息系統的運行效率與穩定性。從企業內部的數據中心到云計算服務提供商的大規模集群&#xff0c;服務器需要應對海量數據的高速處理與頻繁交互。而在服務器復雜精密的…

使用opentelemetry 可觀測監控springboot應用的指標、鏈路實踐,使用zipkin展示鏈路追蹤數據,使用grafana展示指標

1.安裝docker&#xff0c;docker-compose &#xff08;1&#xff09;安裝依賴包 yum install -y yum-utils device-mapper-persistent-data lvm22.2、部署dockertar xvf docker-20.10.19.tgz cp docker/* /usr/bin/vim /usr/lib/systemd/system/docker.service[Unit] Descript…

5. 藍橋公園

題目描述 小明喜歡觀景&#xff0c;于是今天他來到了藍橋公園。 已知公園有 N 個景點&#xff0c;景點和景點之間一共有 M 條道路。小明有 Q 個觀景計劃&#xff0c;每個計劃包含一個起點 stst 和一個終點 eded&#xff0c;表示他想從 stst 去到 eded。但是小明的體力有限&am…

虛幻基礎:碰撞幀運算

能幫到你的話&#xff0c;就給個贊吧 &#x1f618; 文章目錄 碰撞碰撞盒線段檢測 幀運算&#xff1a;每個程序流就是一幀的計算結果速度過快時(10000)&#xff0c;導致每幀移動過大(83)&#xff0c;從而導致碰撞盒錯過而沒有碰撞速度快的碰撞要用線段檢測 碰撞 碰撞盒 線段檢…

Qt 入門 3 之對話框 QDialog

Qt 入門 3 之對話框 QDialog 本文從以下幾點分開講述&#xff1a; - 對話框的基本原理介紹 - 兩種不同類型的對話框 - 一個由多個窗口組成并且窗口間可以相互切換的程序 1.模態和非模態對話框 QDialog 類是所有對話框窗口類的基類。對話框窗口是一個經常用來完成短小任務或者…

數據結構——哈希技術及鏈地址法

目錄 一、哈希的定義 二、哈希沖突定義 三、構造哈希函數的方法 四、四種解決哈希沖突的方法 4.1 開放地址法 4.2 鏈地址法 4.3 再散列函數法 4.4 公共區溢出法 五、鏈地址法結構體設計 六、基本操作的實現 6.1 哈希函數 6.2 初始化 6.3 插入值 6.4 刪除值 6.5 查…

算法思想之前綴和(二)

歡迎拜訪&#xff1a;霧里看山-CSDN博客 本篇主題&#xff1a;算法思想之前綴和(二) 發布時間&#xff1a;2025.4.11 隸屬專欄&#xff1a;算法 目錄 滑動窗口算法介紹核心思想大致步驟 例題和為 K 的子數組題目鏈接題目描述算法思路代碼實現 和可被 K 整除的子數組題目鏈接題目…

開源的7B參數OCR視覺大模型:RolmOCR

1. 背景介紹 早些時候&#xff0c;Allen Institute for AI 發布了 olmOCR&#xff0c;這是一個基于 Qwen2-VL-7B 視覺語言模型&#xff08;VLM&#xff09;的開源工具&#xff0c;用于處理 PDF 和其他復雜文檔的 OCR&#xff08;光學字符識別&#xff09;。開發團隊對該工具的…

移動端六大語言速記:第14部分 - 數據庫操作

移動端六大語言速記:第14部分 - 數據庫操作 本文將對比Java、Kotlin、Flutter(Dart)、Python、ArkTS和Swift這六種移動端開發語言在數據庫操作方面的特性,幫助開發者理解和掌握各語言的數據庫編程能力。 14. 數據庫操作 14.1 SQL查詢 各語言SQL查詢實現方式對比: 特性Ja…

有哪些反爬機制可能會影響Python爬取視頻?如何應對這些機制?

文章目錄 前言常見反爬機制及影響1. IP 封禁2. 驗證碼3. 請求頭驗證4. 動態加載5. 加密與混淆6. 行為分析 應對方法1. 應對 IP 封禁2. 應對驗證碼3. 應對請求頭驗證4. 應對動態加載5. 應對加密與混淆6. 應對行為分析 前言 在使用 Python 爬取視頻時&#xff0c;會遇到多種反爬…

ESP32開發入門:基于VSCode+PlatformIO環境搭建指南

前言 ESP32作為一款功能強大的物聯網開發芯片&#xff0c;結合PlatformIO這一現代化嵌入式開發平臺&#xff0c;可以大幅提升開發效率。本文將詳細介紹如何在VSCode中搭建ESP32開發環境&#xff0c;并分享實用開發技巧。 一、環境安裝&#xff08;Windows/macOS/Linux&#xf…

DeepSeek:穿透行業知識壁壘的搜索引擎攻防戰

DeepSeek&#xff1a;穿透行業知識壁壘的搜索引擎攻防戰 文 / 產業智能觀察組&#xff08;人機協同創作&#xff09; 一、搜索引擎的"認知折疊"危機 2024年Q1數據顯示&#xff0c;百度搜索結果前10頁中&#xff0c;61.7%的內容存在"偽專業化"現象——看似…