通过Spring AI 调用通义千问国产大模型_基于Spring AI Alibaba

server/2024/10/21 2:24:28/

通义千问介绍

我们可以通过Spring最新推出的Spring AI 框架 来调用通义千问国产大模型。这种集成可以有效的帮助我们过去的系统更智能,还能显著提升用户体验,我将以一个详细的示例进行说明。

通义千问是由国内领先的人工智能企业研发的一款强大语言模型,是国内最优秀的大模型之一。它在自然语言处理、知识图谱构建和智能问答等多个方面表现出色,广泛应用于各个行业。在通义最新的开源版本中,Qwen 2.5已经在开源领域中排名第一,以其卓越的性能和灵活的应用能力赢得了广泛的认可。

在我的实践中,通义千问已经能够很好地满足绝大多数业务场景中的问答需求,无论是客户服务、知识管理还是内容创作,它都能快速生成准确、相关的回答。同时,将通义千问与RAG(Retrieval-Augmented Generation)技术相结合,能够进一步提升问答效果。RAG技术通过结合外部知识库与生成模型,为用户提供更加丰富和准确的信息,从而使得问答的体验更加优质和高效。

Spring AI:简化Java项目中AI集成的统一框架

在过去,Java 缺乏一个高效且易于集成的AI应用框架,这给开发者在将AI能力融入项目时带来了诸多不便。Spring AI 的出现填补了这一空白,它为Java生态系统引入了一套统一的接口标准,使得不同AI服务提供商(如OpenAI、Azure等)能够无缝对接。这意味着开发者只需编写一次代码,通过更改配置即可轻松切换底层AI实现。此外,Spring AI与传统的Spring框架设计原则保持一致,比如可移植性和模块化,同时也完美兼容Java面向对象编程的特点。这些优势不仅简化了开发流程,还显著减少了因迁移或适配不同AI平台而产生的工作量,使Java Spring AI 成为了构建现代化智能应用程序的理想选择。

Spring AI的核心功能

能力名字:模型(Model)

一句话说明:Spring AI Alibaba 支持多种生成式模型,如对话、文生图、文生语音等。
输入输出举例:通过调用ChatClient实例的.user(input)方法发送请求,并使用.call()方法接收来自大模型的回复。例如,用户输入“今天的天气怎么样?”作为输入,系统可能返回一个包含当前天气情况的字符串。

能力名字:提示(Prompt)

一句话说明:允许开发者定义与AI交互时使用的初始文本信息。
输入输出举例:在构造Prompt对象时提供基础的询问语句,如new Prompt("给我讲个笑话"),然后通过调用chatClient.prompt(prompt).call().content()来获取一个有趣的笑话作为输出。

能力名字:提示词模板(Prompt Template)

一句话说明:利用预定义的模板动态创建Prompt内容。
输入输出举例:创建一个带有占位符的PromptTemplate,比如"我想知道{subject}的信息",然后用实际值替换占位符,如template.create(Map.of("subject", "巴黎")),从而得到完整的查询句子并获得相关答案。

能力名字:嵌入(Embedding)

一句话说明:将非结构化数据转换为可用于计算向量表示的方法。
输入输出举例:对于一段文字或图片文件,可以使用特定的模型将其转化为固定长度的向量,便于后续处理或比较相似度。

能力名字:结构化输出(Structured Output)

一句话说明:自动将模型产生的原始字符串解析成Java对象。
输入输出举例:假设有一个描述人物属性的JSON字符串,通过配置合适的OutputParser,可以直接从模型响应中提取出Person对象,而不需要手动解析JSON。

能力名字:检索增强生成(RAG)

一句话说明:结合检索和生成两种技术,使AI能够基于私有知识库生成更加准确的回答。
输入输出举例:给定一个问题“2024年6月止,云智能集团的营收是多少?”,系统首先会搜索相关的文档资料(例如财报PDF),找到相关信息后,再由语言模型根据上下文生成最终答案。

能力名字:函数调用(Function Calling)

一句话说明:让LLM能够调用外部工具或服务以完成更复杂的任务。
输入输出举例:定义一个查询消息状态的服务函数MessageStatusService,当接收到类似“消息ID 123的状态是什么?”这样的请求时,模型识别出需要执行该函数,并传递参数123,最后返回结果“消息正常”。

能力名字:向量存储

一句话说明:支持保存和管理用于快速检索的数据向量。
输入输出举例:构建索引时,将文档集合转换为向量形式并存入远程向量存储服务;之后可通过向量相似性搜索快速定位到最相关的内容片段。

Spring AI与阿里云百炼大模型的整合

Spring AI Alibaba 是 Spring AI 的一个实现,它基于 Spring AI API 接入了阿里云的百炼系列大模型服务,如通义千问等国产大模型。其核心优势在于提供了对话、文生图、文生语音等多种生成式AI能力,并支持通过标准化API接入这些服务,极大地简化了开发者在使用不同AI提供者时的工作量。借助于Spring AI Alibaba,开发者能够轻松利用阿里云的强大AI功能来构建智能应用,同时享受Spring框架带来的模块化设计和可移植性优点。此外,该框架还提供了诸如OutputParser、Prompt Template等功能,帮助开发者更高效地开发AI应用。

使用Spring AI Alibaba构建聊天应用的详尽示例

分析

要使用Spring AI Alibaba来实现一个基于Prompt并且能够流式返回(使用Flux)的聊天API,我们需要完成以下几个步骤:

  1. 环境准备:确保开发环境满足一定的要求,包括JDK版本、Spring Boot版本等。
  1. 获取阿里云API Key:通过阿里云官网申请通义千问API Key。
  1. 配置项目依赖:添加必要的Maven仓库和项目依赖。
  1. 配置API Key:在应用中正确设置之前申请到的API Key。
  1. 编写控制器:创建一个Controller来处理用户请求,并注入ChatClient以实现与AI模型的交互。
  1. 实现Prompt功能:利用Spring AI Alibaba提供的Prompt机制向AI发送特定格式的消息。
  1. 启用流式响应:将API设计为支持流式响应,即利用Flux实时传递AI生成的内容给客户端。

具体步骤

环境准备
  • JDK版本需达到或超过17。
  • Spring Boot版本应为3.3.x及以上。
获取阿里云API Key

按照以下流程操作:

  1. 访问阿里云百炼页面并登录您的账号。
  1. 选择开通“百炼大模型推理”服务,并等待服务开通通知。
  1. 服务开通后,在控制台右上角的小人图标下找到API Key管理,点击创建新的API Key并记录该Key值。
配置项目依赖

需要在pom.xml文件中添加以下内容:

<repositories><repository><id>sonatype-snapshots</id><url>https://oss.sonatype.org/content/repositories/snapshots</url><snapshots><enabled>true</enabled></snapshots></repository><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>false</enabled></releases></repository></repositories><dependencies><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter</artifactId><version>1.0.0-M2</version></dependency><!-- 其他依赖 -->
</dependencies>
配置API Key

在系统环境变量或application.properties文件中设置API Key:

spring.ai.dashscope.api-key=${AI_DASHSCOPE_API_KEY}

其中${AI_DASHSCOPE_API_KEY}是你之前从阿里云获得的实际API Key值。

编写控制器

接下来定义一个RESTful API端点用于接收用户输入并返回AI生成的回答。这个例子同时展示了如何利用Prompt模板以及如何使用Flux提供流式输出。

@RestController
@RequestMapping("/ai")
@CrossOrigin(origins = "*")
public class ChatController {private final ChatClient chatClient;@Value("classpath:correct-and-expand.st")Resource resource;public ChatController(ChatClient.Builder builder) {this.chatClient = builder.build();}@GetMapping("/chat")public String chat(String input) {return this.chatClient.prompt().user(input).call().content();}@GetMapping(value = "/chatStream")public Flux<String> chatSteam(@RequestParam String input) {PromptTemplate promptTemplate = new PromptTemplate(resource);Prompt prompt = promptTemplate.create(Map.of("input", input));return chatClient.prompt(prompt).stream().content();}
}

这里假设correct-and-expand.st是一个位于类路径下的提示词模板文件,其内容如下示例所示:

Generate a more detailed version of the following text, ensuring accuracy and clarity: {input}

解释

以上步骤详尽地介绍了如何搭建一个基本的聊天应用,它不仅可以通过标准HTTP GET请求直接返回AI生成的结果,还能通过流式接口实现实时数据推送。这样做的好处在于提高了用户体验,尤其是在处理长文本生成任务时。整个过程中关键点在于正确配置API Key、合理组织Prompt模板及有效运用Spring WebFlux框架特性来构建响应式的Web服务。


http://www.ppmy.cn/server/133510.html

相关文章

基于SpringBoot+Vue+uniapp微信小程序的乡村政务服务系统的详细设计和实现(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

【v5.3.0】修复订单批量发货提示 isPicUpload is not defined

使用订单批量发货的时候&#xff0c;没有反应&#xff0c;控制台提示 ReferenceError: isPicUpload is not defined 修改文件src/pages/order/orderList/components/tableList.vue 把isPicUpload改成isFileUpload&#xff0c;然后重新打包admin后台上传即可

redhat系列的yum源配置

一、Linux更改yum源为阿里云源 一&#xff09;原yum源备份 cp -rp /etc/yum.repos.d/CentOS-Base.repo{,.bak} cp -rp /etc/yum.repos.d/epel.repo{,.bak} 二&#xff09;更改为阿里云源  1、更改yum base源 下载新的CentOS-Base.repo 到/etc/yum.repos.d/ http://mirrors.al…

微服务与SpringCloud的概述

微服务概述 微服务的提出&#xff1a;马丁福勒论文 微服务是一种架构模式或者是一种架构风格&#xff0c;它提倡将单一应用程序划分位一组小的服务&#xff0c;每个服务运行在其独立的自己的进程中&#xff0c;服务之间互相协调&#xff0c;互相配合&#xff0c;为用户提供最终…

机器学习基础概念(3)

小小考一下大家前两节的内容(坏笑) 我们如何评判一个机器学习模型的性能呢&#xff1f; 通常是判断它的泛化能力&#xff08;对于未知数据的处理能力&#xff09; 那么对于泛化能力是否有一个标准&#xff0c;比如在未知的1万个数据中&#xff0c;泛化能力 模型一90% >…

【C语言】数组函数冒泡排序bubble sort

数组&#xff1a;对于n个数字进行排序&#xff0c;就必须定义n个变量来存储。那么为了统一处理&#xff0c;选择数组就十分便捷了。 函数&#xff1a;将排序算法写到函数中&#xff0c;后续遇到所有的排序需求&#xff0c;都可以直接进行调用。 冒泡排序&#xff1a;受气泡在水…

HarmonyOS NEXT开发之ArkTS自定义组件学习笔记

在HarmonyOS中&#xff0c;ArkTS提供了创建自定义组件的能力&#xff0c;允许开发者封装和复用UI代码。以下是关于自定义组件的详细介绍&#xff0c;包括创建自定义组件、页面和自定义组件的生命周期、自定义组件的自定义布局、冻结功能&#xff0c;以及代码案例分析。 创建自…

用Java做智能客服,基于私有知识库

构建Java智能客服系统的整体思路 使用Java构建智能客服系统的整体思路是&#xff1a; 首先将客服QA文档以Word形式导入到系统中&#xff0c;通过向量化处理存入知识库。 当用户提出问题时&#xff0c;系统会根据问题内容从知识库中检索相关的上下文信息&#xff0c;并结合大…