当前位置: 首页 > java >正文

SpringAI入门:对话机器人

SpringAI入门:对话机器人

1.引入依赖

创建一个新的SpringBoot工程,勾选Web、MySQL驱动、Ollama:

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.4.4</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.shisan</groupId><artifactId>chat-robot</artifactId><version>0.0.1-SNAPSHOT</version><name>chat-robot</name><description>chat-robot</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>17</java.version><spring-ai.version>1.0.0-M6</spring-ai.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-ollama-spring-boot-starter</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>${spring-ai.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

SpringAI完全适配了SpringBoot的自动装配功能,而且给不同的大模型提供了不同的starter比如:

1. Anthropic(Claude模型)

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-anthropic-spring-boot-starter</artifactId>
</dependency>

2. Azure OpenAI

dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-azure-openai-spring-boot-starter</artifactId>
</dependency>

3. DeepSeek(兼容 OpenAI 协议)

实际上 DeepSeek 使用的是 OpenAI 接口协议,因此使用 OpenAI 的 starter。

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>

4. Hugging Face

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-huggingface-spring-boot-starter</artifactId>
</dependency>

5. Ollama(本地部署的 LLM,比如 LLaMA3、Mistral)

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

6. OpenAI(ChatGPT / GPT-4 等)

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>

2.配置模型信息

spring:application:name: chart-robotai:ollama:base-url: http://localhost:11434 # ollama服务地址, 这就是默认值chat:model: deepseek-r1:14b # 模型名称options:temperature: 0.8 # 模型温度,影响模型生成结果的随机性,越小越稳定

3.聊天客户端 API

ChatClient提供用于与 AI 模型通信的 Fluent API。 它支持同步和流式编程模型。

Fluent API 具有构建 Prompt 的组成部分的方法,这些部分作为输入传递给 AI 模型。 这Prompt包含指导 AI 模型的输出和行为的说明文本。从 API 的角度来看,提示由一组消息组成。

AI 模型处理两种主要类型的消息:用户消息(来自用户的直接输入)和系统消息(由系统生成以指导对话)。

这些消息通常包含占位符,这些占位符在运行时根据用户输入进行替换,以自定义 AI 模型对用户输入的响应。

还有一些可以指定的 Prompt 选项,例如要使用的 AI 模型的名称以及控制生成输出的随机性或创造性的温度设置。

1.创建 ChatClient

ChatClient是使用ChatClient.Builder对象。 您可以获取自动配置的ChatClient.Builder实例,或者以编程方式创建一个。

  @Beanpublic ChatClient chatClient(OllamaChatModel model) {return ChatClient.builder(model) // 创建ChatClient工厂.build(); // 构建ChatClient实例}

2.使用自动配置的 ChatClient.Builder

@RestController
class MyController {private final ChatClient chatClient;public MyController(ChatClient.Builder chatClientBuilder) {this.chatClient = chatClientBuilder.build();}@GetMapping("/ai")String generation(String userInput) {return this.chatClient.prompt().user(userInput).call().content();}
}

在这个简单的示例中,用户输入设置用户消息的内容。 这call()method 向 AI 模型发送请求,并且content()方法将 AI 模型的响应作为String.

3.流式响应

stream()method 允许你获得异步响应,如下所示:

Flux<String> output = chatClient.prompt().user("Tell me a joke").stream().content();

4.Advisors API

SpringAI基于AOP机制实现与大模型对话过程的增强、拦截、修改等功能,所有的增强通知都需要实现Advisor接口;Spring提供了一些Advisor的默认实现,来实现一些基本的增强功能

  • SimpleLoggerAdvisor:日志记录的Advisor;
  • MessageChatMemoryAdvisor:会话记忆的Advisor;
  • QuestionAnswerAdvisor:实现RAG的Advisor;
@Bean
public ChatClient chatClient(OllamaChatModel model) {return ChatClient.builder(model).defaultAdvisors(new SimpleLoggerAdvisor()) // 添加默认的Advisor,记录日志.build(); // 构建ChatClient实例
}
logging:level:org.springframework.ai.chat.client.advisor: debug # AI对话的日志级别com.heima.ai: debug # 本项目的日志级别

将 advisor 添加到链中的顺序至关重要,因为它决定了它们的执行顺序。每个 advisor 都以某种方式修改 prompt 或 context,并且一个 advisor 所做的更改将传递给链中的下一个 advisor。

5.会话记忆

ChatMemory表示聊天对话历史记录的存储。它提供了向对话添加消息、从对话中检索消息以及清除对话历史记录的方法。

目前有两种实现:InMemoryChatMemoryCassandraChatMemory,它们为聊天对话历史记录提供存储,内存和time-to-live相应。

1.添加会话记忆Advisor

@Bean
public ChatMemory chatMemory() {return new InMemoryChatMemory();
}

2.配置chatclient

  @Beanpublic ChatClient chatClient(AlibabaOpenAiChatModel model, ChatMemory chatMemory) {return ChatClient.builder(model).defaultSystem("你是一个热心、可爱的智能助手,你的名字叫小团团,请以小团团的身份和语气回答问题。").defaultAdvisors(new SimpleLoggerAdvisor(),new MessageChatMemoryAdvisor(chatMemory)).build();}

重点是会话id

    /*** 发起流式对话请求* @param prompt 用户输入* @param chatId 会话ID(用于上下文记忆)* @return 响应流*/@GetMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE)public Flux<String> chat(@RequestParam String prompt,@RequestParam String chatId) {return chatClient.prompt().user(prompt).advisors(a -> a.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId)).stream().content();}

6.会话历史

  • 会话记忆:是指让大模型记住每一轮对话的内容,不至于前一句刚问完,下一句就忘了;
  • 会话历史:是指要记录总共有多少不同的对话;

这边可以自己根据具体场景实现,主要有两个接口

1.查询某个用户的会话历史

2.查询某个会话的对话

http://www.xdnf.cn/news/86.html

相关文章:

  • 初识Redis · C++客户端string
  • 360蜘蛛IP完整版,360搜索引擎蜘蛛IP列表.pdf
  • 第24周:Resnet结合DenseNet
  • PHP使用pandoc把markdown文件转为word
  • Manim教程:第七章 坐标系统
  • Docker安装hoppscotch
  • 【“星瑞” O6 评测】—NPU 部署 face parser 模型
  • mysql数据库基础
  • 从零构建 Vue3 登录页:结合 Vant 组件与 Axios 实现完整登录功能
  • 010301-cdn_waf-web扩展1-基础入门-网络安全
  • 云计算(Cloud Computing)概述——从AWS开始
  • 设计模式之工厂方法模式
  • 文件编码检测与转换:从自定义实现到 ICU 应用
  • Linux网络通信核心机制解析与层级架构探秘
  • 华为OD机试真题——统计匹配的二元组个数(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
  • list的使用
  • Linux,redis数据库安装使用
  • 24-25【动手学深度学习】AlexNet + Vgg
  • 数据结构之队列及其应用
  • 项目优化中ini配置文件解析器
  • Linux网络编程实战:从字节序到UDP协议栈的深度解析与开发指南
  • MQTT客户端核心架构解析:clients.h源码深度解读
  • LeetCode hot 100—单词搜索
  • 【限流算法】计数器、漏桶、令牌桶算法
  • Linux中docker容器拉取镜像失败解决方案
  • git撤销提交
  • 从原理到实践:NFS复杂故障处理方法论
  • 【工具-Krillin AI】视频翻译、配音、语音克隆于一体的一站式视频多语言转换工具~
  • HTTP 3.0 协议的特点
  • 使用python帮助艺术家完成角色动画和服装模型等任务