Spring-AI-上下文记忆

本文介绍了如何在SpringBoot项目中使用SpringAI的OpenAIstarter,并展示了如何通过POM文件配置依赖,以及在Controller中处理用户请求和上下文聊天信息。还提及了优化方案,如使用Redis替代存储机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 引入依赖
    pom文件

    <?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.2.4</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <!-- Generated by https://start.springboot.io -->
        <!-- 优质的 spring/boot/data/security/cloud 框架中文文档尽在 => https://springdoc.cn -->
        <groupId>com.example</groupId>
        <artifactId>spring-ai-demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>spring-ai-demo</name>
        <description>spring-ai-demo</description>
        <properties>
            <java.version>17</java.version>
            <spring-ai.version>0.8.1</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-openai-spring-boot-starter</artifactId>
            </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>
        <repositories>
            <repository>
                <id>spring-milestones</id>
                <name>Spring Milestones</name>
                <url>https://repo.spring.io/milestone</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
        </repositories>
    
    </project>
    
    
  2. 配置yml

    spring:
      ai:
        openai:
          api-key: #没有账号,可以在淘宝,2元购买key
          base-url: # 淘宝上会给你中转的url
        retry:
          max-attempts: 3
    
    
  3. Controller

    @RestController
    public class IndexController {
    		
    	// key:sessionId  value:会话聊天的上下文
        private static final Map<String, List<Message>> messageMap = new HashMap<>();
        @Resource
        private OpenAiChatClient chatClient;
    
        @GetMapping
        public String index(HttpSession session, @RequestParam(name = "message", defaultValue = "使用Java,写一个冒泡算法") String message) {
    	    // 检查是否已有会话
            List<Message> messageList = messageMap.get(session.getId());
            if (messageList == null) {
                messageList = new ArrayList<>();
                messageMap.put(session.getId(), messageList);
            }
            // 将用户消息,加入上下文
            messageList.add(messageList.size(), new UserMessage(message));
            // 发送消息时,传递的是上下文的所有信息,不单单是你当前发送的一条消息
            // 所有最好为list设置容量的限制,不然你的api-key的资源会消耗很快
            String result = chatClient.call(new Prompt(messageList)).getResult().getOutput().getContent();
            // 将ai消息,加入上下文
            messageList.add(messageList.size(), new AssistantMessage(result));
            return result;
        }
    }
    

    优化代码:(可以使用redis来代替 存储messageMap)
    OpenAiService.java

    /**
     * 记录上下文聊天信息
     */
    @Service
    public class OpenAiService {
    
        private static final Map<String, LinkedList<Message>> messageMap = new HashMap<>();
        @Resource
        private OpenAiChatClient chatClient;
    
        private void addUserMessage(LinkedList<Message> messageList, String message) {
            checkMessageCapacity(messageList);
            messageList.addLast(new UserMessage(message));
        }
    
        private void addAssistantMessage(LinkedList<Message> messageList, String message) {
            checkMessageCapacity(messageList);
            messageList.add(messageList.size(), new AssistantMessage(message));
        }
    
        public String chat(String sessionId, String message) {
            LinkedList<Message> messageList = messageMap.get(sessionId);
            if (messageList == null) {
                messageList = new LinkedList<>();
                messageMap.put(sessionId, messageList);
            }
            addUserMessage(messageList, message);
            String result = chatClient.call(new Prompt(messageList)).getResult().getOutput().getContent();
            addAssistantMessage(messageList, result);
            return result;
        }
    
        public void checkMessageCapacity(LinkedList<Message> messages) {
            if (messages.size() >= 10) {
                messages.removeFirst();
            }
        }
    }
    
    

    IndexController.java

    @RestController
    public class IndexController {
    
        @Resource
        private OpenAiService openAiService;
    
        @GetMapping
        public String index(HttpSession session, @RequestParam(name = "message", defaultValue = "使用Java,写一个冒泡算法") String message) {
            String result = "";
            synchronized (session.getId().intern()) {
                result = openAiService.chat(session.getId(), message);
            }
            return result;
        }
    }
    
    
### Spring Alibaba AI RAG 预设提示词失效解决方案 当遇到Spring Alibaba AI接入RAG(Retrieval-Augmented Generation)后预设提示词失效的情况时,可以从以下几个方面排查并解决问题: 配置文件检查对于确保提示词正常工作至关重要。确认`application.yml`或对应的环境变量中关于提示词路径以及加载方式的设置无误[^1]。 数据源同步延迟可能导致新加入或者更新过的文档未能及时被检索模块索引到,在这种情况下即使提供了正确的查询条件也无法获得预期的结果。因此建议优化向量数据库中的索引机制,比如调整Azure Vector Search的相关参数来加快索引速度和提高召回率。 针对特定场景下的对话历史记录管理不当也会引发类似问题。利用像QuestionAnswerAdvisor这样的工具可以有效地将上下文信息附加至每次请求之中,从而帮助模型更好地理解当前会话背景,进而给出更贴切的回答。 代码实现层面需要注意的是如何正确调用API接口传递这些自定义指令给底层服务处理。下面是一个简单的Java代码片段用于演示如何在发送消息前添加额外元数据: ```java // 设置提示词逻辑示例 public void setMessageWithPrompt(Message message, String promptContent){ Map<String,Object> metadata = new HashMap<>(); metadata.put("prompt", promptContent); message.setMetadata(metadata); } ``` 此外还需关注版本兼容性和依赖库之间的冲突可能带来的影响。保持所有组件处于最新稳定版通常有助于减少此类技术债务的发生概率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值