前言
Spring 官方自从发布了 Spring AI,AI 界的门槛儿算是被彻底踹飞了!为什么?因为这就意味着整天只会 CRUD 的 Javaer 们也能开发AI应用了,而且简单到让你怀疑人生。那么本文就基于 Spring AI Alibaba 开发一个简单的 AI 对话应用。
效果展示
Spring AI 实现的AI对话
实现步骤
基于 Spring AI Alibaba 实现这样一个AI对话非常简单,只需要几行代码就可以完成。可以跟着下面的步骤操作:
创建一个 SpringBoot 项目
Spring AI Alibaba 提供了 SpringBoot starter。所以,第一步就是创建一个SpringBoot项目引入依赖以及配置。
pom.xml文件添加spring-ai-alibaba-starter依赖
application.yml添加;
配置中的api-key是阿里云百炼大模型平台的凭证,AI的实现最终会调用该模型。
api-key 申请
这里有两个事项需要注意:
- Spring AI Alibaba 基于 Spring Boot 3.x 开发,所以JDK 版本要求为 17 及以上。
- spring-ai 相关依赖包还没有发布到中央仓库,本地 Maven 仓库要添加以下配置。
编写与大模型交互的 Controller
项目创建成功之后,只需要写一个Controller就可以实现与AI对话,代码如下:
代码中的ChatClient类似于应用程序开发中的服务层,只不过这里由spring-ai-alibaba-starter自动初始化了实例,可以直接提供 AI 服务,最终会调用百炼大模型。
此时就可以启动应用,通过浏览器访问localhost:8080/ai/chat?message= 进行对话。
编写通过页面进行对话的 html
为了直观的展示效果,简单实现一个前端和接口交互,通过页面进行AI对话。
js 引入的 marked.min.js 可以去GitHub或者联系我获取。
至此,就实现了文中开头的AI对话效果。
需要了解的基本知识
上面的示例其实就是一个SpringBoot项目,对于Javaer肯定不陌生。而对于没有人工智能相关背景的人来说,如果想要基于 Spring AI 开发一个AI应用产品,还是需要了解一些基本概念的。
- AI 模型:AI 模型是旨在处理和生成信息的算法,通常模仿人类的认知功能。我们现在基本上听到的大模型都属于生成式AI模型,例如ChatGPT、文心一言、通义千问、混元、豆包等。
- Prompt:提示词作为生成式大模型的输入,可以指导模型生成特定的输出。如果搭建过智能体就会知道,创建一个智能体首先要设置一些提示词。
- Token:token作为 AI 模型工作原理的基石,输入时,模型将单词转换为token,输出时,将token转换回单词。在现在的AI模型背景下,token就相当于金钱,一次调用的费用就越高。
- 模型的认知:一个模型的诞生需要在海量的训练集中进行学习,所以它的认知中没有未来的知识。如果想让模型对现有知识产生认知,有微调、检索增强生成 (RAG)、函数调用这几种方式。
对于本文示例中来说,每一次的对话就是模型的一次token输入和输出。
实现有记忆的对话
如果运行了上面的示例,并且进行了几轮对话,会发现大模型并不会理解上下文,也无法实现连贯的对话。
就如上面所说的“模型的认知”,大模型不会记录对话,所以不会产生上下文关联。例如我接下来的问答中,并没有按照我的提问生成“冒险的”故事,只是“冒险的”进行了说明。
Spring AI 实现的AI对话
那如何让大模型能够追踪、理解并利用先前对话上下文的能力?
spring-ai 支持基于chat memory的对话记忆。在上面的代码中,只需要在构建chatClient时添加两行代码。
UUID 会作为此次对话的唯一标识,ChatMemory会将之前的对话内容记录下来,每次对模型的输入就是历史的对话记录,最终实现对话记忆。
这种做法最终会影响使用大模型的成本,就如上面所说,输入和输出都会影响总token数量,而token就相当于金钱。
总结
Spring AI解决了AI集成的核心难题:即无缝连接企业数据、API与AI模型,同时也简化了Java 开发人员对AI应用的编程复杂度,还提供检索增强生成 (RAG)、函数调用等关键功能。对于Java 开发人员来讲,通过 Spring AI 可以探索更多的 AI 应用场景。