SpringAI使用总结

SpringAI使用总结

  • 基本使用
      • ChatModel和ChatClient
      • 简单对话
      • 流式输出
      • 预设角色
      • prompt(提示词)
      • function call(工具调用)
      • 参考

基本使用

ChatModel和ChatClient

SpringAi支持非常多的模型,为了统一处理,SpringAi声明了ChatModel接口,各个模型的starter中有ChatModel对应的实现。

当我们引入ollama的依赖后

        <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-ollama</artifactId></dependency>

可以在程序中搜索到OllamaChatModel在这里插入图片描述

ChatClient是获取与模型进行对话获取响应的入口,需要给ChatClient提供ChatModel,ChatClient也是一个接口,不过SpringAi提供了默认的实现。
在这里插入图片描述
在这里插入图片描述

简单对话

这里调用的是本地的ollama中的模型,需要提前下载对应的模型。当然也可以通过api key调用远程的模型服务。

1、引入ollama starter依赖

        <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-ollama</artifactId></dependency>

2、配置

spring:ai:ollama:base-url: http://localhost:11434chat:model: deepseek-r1:14b

3、创建ChatClient

@Configuration
public class MyAiConfig {@Beanpublic ChatClient chatClient(ChatModel chatModel) {return ChatClient.builder(chatModel).build();}}

4、对话controller编写

@RestController
@RequestMapping("/ai-chat")
public class ChatController {@Autowiredprivate ChatClient chatClient;@GetMapping("/chat1")public String chat(@RequestParam String message) {return chatClient.prompt(message).call().content();}
}

5、测试结果,可以看到模型输出了响应。
在这里插入图片描述

流式输出

由于大模型生成响应可能比较慢,为了提高用户体验,所以出现了流式输出,即不等待大模型回答完成后,把输出一次性传输到客户端,而是将输出不断地传输到客户端。

    @GetMapping("/chat2")public Flux<String> chat1(@RequestParam String message) {return chatClient.prompt().user(message).stream().content();}

预设角色

在创建ChatClient的时候,可以给模型设置角色,这样模型会按照设置的角色来回答问题。
通过defaultSystem方法预设角色。

    @Beanpublic ChatClient chatClient(ChatModel chatModel) {return ChatClient.builder(chatModel).defaultSystem("你是一名医生,擅长诊断病情并提供对应的治疗方案").build();}

prompt(提示词)

SpringAi中主要有以下几类提示词模板:

  1. PromptTemplate:通用的提示词模板类,用于构建包含占位符的提示语句;适用于需要动态替换变量的任意提示内容;
  2. AssistantPromptTemplate:专门用于生成模型助手角色的提示词模板,当需要定义 AI 助手的行为或初始指令时使用;
  3. FunctionPromptTemplate:用于生成与函数调用相关的提示词模板;当需要模型根据特定函数描述进行推理或调用时使用;
  4. SystemPromptTemplate:用于生成系统级别的提示词模板,通常用于设置模型的整体行为;用于生成系统级别的提示词模板,通常用于设置模型的整体行为;

示例

通过@Value注解加载提示词模板

    @Value("classpath:/my-prompt-template.st")private Resource systemResource;@GetMapping("/chat4")public String chat4(@RequestParam String message) {SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemResource);Prompt prompt = systemPromptTemplate.create();return chatClient.prompt(prompt).user(message).call().content();}

提示词模板内容

你是我的好朋友,请用东北话回答问题,回答问题的时候适当添加表情符号。
今天是 {{current_date}}。

输出:
在这里插入图片描述

function call(工具调用)

使用@Tool注解定义工具

public class DateTimeUtil {/*** @Tool注解:*      1、name:工具的名称。如果未提供,则将使用方法名称。AI 模型在调用工具时使用此名称来识别工具。因此,不允许在同一个类中有两个同名的工具*      2、returnDirect:工具结果是应直接返回给客户端还是传递回模型*      3、description:工具的描述,模型可以使用它来了解何时以及如何调用工具* @return*/@Tool(name = "",description = "Get the current date and time in the user's timezone")public String getCurrentTime() {return LocalDateTime.now().atZone(LocaleContextHolder.getTimeZone().toZoneId()).toString();}/*** @ToolParam注解:*      1、required:参数是必需的还是可选的。默认情况下,所有参数都被视为必需参数*      2、description:description:参数的描述,模型可以使用该描述来更好地了解如何使用它* @param time*/@Tool(name = "setAlarm", description = "Set a user alarm for the given time")void setAlarm(@ToolParam(description = "Time in ISO-8601 format") String time) {LocalDateTime alarmTime = LocalDateTime.parse(time, DateTimeFormatter.ISO_DATE_TIME);System.out.println("Alarm set for " + alarmTime);}}

通过tools方法添加工具,模型会自动调用工具

chatClient.prompt().tools(new DateTimeUtil()).user(message).call().content();

由于我使用的是本地的deepseek-r1不支持tool,报错了,这里就不放测试结果了。

 [400] Bad Request - {"error":"registry.ollama.ai/library/deepseek-r1:14b does not support tools"}

参考

  1. Spring文档
  2. Spring Ai视频教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/83663.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

历史交易数据涨跌分级

历史交易数据涨跌分级 # encoding:utf-8 import sys,traceback from loguru import loggersys.path.append("..") from QhSpiderTool import QhDorpFiled from QhCsvMode import *def QhZhangDieFenJi(QhDfData,QhFangFa"A"):"""历史交易数…

Kafka入门4.0.0版本(基于Java、SpringBoot操作)

Kafka入门4.0.0版本&#xff08;基于Java、SpringBoot操作&#xff09; 一、kafka概述 Kafka最初是由LinkedIn公司开发的&#xff0c;是一个高可靠、高吞吐量、低延迟的分布式发布订阅消息系统&#xff0c;它使用Scala语言编写&#xff0c;并于2010年被贡献给了Apache基金会&…

react react-router-dom中获取自定义参数v6.4版本之后

路由配置, AutnToken 组件作为权限、登录管理 import { createBrowserRouter, Navigate } from react-router-dom; import Layout from /layout/index; import Login from /pages/login; import Page404 from /pages/404;import AutnToken from /components/authToken; import…

AI中的Prompt

1. System 作用&#xff1a;设定 AI 的“角色设定”和“行为准则”。 内容&#xff1a;通常是描述 LLM 的身份、语气、行为范围、约束规则。 类似&#xff1a;在大语言模型中是最优先被考虑的提示。 示例&#xff1a; 你是一个专业的商品评价分析助手&#xff0c;请根据用户…

从人工到智能:IACheck如何重构检测报告审核工作流?

从人工到智能&#xff1a;IACheck如何重构检测报告审核工作流&#xff1f; 在当今AI技术迅猛发展的时代&#xff0c;各行各业正经历从“人工驱动”到“智能驱动”的根本性变革。检测认证&#xff08;TIC&#xff09;行业作为关乎质量与安全的重要支柱&#xff0c;也不例外。在…

React事件处理:如何给按钮绑定onClick点击事件?

系列回顾&#xff1a; 在前几篇文章中&#xff0c;我们已经学会了如何使用 State 管理组件的内部数据&#xff0c;以及如何通过 Props 实现父子组件之间的通信。我们的组件现在已经有了“数据”和“外观”。但是&#xff0c;它还像一个只能看的“模型”&#xff0c;无法与用户进…

【机器学习|学习笔记】粒子群优化(Particle Swarm Optimization, PSO)详解,附代码。

【机器学习|学习笔记】粒子群优化&#xff08;Particle Swarm Optimization, PSO&#xff09;详解&#xff0c;附代码。 【机器学习|学习笔记】粒子群优化&#xff08;Particle Swarm Optimization, PSO&#xff09;详解&#xff0c;附代码。 文章目录 【机器学习|学习笔记】粒…

深度剖析:AI 社媒矩阵营销工具,如何高效获客?

在社交媒体营销领域&#xff0c;竞争日益激烈&#xff0c;传统的社媒矩阵运营方式面临诸多挑战。而 AI 社媒矩阵营销工具的出现&#xff0c;正以前所未有的方式重构社媒矩阵的底层架构&#xff0c;为营销人员带来了全新的机遇与变革。接下来&#xff0c;我们将从技术破局、实战…

Spring XML 常用命名空间配置

Spring XML 常用命名空间配置 下面是一个综合性的Spring XML配置样例&#xff0c;展示了各种常用命名空间的使用方式&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans&quo…

UE5场景漫游——开始界面及关卡跳转

UE中实现UMG游戏界面搭建及蓝图控制&#xff0c;点击游戏界面中的按钮实现关卡的跳转效果。 一、游戏界面显示。1.创建UMG&#xff0c;2.搭建UI。3.关卡蓝图控制显示 二、点击按钮之后实现关卡跳转

CSS 外边距合并(Margin Collapsing)问题研究

在 CSS 中&#xff0c;margin-top 属性会导致外部 DIV 移动的现象主要是由于 外边距合并&#xff08;Margin Collapsing&#xff09; 造成的。这是 CSS 盒模型的一个特性&#xff0c;可能会与直觉相悖。 外边距合并的原理 当一个元素&#xff08;如内部 DIV&#xff09;的 ma…

清理电脑C磁盘,方法N:使用【360软件】中的【清理C盘空间】

1、先下载并打开【360安全卫士】&#xff0c;点击如下位置&#xff1a; 之后&#xff0c;可以把这个东西&#xff0c;创建快捷方式到电脑桌面&#xff0c;方便以后使用&#xff1a;

微服务集成seata分布式事务 at模式快速验证

微服务集成Seata分布式事务 本次demo代码地址业务场景&#xff1a;一般用于以下场景&#xff1a;使用 AT 模式的优势&#xff08;适用于快速验证&#xff09;&#xff1a;快速验证建议步骤&#xff1a;注意事项&#xff1a; 工具环境微服务版本选择Nacos 环境搭建与启动nacos 下…

LLM基础5_从零开始实现 GPT 模型

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 设计 LLM 的架构 GPT 模型基于 Transformer 的 decoder-only 架构&#xff0c;其主要特点包括&#xff1a; 顺序生成文本 参数数量庞大&#xff08;而非代码量复杂&#xff09; 大量重复…

Android 中 linux 命令查询设备信息

一、getprop 命令 在 Linux 系统中&#xff0c; getprop 命令通常用于获取 Android 设备的系统属性&#xff0c;这些属性包括设备型号、Android 版本、电池状态等。 1、获取 Android 版本号 adb shell getprop ro.build.version.release2、获取设备型号 adb shell getprop …

26考研 | 王道 | 计算机组成原理 | 六、总线

26考研 | 王道 | 计算机组成原理 | 六、总线 文章目录 26考研 | 王道 | 计算机组成原理 | 六、总线6.1 总线概述1. 总线概述2. 总线的性能指标 6.2 总线仲裁&#xff08;考纲没有&#xff0c;看了留个印象&#xff09;6.3 总线操作和定时6.4 总线标准&#xff08;考纲没有&…

SE(Secure Element)加密芯片与MCU协同工作的典型流程

以下是SE&#xff08;Secure Element&#xff09;加密芯片与MCU协同工作的典型流程&#xff0c;综合安全认证、数据保护及防篡改机制&#xff1a; 一、基础认证流程&#xff08;参数保护方案&#xff09; 密钥预置‌ SE芯片与MCU分别预置相同的3DES密钥&#xff08;Key1、Key2…

数据库——MongoDB

一、介绍 1. MongoDB 概述 MongoDB 是一款由 C 语言编写的开源 NoSQL 数据库&#xff0c;采用分布式文件存储设计。作为介于关系型和非关系型数据库之间的产品&#xff0c;它是 NoSQL 数据库中最接近传统关系数据库的解决方案&#xff0c;同时保留了 NoSQL 的灵活性和扩展性。…

WebSocket 前端断连原因与检测方法

文章目录 前言WebSocket 前端断连原因与检测方法常见 WebSocket 断连原因及检测方式聊天系统场景下的断连问题与影响行情推送场景下的断连问题与影响React 前端应对断连的稳健策略自动重连机制的设计与节流控制心跳机制的实现与保持连接存活连接状态管理与 React 集成错误提示与…

2025年真实面试问题汇总(三)

线上数据库数据丢失如何恢复 线上数据库数据丢失的恢复方法需要根据数据丢失原因、备份情况及数据库类型&#xff08;如MySQL、SQL Server、PostgreSQL等&#xff09;综合处理&#xff0c;以下是通用的分步指南&#xff1a; 一、紧急止损&#xff1a;暂停写入&#xff0c;防止…