java调用ai模型:使用国产通义千问完成基于知识库的问答
整体介绍:
基于RAG(Retrieval-Augmented Generation)技术,可以实现一个高效的Java智能问答客服机器人。核心思路是将预先准备的问答QA文档(例如Word格式文件)导入系统,通过数据清洗、向量化处理,并存储到向量数据库中。当用户提问时,系统首先识别并理解用户的查询意图,接着从向量数据库中检索出最相关的文档或数据,最后结合大模型生成准确的回答。整个过程利用了Java编程语言的优势,确保了系统的高效运行和维护性。这种方案不仅能够提升客服机器人的响应速度,还能保证答案的准确性与相关性,为用户提供优质的智能问答体验。
rag介绍:
检索增强生成 (RAG) 是一种技术,它结合了检索模型和生成模型,以私有知识库中的信息来辅助文本生成。这解决了使用大模型时常见的问题:模型可能会产生不准确的回答(即幻觉),以及缺乏企业特定数据导致的泛化回答。通过访问私有知识库,RAG能够提供更精准、更符合上下文的回复。
RAG的主要流程
在RAG(Retrieval-Augmented Generation)中,主要流程分为两个部分:索引构建流程和使用流程。
索引构建流程
首先进行数据准备。数据导入阶段,从各种来源收集原始数据,并对其进行清洗,包括去除噪音、处理缺失值等预处理操作,以确保数据的质量;然后将这些数据转换为适合向量化处理的格式。接下来是向量化模块,在这一阶段,利用预训练的语言模型(如BERT或GLP等)从已清洗的数据中提取特征并将其转换成向量形式。最后一步是数据存储与索引构建,这里会把上述生成的向量数据保存到数据库或文件系统里,并基于这些数据创建索引来加速后续的信息检索过程。

使用流程
当用户提出查询时,首先通过意图识别来分析用户的实际需求,并可能对初始问题进行改写优化以便更好地匹配潜在答案。接着进入检索阶段,系统依据之前建立的索引查找与当前问题高度相关的文档或信息片段。找到相关资料后,重排环节会根据内容的相关性和质量等因素调整搜索结果的顺序,使得最符合要求的答案优先显示。之后,输出接入步骤负责将筛选出的信息组织整理成易于理解的形式,并最终形成完整的回复文本。最后,该回复被呈现给用户,同时系统还能够收集用户反馈用于持续改进服务。

通义千问介绍
通义千问介绍
通义千问是由阿里集团输出的开源大模型服务,它支持全尺寸、多模态的大模型。在中文开源模型领域,通义千问具备显著的优势。以下是通义千问的核心能力、能力排行榜以及价格情况的详细介绍。
核心优势
- 能力排名靠前:通义千问在多个客观评测指标上表现优异,如MMLU、TheoremQA和GPQA等,超越了Llama 3 70B。特别是在国产大模型中,其竞技场模式下的性能仅次于OpenAI的GPT系列、Claude和GreK。
- 可访问性和合规性:通过API调用时,通义千问提供了安全保护措施,有效避免了恶意攻击问题。
- 完全开源:作为目前最为开放的模型之一,通义千问提供了全尺寸的多模态大模型开源版本,用户可以根据需求选择不同规模的模型。
- 价格合适:通义千问为用户提供100万免费token,并且调用API的成本相对较低。对于自建模型的情况,甚至可以实现免费使用。特别推荐关注Qwen和Qwen VL两个模态的模型,它们在国内开源榜单上均处于领先地位。
能力排行榜
- 在国内思南大模型竞技场排名中,通义千问位居前列,是表现最好的开源模型之一。
- 参考链接:
-
- 思南平台
-
- 国外竞技场排行榜
-
- 基准测试参考
价格情况
- 提供100万免费token,适合初步尝试和小规模应用。
- API调用成本低,适合长期使用。
- 开源特性使得自行部署成为可能,从而进一步降低成本。

![]()

Spring AI Alibaba介绍
Spring AI Alibaba 是由 Spring 官方团队维护的针对阿里云大模型服务的实现框架,它基于 Spring AI 的 API,提供了与阿里云百炼大模型系列产品的集成。其核心优势在于提供统一的接口来接入多种AI能力,包括对话、文生图、文生语音等,使得开发者可以轻松切换不同的AI服务而无需修改大量代码。此外,Spring AI Alibaba 作为阿里云的最佳实践之一,特别强调了对 RAG(检索增强生成)的支持,这使得 Java 开发者能够便捷地利用私有知识库进行文本生成和问答系统构建,从而极大地提升了开发效率和应用的智能水平。通过这一框架,开发者不仅能够快速整合阿里云的AI能力到自己的Java应用中,还能享受到Spring生态系统的强大支持和良好的社区资源。
检索增强的后端代码编写
要通过检索增强 (RAG) 的方式读取一个名为 问答聊天机器人素材.docx 的 Word 文件,并构建好向量索引,最后对外提供服务,我们可以遵循以下步骤。根据我了解的信息中的内容,这个过程主要涉及配置、依赖添加以及具体的代码实现。
1. 环境准备
首先确保你的开发环境满足以下要求:
- JDK版本至少为17
- Spring Boot版本为3.3.x或更高
- 已从阿里云获取了通义千问的API key
2. 配置文件设置
在项目的application.properties或者application.yml中添加如下配置项来指定API key:
spring.ai.dashscope.api-key=${AI_DASHSCOPE_API_KEY}
同时,在启动项目前需设置环境变量:
export AI_DASHSCOPE_API_KEY=your_api_key_here
3. 添加仓库与依赖
由于Spring AI Alibaba还在Milestone阶段,需要额外添加特定仓库支持。在你的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>
接下来添加必要的依赖到pom.xml中:
<dependencies><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter</artifactId><version>1.0.0-M2</version></dependency><!-- 其他可能需要的依赖 -->
</dependencies>
4. 实现服务类和控制器
创建一个名为RagService的服务类来处理向量索引的构建及查询逻辑。此外,我们还需要一个控制器类RagController用于接收外部请求并调用服务层方法。
RagService.java
public class RagService {// 省略其他成员变量声明private final ChatClient chatClient;private final VectorStore vectorStore;private final DashScopeApi dashscopeApi = new DashScopeApi("your_api_key");private DocumentRetriever retriever;public RagService(ChatClient chatClient, EmbeddingModel embeddingModel) {this.chatClient = chatClient;vectorStore = new DashScopeCloudStore(dashscopeApi, new DashScopeStoreOptions("chatbot_knowledge_base"));retriever = new DashScopeDocumentRetriever(dashscopeApi, DashScopeDocumentRetrieverOptions.builder().withIndexName("chatbot_knowledge_base").build());}public String buildIndex() {String filePath = "路径/问答聊天机器人素材.docx";DocumentReader reader = new DashScopeDocumentCloudReader(filePath, dashscopeApi, null);List<Document> documentList = reader.get();vectorStore.add(documentList);return "Index built successfully.";}public StreamResponseSpec queryWithDocumentRetrieval(String message) {return chatClient.prompt().user(message).advisors(new DocumentRetrievalAdvisor(retriever, DEFAULT_USER_TEXT_ADVISE)).stream();}
}
RagController.java
@RestController
@RequestMapping("/ai")
public class RagController {private final RagService ragService;@Autowiredpublic RagController(RagService ragService) {this.ragService = ragService;}@GetMapping("/ragChat")public Flux<String> generate(@RequestParam(value = "input", defaultValue = "你好") String input, HttpServletResponse response) {response.setCharacterEncoding("UTF-8");return ragService.queryWithDocumentRetrieval(input).content();}@GetMapping("/buildIndex")public String buildIndex() {return ragService.buildIndex();}
}
以上步骤实现了基于给定Word文档建立索引,并且能够通过HTTP GET请求访问http://localhost:8080/ai/ragChat?input=...接口以获取对话回复的功能。记得首次运行应用时先调用/buildIndex端点来初始化数据索引。
检索增强的前端代码编写
为了构建一个基于React的简单前端项目,该项目能够支持从后端接收流式数据(flux<String>),我们可以按照以下步骤操作。这个过程包括创建新的React应用、编写必要的组件代码以处理流式响应,并确保后端接口允许跨源资源共享(CORS)。
1. 创建并初始化React应用
首先,你需要设置一个新的React环境。如果还没有安装Node.js和npm,请先进行安装。然后执行如下命令来创建新的React应用:
npx create-react-app frontend
cd frontend
npm install
这将为你准备好一个基础的React项目结构。
2. 配置基本HTML文件
在public/index.html中,保持默认配置即可,因为React会自动使用它作为入口点。
3. 编写React组件
接下来,在src/目录下调整或创建相应的文件,以便我们的应用可以发送请求到指定的后端URL,并处理返回的数据流。
src/index.js
此文件负责渲染根组件App到DOM中。
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';ReactDOM.render(<React.StrictMode><App /></React.StrictMode>,document.getElementById('root')
);
src/App.js
这里定义了顶层的应用布局,我们将在这里引入ChatComponent。
import React from 'react';
import ChatComponent from './components/ChatComponent';function App() {return (<div className="App"><ChatComponent /></div>);
}export default App;
src/components/ChatComponent.js
这是主要的聊天组件,它实现了消息输入、发送以及显示接收到的消息流的功能。
import React, { useState } from 'react';function ChatComponent() {const [input, setInput] = useState('');const [messages, setMessages] = useState('');const handleInputChange = (event) => {setInput(event.target.value);};const handleSendMessage = async () => {try {const response = await fetch(`http://localhost:8080/ai/ragChat?input=${input}`);if (!response.ok) throw new Error('Network response was not ok');const reader = response.body.getReader();const decoder = new TextDecoder('utf-8');let done = false;while (!done) {const { value, done: readerDone } = await reader.read();done = readerDone;const chunk = decoder.decode(value, { stream: true });setMessages((prevMessages) => prevMessages + chunk);}// 添加换行符区分不同请求的结果setMessages((prevMessages) => prevMessages + '\n\n=============================\n\n');} catch (error) {console.error('Failed to fetch:', error);}};const handleClearMessages = () => {setMessages('');};return (<div><inputtype="text"value={input}onChange={handleInputChange}placeholder="Enter your message"/><button onClick={handleSendMessage}>Send</button><button onClick={handleClearMessages}>Clear</button><div><h3>Messages:</h3><pre>{messages}</pre></div></div>);
}export default ChatComponent;
4. 运行你的React应用
完成上述所有步骤之后,你可以通过运行以下命令启动开发服务器:
npm start
这将打开一个本地服务器,默认情况下位于http://localhost:3000。此时,你可以在浏览器中访问该地址,测试聊天功能是否正常工作。
请注意,确保你的后端服务已经正确配置好CORS策略,以便允许来自http://localhost:3000的请求。
相关文章:
java调用ai模型:使用国产通义千问完成基于知识库的问答
整体介绍: 基于RAG(Retrieval-Augmented Generation)技术,可以实现一个高效的Java智能问答客服机器人。核心思路是将预先准备的问答QA文档(例如Word格式文件)导入系统,通过数据清洗、向量化处理…...
2023年第十四届蓝桥杯Scratch国赛真题—推箱子
推箱子 程序演示及其源码解析,可前往: https://www.hixinao.com/scratch/creation/show-188.html 若需在线编程,在线测评模考,助力赛事可自行前往题库中心,按需查找: https://www.hixinao.com/ 题库涵盖…...
银河麒麟V10-SP1设置redis开机自启
前言: redis安装请看:银河麒麟V10-SP1离线安装redis5.0.1_银河麒麟v10 redis5.0-CSDN博客 一、编辑自启文件 vim /etc/systemd/system/redis.service [Unit] DescriptionRedis In-Memory Data Store Afternetwork.target [Service] Typeforking ExecS…...
释放超凡性能,打造鸿蒙原生游戏卓越体验
11月26日在华为Mate品牌盛典上,全新Mate70系列及多款全场景新品正式亮相。在游戏领域,HarmonyOS NEXT加持下游戏的性能得到充分释放。HarmonyOS SDK为开发者提供了软硬协同的系统级图形加速解决方案——Graphics Accelerate Kit(图形加速服务…...
Node.js 实战: 爬取百度新闻并序列化 - 完整教程
很多时候我们需要爬取一些公开的网页内容来做一些数据分析和统计。而多数时候,大家会用到python ,因为实现起来很方便。但是其实Node.js 用来爬取网络内容,也是非常强大的。 今天我向大家介绍一下我自己写的一个百度新闻的爬虫,可…...
106.【C语言】数据结构之二叉树的三种递归遍历方式
目录 1.知识回顾 2.分析二叉树的三种遍历方式 1.总览 2.前序遍历 3.中序遍历 4.后序遍历 5.层序遍历 3.代码实现 1.准备工作 2.前序遍历函数PreOrder 测试结果 3.中序遍历函数InOrder 测试结果 4.后序遍历函数PostOrder 测试结果 4.底层分析 1.知识回顾 在99.…...
qt QToolButton详解
1、概述 QToolButton是Qt框架中的一个控件,它继承自QAbstractButton。QToolButton通常用于工具栏(QToolBar)中,提供了一种快速访问命令或选项的方式。与普通的QPushButton按钮相比,QToolButton通常只显示一个图标而不…...
2024年大热,Access平替升级方案,也适合Excel用户
欢迎各位看官,您来了,就对了! 您多半是Access忠实粉丝,至少是excel用户,亦或是WPS用户吧。那就对了,今天的分享肯定对您有用。 本文1100字,阅读时长2分50秒! 现实总是不尽人意&am…...
探索Scala的模式匹配:身份证识别与等级判定!!! #Scala # scala #匹配模式
在Scala编程语言中,模式匹配是一个强大且表达力丰富的特性,它允许我们以声明式的方式处理多种情况。今天,我们将通过两个有趣的例子来展示Scala模式匹配的魅力:身份证号识别和等级判定。 1. 身份证号识别:定位你的家乡…...
python数据分析之爬虫基础:爬虫介绍以及urllib详解
前言 在数据分析中,爬虫有着很大作用,可以自动爬取网页中提取的大量的数据,比如从电商网站手机商品信息,为市场分析提供数据基础。也可以补充数据集、检测动态变化等一系列作用。可以说在数据分析中有着相当大的作用!…...
【星海随笔】syslinux
Ubuntu相关资料 https://www.pugetsystems.com/labs/hpc/ubuntu-22-04-server-autoinstall-iso/#Step_2_Unpack_files_and_partition_images_from_the_Ubuntu_2204_live_server_ISO https://launchpad.net/ubuntu/source/squashfs-tools/1:4.6.1-1build1 sudo tar -xf my_compu…...
力扣C语言刷题记录 (二)移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作: 更改…...
【Vue3】【Naive UI】<NAutoComplete>标签
【Vue3】【Naive UI】标签 <NAutoComplete> 是 Naive UI 库中的一个组件,用于实现自动完成或联想输入功能。 它允许用户在输入时看到与当前输入匹配的建议列表,从而帮助用户更快地填写表单字段。 这个组件通常用于搜索框、地址输入等场景ÿ…...
【Halcon】使用均值滤波出现假边怎么办?
在图像处理过程中,均值滤波是一种常见的平滑技术,用于减少图像中的噪声。然而,当应用于具有显著边缘或对比度变化的图像时,均值滤波可能会导致“假边”现象,即原本不存在的边缘在滤波后变得明显。以下是如何在Halcon中处理这一问题,并提供一个完整的示例代码。 示例背景…...
Flask+Minio实现断点续传技术教程
什么是MinIO MinIO是一个高性能的分布式对象存储服务,与Amazon S3 API兼容。它允许用户存储和检索任意规模的数据,非常适合于使用S3 API的应用程序。MinIO支持多租户存储,提供高可用性、高扩展性、强一致性和数据持久性。它还可以作为软件定义…...
JAVA设计模式,动态代理模式
动态代理(Dynamic Proxy)是Java中一种非常有用的设计模式。它允许在运行时创建一个实现了一组给定接口的新类。这种模式主要用于当需要为某个对象提供一个代理以控制对该对象的访问时。通过这种方式,可以添加额外的功能,如事务管理…...
HTML 快速上手
目录 一. HTML概念 二. HTML标签 1. 标题标签 2. 段落标签 3. 换行标签 4. 图片标签 5. 超链接标签 6. 表格标签 7. 表单标签 7.1 form 标签 7.2 input 标签 (1) 文本框 (2) 单选框 (3) 密码框 (4) 复选框 (5) 普通按钮 (6) 提交按钮 8. select标签 9. 无语义…...
【计算机视觉算法与应用】模板匹配、图像配准
目录 1. 基于灰度值的模板匹配 2. 基于相关性的模板匹配 3. 基于形状的模板匹配 4. 基于组件的模板识别 5. 基于形变的模板匹配 6. 基于描述符的模板匹配 7. 基于点的模板匹配 性能比较 模板匹配的算法实现需要结合具体需求和应用场景来选择方法。以下是基于 OpenCV 的…...
【Linux】设计文件系统(C实现)
要求: (1)可以实现下列几条命令 dir 列文件目录 create 创建文件 delete 删除文件 read 读文件 write 写文件 (2)列目录时要列出文件名、存取权限(八进制)、文件长度、时间(创建时间,修改时间以及…...
详解Rust多线程编程
文章目录 多线程模型创建和管理线程自定义线程行为线程传递数据线程间通信线程池错误处理与线程Condvar(条件变量)无锁并发高性能并发库 Rust的多线程编程提供了一种安全、高效的方式来进行并发操作。Rust的并发性设计原则之一是确保线程安全,同时避免运行时的开销&…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...

