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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…