Spring AI 系列之二十八 - Spring AI Alibaba-基于Nacos的prompt模版

之前做個幾個大模型的應用,都是使用Python語言,后來有一個項目使用了Java,并使用了Spring AI框架。隨著Spring AI不斷地完善,最近它發布了1.0正式版,意味著它已經能很好的作為企業級生產環境的使用。對于Java開發者來說真是一個福音,其功能已經能滿足基于大模型開發企業級應用。借著這次機會,給大家分享一下Spring AI框架。

注意由于框架不同版本改造會有些使用的不同,因此本次系列中使用基本框架是 Spring AI-1.0.0,JDK版本使用的是19
代碼參考: https://github.com/forever1986/springai-study

目錄

  • 1 示例演示
    • 1.1 前提準備
    • 1.2 代碼實現
    • 1.3 演示
  • 2 底層原理

上一章演示了Spring AI Alibaba的基本入門,本章將演示基于Nacos的動態prompt模版。基于Nacos的prompt是Spring AI Alibaba對prompt模版的擴展功能,在實際企業級應用中可能對于提示詞的管理需要一個統一的地方,因此采用Nacos統一進行版本管理和發布是一個比較好的實踐。本章就通過示例來演示如何基于Nacos管理prompt模版。

1 示例演示

代碼參考lesson24子模塊下的ali-prompt子模塊

示例說明:通過Nacos動態加載提示詞模版,從而使得無需啟動服務器可以調試或者修改prompt模版

1.1 前提準備

1)需要準備一個nacos,這里使用版本是3.0.2

在這里插入圖片描述

注意:Nacos3的控制臺端口默認也是8080,因此自己可以在配置文件中修改或者演示項目ali-prompt改一下端口,避免端口沖突

2)在Nacos下面配置一個prompt的配置文件

在Nacos的public命名空間下,創建一個名字為:spring.ai.alibaba.configurable.prompt 其group為:DEFAULT_GROUP

在這里插入圖片描述

[{"name": "author","template": "請介紹 {author} 的生平簡介","model": {"author": "余華"}}
]

說明:這里解釋一下參數:
1)name:就是提示詞模版的名稱,也是代碼中使用它來決定加載哪個模版
2)template:提示詞模版
3)model:參數,可以用于提示詞模版里面

1.2 代碼實現

1)在lesson24子模塊下,新建ali-prompt子模塊,其pom引入如下:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter-dashscope</artifactId></dependency><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter-nacos-prompt</artifactId></dependency>
</dependencies>

2)新建application.properties配置文件

spring.ai.dashscope.api-key=你的阿里百煉API KEYspring.config.import=nacos:prompt-application.properties
spring.nacos.serverAddr=localhost:8848
spring.nacos.username=nacos
spring.nacos.password=nacos# 開啟 nacos 的 prompt tmpl 監聽功能
spring.ai.nacos.prompt.template.enabled=true

3)新建DemoController演示類:

import com.alibaba.cloud.ai.prompt.ConfigurablePromptTemplate;
import com.alibaba.cloud.ai.prompt.ConfigurablePromptTemplateFactory;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;import java.util.Map;@RestController
public class DemoController {private final ChatClient dashScopeChatClient;private final ConfigurablePromptTemplateFactory promptTemplateFactory;public DemoController(ChatClient.Builder chatClientBuilder, ConfigurablePromptTemplateFactory promptTemplateFactory) {this.dashScopeChatClient = chatClientBuilder.build();this.promptTemplateFactory = promptTemplateFactory;}@GetMapping(value = "/ai/generate", produces = "text/html;charset=UTF-8")public Flux<String> generate(@RequestParam(value = "authorName", required = false, defaultValue = "") String authorName) {// 使用 nacos 的 prompt tmpl 創建 promptConfigurablePromptTemplate template = promptTemplateFactory.create(// 配置的模版name"author",// 如果找不到,會使用這個默認模版"請列出這位{author}最著名的三本書。");Prompt prompt = null;if(!StringUtils.hasText(authorName)){// 但參數為空時,使用nacos默認的author關鍵字prompt = template.create();}else{prompt = template.create(Map.of("author", authorName));}return dashScopeChatClient.prompt(prompt).stream().content();}}

4)新建啟動Lesson24PromptApplication類:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Lesson24PromptApplication {public static void main(String[] args) {SpringApplication.run(Lesson24PromptApplication.class, args);}}

1.3 演示

1)不傳參訪問

http://localhost:8080/ai/generate

在這里插入圖片描述

說明:會默認讀取Nacos的模版

2)傳參訪問

http://localhost:8080/ai/generate?authorName=魯迅

在這里插入圖片描述

說明:通過傳參方式,結合Nacos的prompt模版返回的結果

3)修改Nacos配置

在這里插入圖片描述

4)再次訪問

http://localhost:8080/ai/generate?authorName=魯迅

在這里插入圖片描述

說明:可以看到新的prompt模版已經生效,這樣就實現了動態修改模版

2 底層原理

下面來看看其底層原理

1)可以看到自動化配置了ConfigurablePromptTemplateFactory類

在這里插入圖片描述

2)在演示類DemoController中也可以看到是通過注冊一個ConfigurablePromptTemplateFactory類,并從中獲取到nacos配置的提示詞模版,下面是關鍵源碼

在這里插入圖片描述

說明:ConfigurablePromptTemplateFactory類源碼比較關鍵的2個點
1)@NacosConfigListener,其監聽了group為DEFAULT_GROUP,名稱為:spring.ai.alibaba.configurable.prompt 的配置作為提示詞配置
2)Nacos的配置會解析為ConfigurablePromptTemplateModel類,里面有name、template和model三個參數

結語:本章通過演示Spring AI Alibaba-基于Nacos的prompt模版,并簡單解析了其實現原理。下一章將講解Spring AI Alibaba對于聊天記憶的擴展。

Spring AI系列上一章:《Spring AI 系列之二十七 - Spring AI Alibaba-入門》

Spring AI系列下一章:《Spring AI 系列之二十九 - Spring AI Alibaba-聊天記憶》

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

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

相關文章

IMAP電子郵件歸檔系統Mail-Archiver

簡介 什么是 Mail-Archiver &#xff1f; Mail-Archiver 是一個用于從多個 IMAP 賬戶歸檔、搜索和導出電子郵件的 web 應用程序。它提供了一種全面的解決方案&#xff0c;幫助用戶管理和存儲電子郵件。 主要特點 &#x1f4cc;自動歸檔&#xff1a;自動歸檔進出郵件&#xff…

李宏毅深度學習教程 第6-7章 自注意力機制 + Transformer

強烈推薦&#xff01;臺大李宏毅自注意力機制和Transformer詳解&#xff01;_嗶哩嗶哩_bilibili 目錄 1. 詞嵌入&問題情形 2. self-attention 自注意力機制 3. 自注意力的變形 3.1 多頭注意力&#xff08;multi-head&#xff09; 3.2 位置編碼 3.3 截斷自注意力&…

大模型幻覺的本質:深度=邏輯層次,寬度=組合限制,深度為n的神經網絡最多只能處理n層邏輯推理,寬度為w的網絡無法區分超過w+1個復雜對象的組合

大模型幻覺的本質&#xff1a;深度邏輯層次&#xff0c;寬度組合限制&#xff0c;深度為n的神經網絡最多只能處理n層邏輯推理&#xff0c;寬度為w的網絡無法區分超過w1個復雜對象的組合&#x1f9e9; "深度邏輯層次"具體含義&#x1f522; "寬度組合限制"具…

2419.按位與最大的最長子數組

Problem: 2419. 按位與最大的最長子數組 思路 子數組按位與的結果&#xff0c;不會超過子數組里的最大值&#xff08;因為 a & b ≤ max(a, b)&#xff09;。 進一步推導&#xff0c;整個數組最大按位與的結果就是數組本身的最大值。 因為最大的那個元素自己作為子數組時&a…

智能時代:先管端點,再談效率

為什么需要統一端點管理&#xff1f;在混合辦公常態化、設備類型爆炸式增長的2025年&#xff0c;分散的端點如同散落各地的哨所。傳統管理方式讓IT團隊疲于應對系統更新、漏洞修復、權限分配等重復勞動&#xff0c;不僅消耗60%以上的運維時間&#xff0c;更可能因響應延遲導致安…

Windows字體simsum.ttf的安裝與Python路徑設置指南

下載工具&#xff1a; https://fontforge.org/en-US/downloads/windows-dl/ 使用工具&#xff1a; 復制到c:\windows\fonts路徑下面。 并復制到運行的python程序同一路徑下。比如&#xff1a;c:\pythoncode\new\

GitHub下載項目完整配置SSH步驟詳解

GitHub下載項目完整配置步驟&#xff08;從零開始&#xff09; 默認下好了git &#xff0c;在文件夾中右鍵打開git bash &#xff0c; 如果沒有請在csdn搜索教程 第一步&#xff1a;檢查并清理現有SSH配置 # 進入.ssh目錄 cd ~/.ssh# 備份并刪除所有現有密鑰&#xff08;避免沖…

數據結構(9)棧和隊列

1、棧 1.1 概念與結構 棧是一種特殊的線性表&#xff0c;只允許在固定的一端進行插入和刪除元素的操作。進行數據插入和刪除的一端稱為棧頂&#xff0c;另一端稱為棧底。棧里面的數據元素遵循后進先出的原則。棧的底層實現一般可以使用數組或者鏈表來實現&#xff0c;但數組的…

湖北大學暑期實訓優秀作品:面向美麗中國的數據化可視平臺

開發背景2024年1月11日&#xff0c;《中共中央國務院關于全面推進美麗中國建設的意見》發布&#xff0c;明確了建設美麗中國的總體要求、主要目標和重點任務&#xff0c;為我國生態文明建設提供了頂層設計和行動指南。系統簡介當前&#xff0c;中國正以空前的力度推進生態文明建…

Ubuntu系統VScode實現opencv(c++)隨機數與隨機顏色

在圖像處理與計算機圖形學中&#xff0c;隨機數與隨機顏色的生成常用于增強圖像的多樣性、可視化多個目標區域、模擬自然現象以及生成測試數據等任務。通過隨機化元素的顏色、位置或形狀&#xff0c;可以使程序在動態展示、調試輸出、以及數據增強等方面更加靈活和豐富。例如&a…

機器學習、深度學習與數據挖掘:三大技術領域的深度解析

基本概念與歷史沿革數據挖掘起源于20世紀90年代&#xff0c;是數據庫技術、統計學和機器學習交叉融合的產物。它經歷了從簡單查詢到復雜知識發現的演變過程&#xff0c;早期階段主要關注數據存儲和檢索&#xff0c;隨著IBM、微軟等公司的推動&#xff0c;逐漸形成了完整的知識發…

MoR vs MoE架構對比:更少參數、更快推理的大模型新選擇

Google DeepMind 近期發布了關于遞歸混合&#xff08;Mixture of Recursion&#xff09;架構的研究論文&#xff0c;這一新型 Transformers 架構變體在學術界和工業界引起了廣泛關注。該架構通過創新的設計理念&#xff0c;能夠在保持模型性能的前提下顯著降低推理延遲和模型規…

uniapp開發實現【中間放大兩邊縮小的輪播圖】

一、效果展示 二、代碼實現 <template><view><!-- 輪播圖 --><view class=<

機器學習沒有最好的模型,只有最合適的選擇(模型選擇)

機器學習領域存在"沒有免費午餐"定理&#xff0c;沒有任何一種模型在所有問題上都表現最優。不同模型有各自的優勢和適用場景。同一數據集上&#xff0c;不同模型的預測性能可能有巨大差異。例如&#xff0c;線性關系明顯的數據上線性模型可能表現優異&#xff0c;而…

關于人工智能AI>ML>DL>transformer及NLP的關系

一、AI、ML、DL、NLP的極簡概念1、人工智能&#xff08;AI&#xff09;有不同的定義&#xff0c;但其中一個定義或多或少已成為共識&#xff0c;即AI是一個計算機系統&#xff0c;它能夠執行通常需要人類智能才能完成的任務。根據這個定義&#xff0c;許多算法可以歸納為AI算法…

小迪23-28~31-js簡單回顧

前端-js開發 課堂完結后欲復習鞏固也方便后續-重游-故寫此篇 從實現功能過渡到涉及的相關知識點 知識點 1、 JS 是前端語言&#xff0c;是可以被瀏覽器“看到”的&#xff0c;當然也可以被修改啊&#xff0c;被瀏覽器禁用網頁的 JS 功能啊之類的。所以一般都是前后端分離開發&…

vue項目預覽pdf隱藏工具欄和側邊欄

1.在預覽PDF時&#xff0c;PDF查看器通常會顯示工具欄、側邊欄等控件。如果想隱藏這些控件&#xff0c;可以通過在PDF文件的URL中添加參數來實現。可以使用#toolbar0和#navpanes0等參數來隱藏工具欄和側邊欄。解釋&#xff1a; #toolbar0&#xff1a;隱藏工具欄。#navpanes0&am…

ERP、CRM、OA整合工具哪家好?2025年最新推薦

當前&#xff0c;大多數中大型企業已部署了ERP&#xff08;企業資源計劃&#xff09;、CRM&#xff08;客戶關系管理&#xff09;、OA&#xff08;辦公自動化&#xff09;等核心業務系統。這些系統在各自職能領域內發揮著關鍵作用&#xff1a;ERP管理財務、供應鏈與生產&#x…

設計模式:命令模式 Command

目錄前言問題解決方案結構代碼前言 命令是一種行為設計模式&#xff0c;它可將請求轉換為一個包含與請求相關的所有信息的獨立對象。該轉換讓你能根據不同的請求將方法參數化、延遲請求執行或將其放入隊列中&#xff0c;且能實現可撤銷操作。 問題 假如你正在開發一款新的文字…

4-verilog簡單狀態機

verilog簡單狀態機 1. always (posedge clk or negedge rst_n) beginif (!rst_n)cnt_1ms < 20b0;else if (cnt_1ms_en)cnt_1ms < cnt_1ms 1b1;elsecnt_1ms < 20d0; endalways (posedge clk or negedge rst_n) beginif(!rst_n)cur_state < s1_power_init;else i…