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@笠泱 更新,您的点赞+关注+转发是我后续更新的动力!

相关文章
|
6月前
|
人工智能 Java Nacos
基于 Spring AI Alibaba + Nacos 的分布式 Multi-Agent 构建指南
本文将针对 Spring AI Alibaba + Nacos 的分布式多智能体构建方案展开介绍,同时结合 Demo 说明快速开发方法与实际效果。
4726 94
|
6月前
|
SQL 人工智能 关系型数据库
AI Agent的未来之争:任务规划,该由人主导还是AI自主?——阿里云RDS AI助手的最佳实践
AI Agent的规划能力需权衡自主与人工。阿里云RDS AI助手实践表明:开放场景可由大模型自主规划,高频垂直场景则宜采用人工SOP驱动,结合案例库与混合架构,实现稳定、可解释的企业级应用,推动AI从“能聊”走向“能用”。
1271 41
AI Agent的未来之争:任务规划,该由人主导还是AI自主?——阿里云RDS AI助手的最佳实践
|
6月前
|
人工智能 运维 Java
Spring AI Alibaba Admin 开源!以数据为中心的 Agent 开发平台
Spring AI Alibaba Admin 正式发布!一站式实现 Prompt 管理、动态热更新、评测集构建、自动化评估与全链路可观测,助力企业高效构建可信赖的 AI Agent 应用。开源共建,现已上线!
7177 93
|
8月前
|
JSON 人工智能 Java
基于Spring AI构建智能Text-to-SQL转换器:一个完整的MCP
Spring AI 更新结构化输出转换器,弃用旧版 Parser 类,引入与 Spring 框架对齐的 Converter 体系,提升命名规范与功能兼容性。新版本支持 JSON、XML 及 Java 对象转换,确保 LLM 输出结构化,便于下游应用处理。
|
6月前
|
人工智能 监控 Java
零代码改造 + 全链路追踪!Spring AI 最新可观测性详细解读
Spring AI Alibaba 通过集成 OpenTelemetry 实现可观测性,支持框架原生和无侵入探针两种方式。原生方案依赖 Micrometer 自动埋点,适用于快速接入;无侵入探针基于 LoongSuite 商业版,无需修改代码即可采集标准 OTLP 数据,解决了原生方案扩展性差、调用链易断链等问题。未来将开源无侵入探针方案,整合至 AgentScope Studio,并进一步增强多 Agent 场景下的观测能力。
2665 82
|
7月前
|
人工智能 Java 数据库
Spring AI
Spring AI 为 Java 生态注入智能,提供统一抽象接口,简化大模型集成,助力开发者高效构建 AI 应用,推动企业智能化转型。
1267 147
|
7月前
|
人工智能 Java API
构建基于Java的AI智能体:使用LangChain4j与Spring AI实现RAG应用
当大模型需要处理私有、实时的数据时,检索增强生成(RAG)技术成为了核心解决方案。本文深入探讨如何在Java生态中构建具备RAG能力的AI智能体。我们将介绍新兴的Spring AI项目与成熟的LangChain4j框架,详细演示如何从零开始构建一个能够查询私有知识库的智能问答系统。内容涵盖文档加载与分块、向量数据库集成、语义检索以及与大模型的最终合成,并提供完整的代码实现,为Java开发者开启构建复杂AI智能体的大门。
4251 58
|
7月前
|
人工智能 Java 机器人
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
Spring AI Alibaba集成Ollama,基于Java构建本地大模型应用,支持流式对话、knife4j接口可视化,实现高隐私、免API密钥的离线AI服务。
6307 2
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
下一篇
开通oss服务