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、机器学习的发展。
什么是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不仅是一个开源平台,也是一个活跃的社区,吸引了包括Meta、Google、Microsoft、Amazon等超过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
等容器启动后处于healthy状态,即可访问open-webui的3000端口
测试效果如下:
云厂商RAG解决方案
嫌折腾的读者朋友还可以直接掏钱使用云厂商提供的全套RAG解决方案,比如阿里云的RAG解决方案(https://www.aliyun.com/solution/tech-solution/)
本期结语
通过本期内容,我们可以看到现在AI发展仍然处于爆发期,纷繁多样的大模型,如此发展下去AI注定会成为基础设施层,也是云计算3.0时代新的增长点,为AI提供云端算力。未来,AI算法工程师们只需研发更合适更强大的算法或模型,交由AI厂商用其庞大、精炼的参数去训练大模型并发布,下游产业消费大模型,满足各行各业、企业、用户的需求。
最后,感谢您的阅读!系列文章会同步在微信公众号@云上的喵酱、阿里云开发者社区@云上的喵酱、CSDN@笠泱 更新,您的点赞+关注+转发是我后续更新的动力!