admin管理员组

文章数量:1130349

概述

在人工智能浪潮下,Java 程序员迎来了新的机遇与挑战。SpringAI 和阿里巴巴 AI(SpringAiAlibaba) 的推出,为我们打开了通往智能应用开发的大门。为了更好地学习和掌握 Spring AI Alibaba 项目的搭建与使用,我将通过本文详细记录整个学习过程。本次主要聚焦于多轮对话功能的实现,后续会逐步增加更多实用内容,也欢迎大家提出宝贵意见,共同完善。

依赖

  • 开发工具:IntelliJ IDEA(推荐使用最新版本,以获得更好的兼容性和功能支持)
  • JDK:17 及以上版本(可利用 IDEA 自带的 JDK,安装便捷且配置简单)
  • 阿里云百炼平台:阿里百炼平台(提供强大的 AI 模型支持和训练服务)
  • 如果大家在基础环境搭建方面遇到困难,可以参考我之前分享的一篇文章,里面详细介绍了搭建步骤,点击即可查看:学习 Spring AI Alibaba项目(一):搭建Hello world

流程:

配置 ChatMemory

在 Spring Boot 启动类 Application 中添加如下代码,用于创建一个基于内存的聊天模型,该模型将用于存储和管理多轮对话的上下文信息,确保对话的连贯性和逻辑性:

@SpringBootApplication
public class HelloSpringAiApplication {

    public static void main(String[] args) {
        SpringApplication.run(HelloSpringAiApplication.class, args);
    }

    /**
     * 创建一个基于内存的聊天模型
     */
    @Bean
    public ChatMemory chatMemory() {
        return new InMemoryChatMemory();
    }
}

创建controller文件 : ChatMemoryController

这里面注意这里可以设置用户ID等信息,咱们也就可以根据这个ID设置用户ID,以及会话ID,确保上下文连贯啦

// 调用 chatClient.prompt() 方法开始构建聊天请求
ChatClient.CallResponseSpec response = chatClient.prompt()
        // 调用 .user(input) 方法,将用户输入作为聊天请求的内容
        .user(input)
        // 调用 .advisors 方法,传入一个 Lambda 表达式,配置聊天顾问的参数
        .advisors(spec -> spec.param(AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY, userId)
                // 继续在 Lambda 表达式中调用 .param 方法,设置聊天记忆的检索大小为 100
                .param(AbstractChatMemoryAdvisor.CHAT_MEMORY_RETRIEVE_SIZE_KEY, 100))
        // 调用 .call() 方法执行聊天请求并获取响应规格
        .call();

全文如下:

@Slf4j
@RestController
@RequestMapping("/ai/v1")
public class ChatMemoryController {

    private final ChatClient chatClient;

    // 构造器中注入 ChatModel(底层与 AI 模型交互)和 ChatMemory(对话记忆实现)
    public ChatMemoryController(ChatModel chatModel, ChatMemory chatMemory) {
        // 使用 ChatClient.Builder 构建 ChatClient,同时加入对话记忆 Advisor
        this.chatClient = ChatClient.builder(chatModel)
                .defaultAdvisors(new MessageChatMemoryAdvisor(chatMemory))
                .build();
    }

    /**
     * 多轮对话接口
     * 每次调用时自动加载和更新该会话的历史记录。
     */
    @GetMapping("/multi/chat")
    public String chat(@RequestParam(value = "userId",defaultValue = "1001") String userId,
                       @RequestParam("input") String input) {
        log.info("/multi/chat   input:  [{}]", input);
        // 调用 chatClient.prompt() 方法开始构建聊天请求
        ChatClient.CallResponseSpec response = chatClient.prompt()
                // 调用 .user(input) 方法,将用户输入作为聊天请求的内容
                .user(input)
                // 调用 .advisors 方法,传入一个 Lambda 表达式,配置聊天顾问的参数
                .advisors(spec -> spec.param(AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY, userId)
                        // 继续在 Lambda 表达式中调用 .param 方法,设置聊天记忆的检索大小为 100
                        .param(AbstractChatMemoryAdvisor.CHAT_MEMORY_RETRIEVE_SIZE_KEY, 100))
                // 调用 .call() 方法执行聊天请求并获取响应规格
                .call();
        return response.content();
    }
}
  • 通过以上代码,我们成功创建了一个对外接口:http://127.0.0.1:8080/ai/v1/multi/chat。该接口接受两个参数:

    • userId:代表用户 ID,在实际项目中,建议将其设置为用户 ID 与会话 ID 的组合,以便更精准地区分不同用户的对话。
    • input:用户输入的问题或消息。

激动人心的时刻

我们来看看效果吧,马上启动服务,然后,就可以调用接口查看效果了

为了测试是否可以连续对话,我们继续提问这些诗人的出生地

看样子确实可以连续提问了,那么我们再验证下,换个用户来提问,是否会“串线”呢?我们把用户1001改为1002试试

结果显示,AI 并未出现“串线”现象,对于新用户的提问,它无法获取之前用户的对话信息,只能要求我们提供更详细的资料,这证明了我们的多轮对话系统在不同用户间是相互独立且安全的。

补充点内容

本次分享主要聚焦于多轮对话功能的实现,帮助大家快速搭建起基本的对话系统。下一篇内容,将研究实现“可持久化的多轮对话”,让对话记录能够长期保存,进一步提升项目的实用性和用户体验。相信这一功能会对大家的实际开发工作带来更大的帮助,让我们一起期待吧!

如果你在学习过程中有任何疑问、建议,或者想要交流更多关于 Spring AI Alibaba 项目的心得,欢迎在评论区留言。你的支持和反馈,将是我不断前进的动力!

概述

在人工智能浪潮下,Java 程序员迎来了新的机遇与挑战。SpringAI 和阿里巴巴 AI(SpringAiAlibaba) 的推出,为我们打开了通往智能应用开发的大门。为了更好地学习和掌握 Spring AI Alibaba 项目的搭建与使用,我将通过本文详细记录整个学习过程。本次主要聚焦于多轮对话功能的实现,后续会逐步增加更多实用内容,也欢迎大家提出宝贵意见,共同完善。

依赖

  • 开发工具:IntelliJ IDEA(推荐使用最新版本,以获得更好的兼容性和功能支持)
  • JDK:17 及以上版本(可利用 IDEA 自带的 JDK,安装便捷且配置简单)
  • 阿里云百炼平台:阿里百炼平台(提供强大的 AI 模型支持和训练服务)
  • 如果大家在基础环境搭建方面遇到困难,可以参考我之前分享的一篇文章,里面详细介绍了搭建步骤,点击即可查看:学习 Spring AI Alibaba项目(一):搭建Hello world

流程:

配置 ChatMemory

在 Spring Boot 启动类 Application 中添加如下代码,用于创建一个基于内存的聊天模型,该模型将用于存储和管理多轮对话的上下文信息,确保对话的连贯性和逻辑性:

@SpringBootApplication
public class HelloSpringAiApplication {

    public static void main(String[] args) {
        SpringApplication.run(HelloSpringAiApplication.class, args);
    }

    /**
     * 创建一个基于内存的聊天模型
     */
    @Bean
    public ChatMemory chatMemory() {
        return new InMemoryChatMemory();
    }
}

创建controller文件 : ChatMemoryController

这里面注意这里可以设置用户ID等信息,咱们也就可以根据这个ID设置用户ID,以及会话ID,确保上下文连贯啦

// 调用 chatClient.prompt() 方法开始构建聊天请求
ChatClient.CallResponseSpec response = chatClient.prompt()
        // 调用 .user(input) 方法,将用户输入作为聊天请求的内容
        .user(input)
        // 调用 .advisors 方法,传入一个 Lambda 表达式,配置聊天顾问的参数
        .advisors(spec -> spec.param(AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY, userId)
                // 继续在 Lambda 表达式中调用 .param 方法,设置聊天记忆的检索大小为 100
                .param(AbstractChatMemoryAdvisor.CHAT_MEMORY_RETRIEVE_SIZE_KEY, 100))
        // 调用 .call() 方法执行聊天请求并获取响应规格
        .call();

全文如下:

@Slf4j
@RestController
@RequestMapping("/ai/v1")
public class ChatMemoryController {

    private final ChatClient chatClient;

    // 构造器中注入 ChatModel(底层与 AI 模型交互)和 ChatMemory(对话记忆实现)
    public ChatMemoryController(ChatModel chatModel, ChatMemory chatMemory) {
        // 使用 ChatClient.Builder 构建 ChatClient,同时加入对话记忆 Advisor
        this.chatClient = ChatClient.builder(chatModel)
                .defaultAdvisors(new MessageChatMemoryAdvisor(chatMemory))
                .build();
    }

    /**
     * 多轮对话接口
     * 每次调用时自动加载和更新该会话的历史记录。
     */
    @GetMapping("/multi/chat")
    public String chat(@RequestParam(value = "userId",defaultValue = "1001") String userId,
                       @RequestParam("input") String input) {
        log.info("/multi/chat   input:  [{}]", input);
        // 调用 chatClient.prompt() 方法开始构建聊天请求
        ChatClient.CallResponseSpec response = chatClient.prompt()
                // 调用 .user(input) 方法,将用户输入作为聊天请求的内容
                .user(input)
                // 调用 .advisors 方法,传入一个 Lambda 表达式,配置聊天顾问的参数
                .advisors(spec -> spec.param(AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY, userId)
                        // 继续在 Lambda 表达式中调用 .param 方法,设置聊天记忆的检索大小为 100
                        .param(AbstractChatMemoryAdvisor.CHAT_MEMORY_RETRIEVE_SIZE_KEY, 100))
                // 调用 .call() 方法执行聊天请求并获取响应规格
                .call();
        return response.content();
    }
}
  • 通过以上代码,我们成功创建了一个对外接口:http://127.0.0.1:8080/ai/v1/multi/chat。该接口接受两个参数:

    • userId:代表用户 ID,在实际项目中,建议将其设置为用户 ID 与会话 ID 的组合,以便更精准地区分不同用户的对话。
    • input:用户输入的问题或消息。

激动人心的时刻

我们来看看效果吧,马上启动服务,然后,就可以调用接口查看效果了

为了测试是否可以连续对话,我们继续提问这些诗人的出生地

看样子确实可以连续提问了,那么我们再验证下,换个用户来提问,是否会“串线”呢?我们把用户1001改为1002试试

结果显示,AI 并未出现“串线”现象,对于新用户的提问,它无法获取之前用户的对话信息,只能要求我们提供更详细的资料,这证明了我们的多轮对话系统在不同用户间是相互独立且安全的。

补充点内容

本次分享主要聚焦于多轮对话功能的实现,帮助大家快速搭建起基本的对话系统。下一篇内容,将研究实现“可持久化的多轮对话”,让对话记录能够长期保存,进一步提升项目的实用性和用户体验。相信这一功能会对大家的实际开发工作带来更大的帮助,让我们一起期待吧!

如果你在学习过程中有任何疑问、建议,或者想要交流更多关于 Spring AI Alibaba 项目的心得,欢迎在评论区留言。你的支持和反馈,将是我不断前进的动力!

本文标签: 项目SpringAIAlibaba