Spring AI,搭建个人AI助手

简介: 本期主要是实操性内容,聊聊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@笠泱 更新,您的点赞+关注+转发是我后续更新的动力!

相关文章
|
24天前
|
人工智能 Java API
Java也能快速搭建AI应用?一文带你玩转Spring AI可落地性
Java语言凭借其成熟的生态与解决方案,特别是通过 Spring AI 框架,正迅速成为 AI 应用开发的新选择。本文将探讨如何利用 Spring AI Alibaba 构建在线聊天 AI 应用,并实现对其性能的全面可观测性。
|
12天前
|
人工智能 数据可视化 安全
Manus AI 站在巨人(大模型)肩膀上的AI助手
3月6日,Manus AI震撼登场,它不仅是一个聊天机器人,更是全能AI助手。能帮你筛选简历、进行房产调研、自动编写代码和数据分析,甚至创建并部署交互式网站。创始人是中国90后肖宏,毕业于华中科技大学。目前服务器已爆满,敬请期待其强大功能。
|
1天前
|
人工智能 自然语言处理 Java
对话即服务:Spring Boot整合MCP让你的CRUD系统秒变AI助手
本文介绍了如何通过Model Context Protocol (MCP) 协议将传统Spring Boot服务改造为支持AI交互的智能系统。MCP作为“万能适配器”,让AI以统一方式与多种服务和数据源交互,降低开发复杂度。文章以图书管理服务为例,详细说明了引入依赖、配置MCP服务器、改造服务方法(注解方式或函数Bean方式)及接口测试的全流程。最终实现用户通过自然语言查询数据库的功能,展示了MCP在简化AI集成、提升系统易用性方面的价值。未来,“对话即服务”有望成为主流开发范式。
116 1
|
11天前
|
人工智能 自然语言处理 前端开发
Spring AI与DeepSeek实战二:打造企业级智能体
本文介绍如何基于Spring AI与DeepSeek模型构建企业级多语言翻译智能体。通过明确的Prompt设计,该智能体能自主执行复杂任务,如精准翻译32种ISO标准语言,并严格遵循输入格式和行为限制。代码示例展示了如何通过API实现动态Prompt生成和翻译功能,确保服务的安全性和可控性。项目已开源,提供更多细节和完整代码。 [GitHub](https://github.com/zlt2000/zlt-spring-ai-app) | [Gitee](https://gitee.com/zlt2000/zlt-spring-ai-app)
125 11
|
18天前
|
人工智能 Java API
Spring AI与DeepSeek实战一:快速打造智能对话应用
在 AI 技术蓬勃发展的今天,国产大模型DeepSeek凭借其低成本高性能的特点,成为企业智能化转型的热门选择。而Spring AI作为 Java 生态的 AI 集成框架,通过统一API、简化配置等特性,让开发者无需深入底层即可快速调用各类 AI 服务。本文将手把手教你通过spring-ai集成DeepSeek接口实现普通对话与流式对话功能,助力你的Java应用轻松接入 AI 能力!虽然通过Spring AI能够快速完成DeepSeek大模型与。
336 11
|
1月前
|
人工智能 Cloud Native 安全
DeepSeek + Higress AI 网关/Spring AI Alibaba 案例征集
诚挚地感谢每一位持续关注并使用 Higress 和 Spring AI Alibaba 的朋友,DeepSeek + Higress AI 网关/Spring AI Alibaba 案例征集中。
122 15
|
23天前
|
存储 人工智能 开发框架
Spring AI Alibaba 应用框架挑战赛圆满落幕,恭喜获奖选手
第二届开放原子大赛 Spring AI Alibaba 应用框架挑战赛决赛于 2 月 23 日在北京圆满落幕。
|
19天前
|
人工智能 Java API
Java 也能快速搭建 AI 应用?一文带你玩转 Spring AI 可观测性
Java 也能快速搭建 AI 应用?一文带你玩转 Spring AI 可观测性
|
1月前
|
人工智能 Java API
支持 40+ 插件,Spring AI Alibaba 简化智能体私有数据集成
通过使用社区官方提供的超过 20 种 RAG 数据源和 20 种 Tool Calling 接口,开发者可以轻松接入多种外部数据源(如 GitHub、飞书、云 OSS 等)以及调用各种工具(如天气预报、地图导航、翻译服务等)。这些默认实现大大简化了智能体的开发过程,使得开发者无需从零开始,便可以快速构建功能强大的智能体系统。通过这种方式,智能体不仅能够高效处理复杂任务,还能适应各种应用场景,提供更加智能、精准的服务。
|
21天前
|
人工智能 Java API
Java 也能快速搭建 AI 应用?一文带你玩转 Spring AI 可观测性
Java 也能快速搭建 AI 应用?一文带你玩转 Spring AI 可观测性

热门文章

最新文章