Spring AI,搭建个人AI助手

本文涉及的产品
性能测试 PTS,5000VUM额度
云原生网关 MSE Higress,422元/月
应用实时监控服务-用户体验监控,每月100OCU免费额度
简介: 本期主要是实操性内容,聊聊AI大模型,并使用Spring AI搭建属于自己的AI助手、知识库。本期所需的演示源码笔者托管在Gitee上(https://gitee.com/catoncloud/spring-ai-demo),读者朋友可自行查阅。

Hi~,各位读者朋友们,我是笠泱,感谢您阅读到本文。今天这期整点实操性内容,聊聊AI大模型,并使用Spring AI搭建属于自己的AI助手、知识库。本期内容灵感来源于B站@雷丰阳直播课(B站:https://www.bilibili.com/video/BV11b421h7uX;雷神个人语雀:https://www.yuque.com/leifengyang

本期所需的演示源码笔者托管在Gitee上(https://gitee.com/catoncloud/spring-ai-demo),读者朋友可自行查阅。

本期导语

近两年AI、ChatGPT、大模型已成为热点词,随着2022年11月30日OpenAI发布ChatGPT后,AI得到空前的关注和应用。说句毫不夸张的话:目前获取大模型如同获取容器镜像一样快速、便捷、多样,大模型已然下沉至基础设施层,不远的将来AI很快会成为各行业的标配

从TIOBE发布的编程语言指数图我们也不难看出Python这门开发语言在近些年一直处于增长态势,很大因素是因为AI、机器学习的发展。

上图源于https://www.tiobe.com/tiobe-index

什么是Spring AI

咱们先来看Spring官网(https://spring.io/projects/spring-ai)原文描述:

Spring AI is an application framework for AI engineering. Its goal is to apply to the AI domain Spring ecosystem design principles such as portability and modular design and promote using POJOs as the building blocks of an application to the AI domain.

At its core, Spring AI addresses the fundamental challenge of AI integration: Connecting your enterprise Data and APIs with the AI Models.

翻译拓展即:首先Spring是目前世界上最受欢迎的Java框架,而Spring AI是Spring下许多子项目的其中一个,是一个专门用于人工智能工程的框架。其目标是应用 Spring 生态系统设计原则,如可移植性和模块化设计,并将使用 POJOs 作为应用程序构建块的理念推广到人工智能领域。Spring AI 的核心是解决 AI 集成的根本挑战:将您的企业数据和 API 与 AI 模型连接起来。

换句话讲,Spring AI不是去开发AI模型本身,而是一个“缝合怪”,通过调用各种AI大模型的API实现AI集成。

注:近些年一些新兴的开发语言(比如Golang)发展迅猛,虽然网上许多IT人士“夸”Go“贬”Java,但Java在当下企业生产环境仍是最主要的开发语言之一,Java因拥有Spring这一庞大生态,也在不断发展,至少还能再战二十年。

获取OpenAI api-key

由于某些限制,OpenAI的API接口在国内网络环境下无法连通,一般有两种解决方案:1、使用“魔法”;2、使用国内AI中转商做代理。

笔者推荐您使用方案二,国内OpenAI API中转推荐网站:https://api.xty.app/register?aff=nlWR,有兴趣的读者可以访问网址自行注册,有0.2刀的免费体验额度。

注册成功后创建一个api-key并复制备存,下文搭建会使用到。

基于OpenAI搭建在线聊天AI

参考Spring官网文档:https://docs.spring.io/spring-ai/reference/1.0/api/chat/openai-chat.html

第一步:为加速Maven依赖包下载,Maven配置文件settings.xml建议做如下调整:

<mirror>
  <id>aliyunmaven</id>
  <mirrorOf>*,!spring-milestones</mirrorOf>
  <name>阿里云公共仓库</name>
  <url>https://maven.aliyun.com/repository/public</url>
</mirror>
<repository>
  <id>spring-milestones</id>
  <name>spring-milestones</name>
  <url>https://repo.spring.io/milestone</url>
  <releases>
  <enabled>true</enabled>
  </releases>
  <snapshots>
  <enabled>true</enabled>
  </snapshots>
</repository>

第二步:创建一个Maven项目,必须使用JDK 17即以上版本,勾选Spring Web和Open AI,会在项目的pom.xml文件自动引入所需依赖。

第三步:配置application.properties

#OpenAI chat
spring.ai.openai.base-url=https://api.xty.app
#需替换为您自己的api-key
spring.ai.openai.api-key=YOUR_API_KEY
spring.ai.openai.chat.options.model=gpt-3.5-turbo

第四步:创建Controller

package com.example.ai.controller;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import java.util.Map;
@CrossOrigin(origins = "*") // 允许所有来源的跨域请求
@RestController
public class OpenAIChatController {
    private final OpenAiChatModel chatModel;
    @Autowired
    public OpenAIChatController(OpenAiChatModel chatModel) {
        this.chatModel = chatModel;
    }
    @GetMapping("/ai/chat/generate")
    public Map<String,String> generate(@RequestParam(value = "message", defaultValue = "请介绍下你自己") String message) {
        return Map.of("generation", this.chatModel.call(message));
    }
    
    //使用流输出模式
    @GetMapping(value = "/ai/chat/generateStream",produces = "text/plain;charset=utf-8")
    //@GetMapping(value = "/ai/generateStream",produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<String> generateStream(@RequestParam(value = "message", defaultValue = "讲一个笑话") String message) {
        //Prompt prompt = new Prompt(new UserMessage(message));//使用提示词生成prompt
        //return this.chatModel.stream(prompt);
        Flux<String> stream = chatModel.stream(message);
        return stream;
    }
}

第五步:运行项目,本机浏览器访问http://localhost:8080/ai/chat/generate或http://localhost:8080/ai/chat/generateStream

默认会让AI输出一个笑话,或者您可以给定message参数,访问http://localhost:8080/ai/chat/generateStream?message=输入你想问AI的问题

测试效果如下:

通过上述步骤搭建出了一个非常简易的聊天对话AI,咱们还可以给其套一个精美的前端UI界面,处理好流传输顺序、历史对话记录等问题让其更像平常见到的ChatGPT,笔者这里就不过多再演示(其实是作者不熟悉前端[dog]),有兴趣的读者可以自行编写下前端代码。

基于OpenAI搭建文生图AI

参考Spring官网文档:https://docs.spring.io/spring-ai/reference/1.0/api/image/openai-image.html

第一步:配置application.properties

#OpenAI images
#若不做配置也有默认值,参数说明可参阅Spring官网文档
spring.ai.openai.image.enabled=true
spring.ai.openai.image.options.model=dall-e-3

第一步:创建Controller

package com.example.ai.controller;
import org.springframework.ai.image.Image;
import org.springframework.ai.image.ImagePrompt;
import org.springframework.ai.image.ImageResponse;
import org.springframework.ai.openai.OpenAiImageModel;
import org.springframework.ai.openai.OpenAiImageOptions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class OpenAIImageController {
    @Autowired
    OpenAiImageModel openaiImageModel;
    @GetMapping(value = "/ai/image/generate",produces = "text/html;charset=utf-8")
    public String generateImage(String prompt) {
        /**
        ImageResponse response = openaiImageModel.call(
                new ImagePrompt(prompt,
                        OpenAiImageOptions.builder()
                                .quality("hd")
                                .N(4)
                                .height(1024)
                                .width(1024).build())
        );
         */
        ImageResponse response = openaiImageModel.call(
                new ImagePrompt(prompt)
        );
        Image output = response.getResult().getOutput();
        String url = output.getUrl();
        String b64Json = output.getB64Json();
        //return url;
        return "<img src='"+url+"'/>";
    }
}

第三步:运行项目,本机浏览器访问http://localhost:8080/ai/image/generate?prompt=输入您需要生图提示词

测试效果如下:

基于Ollama搭建本地聊天AI

前文小试牛刀,借助OpenAI套壳搭建了ChatGPT和文生图AI,那咱们是否可以拥有自己的大模型,存放在自己的服务器上,做一个私有化的AI呢?答案是可以的,而且AI大模型发展至今,各式各样的大模型数不胜数,笔者在此也推荐喜欢AI、机器学习的读者朋友参阅加入时下最火热的AI社区HuggingFace(官网:https://huggingface.co)需要自备“魔法”才能访问此网址。

注:‌Hugging Face是一个专注于自然语言处理(NLP)的开源社区和公司,提供大量的预训练模型、数据集和工具,帮助用户加速机器学习项目的开发。‌

Hugging Face成立于2016年,总部位于纽约,最初是一家聊天机器人初创服务商,后来转型为提供机器学习模型和数据集托管的平台。该平台汇聚了大量预训练的模型以及相关的工具和资源,这些模型经过大规模数据的训练,可用于文本分类、情感分析、机器翻译、文本生成等NLP任务。

Hugging Face不仅是一个开源平台,也是一个活跃的社区,吸引了包括MetaGoogleMicrosoftAmazon等超过5000家组织机构贡献代码、数据集和模型。目前,Hugging Face托管了超过320,000个模型和50,000个数据集,支持文本、图像、视频、音频等多种模态的机器学习任务。

另外一个时下比较火热的大模型托管平台Ollama(官网:https://ollama.com),类似与容器镜像仓库平台Docker,只是Ollama是一个大模型仓库。先下载安装好Ollama

Ollama上有众多模型,笔者选择Meta的llama3:8b模型作为演示,读者朋友可以根据自己兴趣选择其他大模型。

当执行完ollama run llama3等待模型跑起来后可以在本机访问http://localhost:11434 验证ollama是否运行正常

预期输出应为

话不多说,下面开始代码演示:

参考Spring官网文档:https://docs.spring.io/spring-ai/reference/1.0/api/chat/ollama-chat.html

第一步:在pom.xml中添加ollama依赖

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

第二步:配置application.properties

#Ollama
spring.ai.ollama.base-url=http://localhost:11434 //配置本地ollama API接口
spring.ai.ollama.chat.options.model=llama3
spring.ai.ollama.chat.options.temperature=0.8

第三步:创建Controller

package com.example.ai.controller;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import java.util.Map;
@RestController
public class OllamaChatController {
    private final OllamaChatModel chatModel;
    @Autowired
    public OllamaChatController(OllamaChatModel chatModel) {
        this.chatModel = chatModel;
    }
    /**
    @GetMapping("/ai/ollama/generate")
    public Map<String,String> generate(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
        return Map.of("generation", this.chatModel.call(message));
    }
    @GetMapping("/ai/ollama/generateStream")
    public Flux<ChatResponse> generateStream(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
        Prompt prompt = new Prompt(new UserMessage(message));
        return this.chatModel.stream(prompt);
    }
    */
    @GetMapping("/ai/ollama/generate")
    public String generate(String message) {
        String call = chatModel.call(message);
        return call;
    }
}

第四步:运行项目,本机浏览器访问http://localhost:8080/ai/ollama/generate?message=您需要输入的问题

测试效果如下:

基于Ollama搭建RAG知识库

AI问答式知识库一般有两种解决方案:  其一,自己开发和预训练个性化知识库大模型;其二,利用现有大模型,给其喂语料数据让其结合上下文总结归纳输出答案。这两种方案各有利弊,方案一训练后的大模型回答问题响应速度快,但若有新的知识更新,需要重新训练模型;方案二虽然生成答案的响应速度慢,但是做到了知识库和大模型解耦,理论上可以快速且无限更新知识库。

什么是RAG

RAG(Retrieval-Augmented Generation),译为检索增强生成,是一种创新的AI模式,它结合了检索技术和生成技术,检索指的是检索外部知识库(语料)。增强生成指的是将检索到的知识送给大语言模型以此来优化大模型的生成结果,使得大模型在生成更精确、更贴合上下文的回答或内容,广泛应用于智能客服、内容创作、知识管理等多个领域。其整体工作流程如下:

通过上图可以看到要实现RAG除了AI大模型外,还需要向量数据库来存放语料切片,目前AI生态已非常成熟,有不少开源的解决方案,比如AnythingLLM(官网:https://anythingllm.com)可以通过桌面端UI界面、向量数据库、上传知识库文档、本地API接口等功能。

使用AnythingLLM桌面端访问

第一步:打开AnythingLLM,点击扳手图标配置,LLM首选项选择本地Ollama模型,向量数据库选择AnythingLLM自带的LanceDB即可,记得点击保存更改。

第二步:新建工作区

我们可以在未上传语料前测试下本地AI回答问题,比如问:笠泱是谁? 发现AI不知道笔者是谁,回答不尽人意。

第三步:上传语料,上传笔者之前发表的“写在最前的话”URL链接和随便编辑的自我介绍.txt

第四步:语料上传成功后,我们再来问AI一些问题,可以明显看到通过喂语料,AI输出的答案更加精确,还能结合上下文、语料进行归纳总结,读者朋友们这东西是不是很强,有了这样的AI助理,脑海里是不是蹦出了许多点子,他可以帮你写文案、做策划、做题、学习模仿你的语言或行为等等。

使用Web端访问

既然有开源的桌面端,那是否有Web版呢?甚至可以将web发布至公网,通过互联网我们就可以随时随地访问到自己个人AI助理。Ollama提供了许多开源社区解决方案(GitHub:https://github.com/ollama/ollama

笔者就以第一个open-webui为例演示,使用docker方式快速启动open-webui

参考https://github.com/open-webui/open-webui

等容器启动后处于healthy状态,即可访问open-webui的3000端口

测试效果如下:

云厂商RAG解决方案

嫌折腾的读者朋友还可以直接掏钱使用云厂商提供的全套RAG解决方案,比如阿里云的RAG解决方案(https://www.aliyun.com/solution/tech-solution/

本期结语

通过本期内容,我们可以看到现在AI发展仍然处于爆发期,纷繁多样的大模型,如此发展下去AI注定会成为基础设施层,也是云计算3.0时代新的增长点,为AI提供云端算力。未来,AI算法工程师们只需研发更合适更强大的算法或模型,交由AI厂商用其庞大、精炼的参数去训练大模型并发布,下游产业消费大模型,满足各行各业、企业、用户的需求。

最后,感谢您的阅读!系列文章会同步在微信公众号@云上的喵酱、阿里云开发者社区@云上的喵酱、CSDN@笠泱 更新,您的点赞+关注+转发是我后续更新的动力!

相关文章
|
13天前
|
人工智能 安全 Java
AI 时代:从 Spring Cloud Alibaba 到 Spring AI Alibaba
本次分享由阿里云智能集团云原生微服务技术负责人李艳林主讲,主题为“AI时代:从Spring Cloud Alibaba到Spring AI Alibaba”。内容涵盖应用架构演进、AI agent框架发展趋势及Spring AI Alibaba的重磅发布。分享介绍了AI原生架构与传统架构的融合,强调了API优先、事件驱动和AI运维的重要性。同时,详细解析了Spring AI Alibaba的三层抽象设计,包括模型支持、工作流智能体编排及生产可用性构建能力,确保安全合规、高效部署与可观测性。最后,结合实际案例展示了如何利用私域数据优化AI应用,提升业务价值。
|
15天前
|
人工智能 安全 Dubbo
Spring AI 智能体通过 MCP 集成本地文件数据
MCP 作为一款开放协议,直接规范了应用程序如何向 LLM 提供上下文。MCP 就像是面向 AI 应用程序的 USB-C 端口,正如 USB-C 提供了一种将设备连接到各种外围设备和配件的标准化方式一样,MCP 提供了一个将 AI 模型连接到不同数据源和工具的标准化方法。
|
13天前
|
人工智能 Java API
阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手
本次分享的主题是阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手,由阿里云两位工程师分享。
阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手
|
1月前
|
人工智能 前端开发 Java
Spring AI Alibaba + 通义千问,开发AI应用如此简单!!!
本文介绍了如何使用Spring AI Alibaba开发一个简单的AI对话应用。通过引入`spring-ai-alibaba-starter`依赖和配置API密钥,结合Spring Boot项目,只需几行代码即可实现与AI模型的交互。具体步骤包括创建Spring Boot项目、编写Controller处理对话请求以及前端页面展示对话内容。此外,文章还介绍了如何通过添加对话记忆功能,使AI能够理解上下文并进行连贯对话。最后,总结了Spring AI为Java开发者带来的便利,简化了AI应用的开发流程。
419 0
|
24天前
|
人工智能 自然语言处理 Java
Spring Cloud Alibaba AI 入门与实践
本文将介绍 Spring Cloud Alibaba AI 的基本概念、主要特性和功能,并演示如何完成一个在线聊天和在线画图的 AI 应用。
253 7
|
1月前
|
存储 人工智能 运维
AI导购革命:揭秘主动式智能导购AI助手的构建之道
本文基于《主动式智能导购AI助手构建》解决方案的实际部署体验,从引导与文档帮助、解决方案原理与架构理解、百炼大模型及函数计算应用明晰度、生产环境步骤指导四个方面进行了详细评估。指出尽管该方案具有创新性和实用性,但在文档详尽性、技术细节解释及生产环境适应性等方面仍有待提升。通过进一步优化,可增强解决方案的可用性和用户满意度。
123 31
|
1月前
|
存储 人工智能 Serverless
AI助手测评 | 3步快速构建主动式智能导购AI助手
本文介绍了如何利用阿里云的百炼平台构建主动式智能导购AI助手。在当前经济形势下,企业通过AI技术可以有效降低成本并提升服务质量。主动式智能导购AI助手不仅具备专业知识和耐心,还能24小时不间断服务用户,帮助企业节省夜班客服费用。通过创建API-KEY、部署函数计算应用和集成百炼商品检索应用,企业可以在短短几步内快速构建这一智能系统。此外,文章还提供了详细的部署步骤和测评建议,确保企业在实际应用中能够顺利实施。
|
2月前
|
存储 人工智能 Java
Spring AI Alibaba 配置管理,用 Nacos 就够了
本文通过一些实操案例展示了 Spring AI Alibaba + Nacos 在解决 AI 应用中一系列复杂配置管理挑战的方案,从动态 Prompt 模板的灵活调整、模型参数的即时优化,到敏感信息的安全加密存储。Spring AI Alibaba 简化了对接阿里云通义大模型的流程,内置 Nacos 集成也为开发者提供了无缝衔接云端配置托管的捷径,整体上极大提升了 AI 应用开发的灵活性和响应速度。
377 13
|
2月前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
287 12
基于开源框架Spring AI Alibaba快速构建Java应用
|
2月前
|
人工智能 Shell iOS开发
AI Shell:在命令行里“对话” AI ,微软推出将 AI 助手引入命令行的 CLI 工具,打造对话式交互命令行
AI Shell 是一款强大的 CLI 工具,将人工智能直接集成到命令行中,帮助用户提高生产力。AI Shell 支持多种 AI 模型和助手,通过多代理框架提供丰富的功能和灵活的使用模式。
283 7