SpringAI入门:对话呆板人

打印 上一主题 下一主题

主题 1878|帖子 1878|积分 5634

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
SpringAI入门:对话呆板人

1.引入依靠

创建一个新的SpringBoot工程,勾选Web、MySQL驱动、Ollama:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4.     <modelVersion>4.0.0</modelVersion>
  5.     <parent>
  6.         <groupId>org.springframework.boot</groupId>
  7.         <artifactId>spring-boot-starter-parent</artifactId>
  8.         <version>3.4.4</version>
  9.         <relativePath/> <!-- lookup parent from repository -->
  10.     </parent>
  11.     <groupId>com.shisan</groupId>
  12.     <artifactId>chat-robot</artifactId>
  13.     <version>0.0.1-SNAPSHOT</version>
  14.     <name>chat-robot</name>
  15.     <description>chat-robot</description>
  16.     <url/>
  17.     <licenses>
  18.         <license/>
  19.     </licenses>
  20.     <developers>
  21.         <developer/>
  22.     </developers>
  23.     <scm>
  24.         <connection/>
  25.         <developerConnection/>
  26.         <tag/>
  27.         <url/>
  28.     </scm>
  29.     <properties>
  30.         <java.version>17</java.version>
  31.         <spring-ai.version>1.0.0-M6</spring-ai.version>
  32.     </properties>
  33.     <dependencies>
  34.         <dependency>
  35.             <groupId>org.springframework.boot</groupId>
  36.             <artifactId>spring-boot-starter-web</artifactId>
  37.         </dependency>
  38.         <dependency>
  39.             <groupId>org.springframework.ai</groupId>
  40.             <artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
  41.         </dependency>
  42.         <dependency>
  43.             <groupId>com.mysql</groupId>
  44.             <artifactId>mysql-connector-j</artifactId>
  45.             <scope>runtime</scope>
  46.         </dependency>
  47.         <dependency>
  48.             <groupId>org.springframework.boot</groupId>
  49.             <artifactId>spring-boot-starter-test</artifactId>
  50.             <scope>test</scope>
  51.         </dependency>
  52.     </dependencies>
  53.     <dependencyManagement>
  54.         <dependencies>
  55.             <dependency>
  56.                 <groupId>org.springframework.ai</groupId>
  57.                 <artifactId>spring-ai-bom</artifactId>
  58.                 <version>${spring-ai.version}</version>
  59.                 <type>pom</type>
  60.                 <scope>import</scope>
  61.             </dependency>
  62.         </dependencies>
  63.     </dependencyManagement>
  64.     <build>
  65.         <plugins>
  66.             <plugin>
  67.                 <groupId>org.springframework.boot</groupId>
  68.                 <artifactId>spring-boot-maven-plugin</artifactId>
  69.             </plugin>
  70.         </plugins>
  71.     </build>
  72. </project>
复制代码
SpringAI完全适配了SpringBoot的自动装配功能,而且给差别的大模型提供了差别的starter比如:
1. Anthropic(Claude模型)

  1. <dependency>
  2.     <groupId>org.springframework.ai</groupId>
  3.     <artifactId>spring-ai-anthropic-spring-boot-starter</artifactId>
  4. </dependency>
复制代码

2. Azure OpenAI

  1. dependency>
  2.     <groupId>org.springframework.ai</groupId>
  3.     <artifactId>spring-ai-azure-openai-spring-boot-starter</artifactId>
  4. </dependency>
复制代码

3. DeepSeek(兼容 OpenAI 协议)

   实际上 DeepSeek 使用的是 OpenAI 接口协议,因此使用 OpenAI 的 starter。
  1. <dependency>
  2.     <groupId>org.springframework.ai</groupId>
  3.     <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
  4. </dependency>
复制代码

4. Hugging Face

  1. <dependency>
  2.     <groupId>org.springframework.ai</groupId>
  3.     <artifactId>spring-ai-huggingface-spring-boot-starter</artifactId>
  4. </dependency>
复制代码

5. Ollama(当地摆设的 LLM,比如 LLaMA3、Mistral)

  1. <dependency>
  2.     <groupId>org.springframework.ai</groupId>
  3.     <artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
  4. </dependency>
复制代码

6. OpenAI(ChatGPT / GPT-4 等)

  1. <dependency>
  2.     <groupId>org.springframework.ai</groupId>
  3.     <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
  4. </dependency>
复制代码
2.配置模型信息

  1. spring:
  2.   application:
  3.     name: chart-robot
  4.   ai:
  5.     ollama:
  6.       base-url: http://localhost:11434 # ollama服务地址, 这就是默认值
  7.       chat:
  8.         model: deepseek-r1:14b # 模型名称
  9.         options:
  10.           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实例,或者以编程方式创建一个。
  1.   @Bean
  2.     public ChatClient chatClient(OllamaChatModel model) {
  3.         return ChatClient.builder(model) // 创建ChatClient工厂
  4.                 .build(); // 构建ChatClient实例
  5.     }
复制代码
2.使用自动配置的 ChatClient.Builder

  1. @RestController
  2. class MyController {
  3.     private final ChatClient chatClient;
  4.     public MyController(ChatClient.Builder chatClientBuilder) {
  5.         this.chatClient = chatClientBuilder.build();
  6.     }
  7.     @GetMapping("/ai")
  8.     String generation(String userInput) {
  9.         return this.chatClient.prompt()
  10.             .user(userInput)
  11.             .call()
  12.             .content();
  13.     }
  14. }
复制代码
在这个简单的示例中,用户输入设置用户消息的内容。 这call()method 向 AI 模型发送请求,并且content()方法将 AI 模型的相应作为String.
3.流式相应

这stream()method 答应你获得异步相应,如下所示:
  1. Flux<String> output = chatClient.prompt()
  2.     .user("Tell me a joke")
  3.     .stream()
  4.     .content();
复制代码
4.Advisors API

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


  • SimpleLoggerAdvisor:日记记录的Advisor;
  • MessageChatMemoryAdvisor:会话影象的Advisor;
  • QuestionAnswerAdvisor:实现RAG的Advisor;
  1. @Bean
  2. public ChatClient chatClient(OllamaChatModel model) {
  3.     return ChatClient
  4.         .builder(model)
  5.         .defaultAdvisors(new SimpleLoggerAdvisor()) // 添加默认的Advisor,记录日志
  6.         .build(); // 构建ChatClient实例
  7. }
复制代码
  1. logging:
  2.   level:
  3.     org.springframework.ai.chat.client.advisor: debug # AI对话的日志级别
  4.     com.heima.ai: debug # 本项目的日志级别
复制代码
将 advisor 添加到链中的顺序至关紧张,由于它决定了它们的执行顺序。每个 advisor 都以某种方式修改 prompt 或 context,并且一个 advisor 所做的更改将传递给链中的下一个 advisor。
5.会话影象

ChatMemory表现聊天对话汗青记录的存储。它提供了向对话添加消息、从对话中检索消息以及清除对话汗青记录的方法。
现在有两种实现:InMemoryChatMemory和CassandraChatMemory,它们为聊天对话汗青记录提供存储,内存和time-to-live相应。
1.添加会话影象Advisor

  1. @Bean
  2. public ChatMemory chatMemory() {
  3.     return new InMemoryChatMemory();
  4. }
复制代码
2.配置chatclient

  1.   @Bean
  2.     public ChatClient chatClient(AlibabaOpenAiChatModel model, ChatMemory chatMemory) {
  3.         return ChatClient
  4.                 .builder(model)
  5.                 .defaultSystem("你是一个热心、可爱的智能助手,你的名字叫小团团,请以小团团的身份和语气回答问题。")
  6.                 .defaultAdvisors(
  7.                         new SimpleLoggerAdvisor(),
  8.                         new MessageChatMemoryAdvisor(chatMemory)
  9.                 )
  10.                 .build();
  11.     }
复制代码
重点是会话id
  1.     /**
  2.      * 发起流式对话请求
  3.      * @param prompt 用户输入
  4.      * @param chatId 会话ID(用于上下文记忆)
  5.      * @return 响应流
  6.      */
  7.     @GetMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE)
  8.     public Flux<String> chat(@RequestParam String prompt,
  9.                              @RequestParam String chatId) {
  10.         return chatClient.prompt()
  11.                 .user(prompt)
  12.                 .advisors(a -> a.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId))
  13.                 .stream()
  14.                 .content();
  15.     }
复制代码
6.会话汗青



  • 会话影象:是指让大模型记住每一轮对话的内容,不至于前一句刚问完,下一句就忘了;
  • 会话汗青:是指要记录总共有多少差别的对话;
这边可以本身根据具体场景实现,紧张有两个接口
1.查询某个用户的会话汗青
2.查询某个会话的对话

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

老婆出轨

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表