java调用ai模型:使用国产通义千问完成基于知识库的问答

整体介绍:

基于RAG(Retrieval-Augmented Generation)技术,可以实现一个高效的Java智能问答客服机器人。核心思路是将预先准备的问答QA文档(例如Word格式文件)导入系统,通过数据清洗、向量化处理,并存储到向量数据库中。当用户提问时,系统首先识别并理解用户的查询意图,接着从向量数据库中检索出最相关的文档或数据,最后结合大模型生成准确的回答。整个过程利用了Java编程语言的优势,确保了系统的高效运行和维护性。这种方案不仅能够提升客服机器人的响应速度,还能保证答案的准确性与相关性,为用户提供优质的智能问答体验。

rag介绍:

检索增强生成 (RAG) 是一种技术,它结合了检索模型和生成模型,以私有知识库中的信息来辅助文本生成。这解决了使用大模型时常见的问题:模型可能会产生不准确的回答(即幻觉),以及缺乏企业特定数据导致的泛化回答。通过访问私有知识库,RAG能够提供更精准、更符合上下文的回复。

RAG的主要流程

在RAG(Retrieval-Augmented Generation)中,主要流程分为两个部分:索引构建流程和使用流程。

索引构建流程

首先进行数据准备。数据导入阶段,从各种来源收集原始数据,并对其进行清洗,包括去除噪音、处理缺失值等预处理操作,以确保数据的质量;然后将这些数据转换为适合向量化处理的格式。接下来是向量化模块,在这一阶段,利用预训练的语言模型(如BERT或GLP等)从已清洗的数据中提取特征并将其转换成向量形式。最后一步是数据存储与索引构建,这里会把上述生成的向量数据保存到数据库或文件系统里,并基于这些数据创建索引来加速后续的信息检索过程。

使用流程

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

通义千问介绍

通义千问介绍

通义千问是由阿里集团输出的开源大模型服务,它支持全尺寸、多模态的大模型。在中文开源模型领域,通义千问具备显著的优势。以下是通义千问的核心能力、能力排行榜以及价格情况的详细介绍。

核心优势
  1. 能力排名靠前:通义千问在多个客观评测指标上表现优异,如MMLU、TheoremQA和GPQA等,超越了Llama 3 70B。特别是在国产大模型中,其竞技场模式下的性能仅次于OpenAI的GPT系列、Claude和GreK。
  1. 可访问性和合规性:通过API调用时,通义千问提供了安全保护措施,有效避免了恶意攻击问题。
  1. 完全开源:作为目前最为开放的模型之一,通义千问提供了全尺寸的多模态大模型开源版本,用户可以根据需求选择不同规模的模型。
  1. 价格合适:通义千问为用户提供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的请求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/483599.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 基于Spring AI RAG组件做AI智能问答_rag检索增强_AI智能问答

基于RAG技术构建高效Java智能问答客服机器人 基于RAG&#xff08;Retrieval-Augmented Generation&#xff09;技术&#xff0c;可以构建高效的Java智能问答客服机器人。首先&#xff0c;通过向量化处理将Word格式的问答QA文档转换为机器可理解的形式&#xff0c;并存储于Vect…

顶刊算法 | 鱼鹰算法OOA-BiTCN-BiGRU-Attention多输入单输出回归预测(Maltab)

顶刊算法 | 鱼鹰算法OOA-BiTCN-BiGRU-Attention多输入单输出回归预测&#xff08;Maltab&#xff09; 目录 顶刊算法 | 鱼鹰算法OOA-BiTCN-BiGRU-Attention多输入单输出回归预测&#xff08;Maltab&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实…

Redis+Caffeine 多级缓存数据一致性解决方案

RedisCaffeine 多级缓存数据一致性解决方案 背景 之前写过一篇文章RedisCaffeine 实现两级缓存实战&#xff0c;文章提到了两级缓存RedisCaffeine可以解决缓存雪等问题也可以提高接口的性能&#xff0c;但是可能会出现缓存一致性问题。如果数据频繁的变更&#xff0c;可能会导…

单片机学习笔记 12. 定时/计数器_定时

更多单片机学习笔记&#xff1a;单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘单片机学习笔记 8…

6.824/6.5840(2024)环境配置wsl2+vscode

本文是经过笔者实践得出的最速の环境配置 首先&#xff0c;安装wsl2和vscode 具体步骤参见Mit6.s081环境配置踩坑之旅WSL2VScode_mit6s081-CSDN博客 接下来开始为Ubuntu(笔者使用的版本依然是20.04)配置go的相关环境 1、更新Ubuntu的软件包 sudo apt-get install build-es…

【排序用法】.NET开源 ORM 框架 SqlSugar 系列

&#x1f4a5; .NET开源 ORM 框架 SqlSugar 系列 &#x1f389;&#x1f389;&#x1f389; 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列…

「Mac畅玩鸿蒙与硬件38」UI互动应用篇15 - 猜数字增强版

本篇将带你实现一个升级版的数字猜谜游戏。相比基础版&#xff0c;新增了计分和历史记录功能&#xff0c;用户可以在每次猜测后查看自己的得分和猜测历史。此功能展示了状态管理的进阶用法以及如何保存和显示历史数据。 关键词 UI互动应用数字猜谜状态管理历史记录用户交互 一…

040集——CAD中放烟花(CAD—C#二次开发入门)

效果如下&#xff1a; 单一颜色的烟花&#xff1a; 渐变色的火花&#xff1a; namespace AcTools {public class HH{public static TransientManager tm TransientManager.CurrentTransientManager;public static Random rand new Random();public static Vector3D G new V…

【机器学习】分类任务: 二分类与多分类

二分类与多分类&#xff1a;概念与区别 二分类和多分类是分类任务的两种类型&#xff0c;区分的核心在于目标变量&#xff08;label&#xff09;的类别数&#xff1a; 二分类&#xff1a;目标变量 y 只有两个类别&#xff0c;通常记为 y∈{0,1} 或 y∈{−1,1}。 示例&#xff…

Python实现网站资源批量下载【可转成exe程序运行】

Python实现网站资源批量下载【可转成exe程序运行】 背景介绍解决方案转为exe可执行程序简单点说详细了解下 声明 背景介绍 发现 宣讲家网 的PPT很好&#xff0c;作为学习资料使用很有价值&#xff0c;所以想下载网站的PPT课件到本地&#xff0c;但是由于网站限制&#xff0c;一…

基于Matlab卡尔曼滤波的GPS/INS集成导航系统研究与实现

随着智能交通和无人驾驶技术的迅猛发展&#xff0c;精确可靠的导航系统已成为提升车辆定位精度与安全性的重要技术。全球定位系统&#xff08;GPS&#xff09;和惯性导航系统&#xff08;INS&#xff09;在导航应用中各具优势&#xff1a;GPS提供全球定位信息&#xff0c;而INS…

【计算机网络】实验6:IPV4地址的构造超网及IP数据报

实验 6&#xff1a;IPV4地址的构造超网及IP数据报 一、 实验目的 加深对IPV4地址的构造超网&#xff08;无分类编制&#xff09;的了解。 加深对IP数据包的发送和转发流程的了解。 二、 实验环境 • Cisco Packet Tracer 模拟器 三、 实验内容 1、了解IPV4地址的构造超网…

使用ESP32通过Arduino IDE点亮1.8寸TFT显示屏

开发板选择 本次使用开发板模块丝印为ESP32-WROOM-32E 开发板库选择 Arduino IDE上型号选择为ESP32-WROOM-DA Module 显示屏选择 使用显示屏为8针SPI接口显示屏 驱动IC为ST7735S 使用库 使用三个Arduino平台库 分别是 Adafruit_GFXAdafruit_ST7735SPI 代码详解 首…

[C++设计模式] 为什么需要设计模式?

文章目录 什么是设计模式&#xff1f;为什么需要设计模式&#xff1f;GOF 设计模式再次理解面向对象软件设计固有的复杂性软件设计复杂性的根本原因如何解决复杂性&#xff1f;分解抽象 结构化 VS 面向对象(封装)结构化设计代码示例&#xff1a;面向对象设计代码示例&#xff1…

机器学习:精确率与召回率的权衡

高精度意味着如果诊断得了那种罕见病的病人&#xff0c;可能病人确实有&#xff0c;这是一个准确的诊断&#xff0c;高召回率意味着如果有一个还有这种罕见疾病的病人&#xff0c;也许算法会正确的识别他们确实患有这种疾病&#xff0c;事实中&#xff0c;在精确与召回之间往往…

03-13、SpringCloud Alibaba第十三章,升级篇,服务降级、熔断和限流Sentinel

SpringCloud Alibaba第十三章&#xff0c;升级篇&#xff0c;服务降级、熔断和限流Sentinel 一、Sentinel概述 1、Sentinel是什么 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保…

基于vite6+ vue3 + electron@33 实现的 局域网内互传文件的桌面软件

目录 项目介绍项目部分截图介绍下基础项目搭建先搭建一个vite 前端项目 再安装 electron 相关依赖依赖安装失败解决方案修改 vite配置文件和 ts 配置文件修改packjsonts相关配置项目结构介绍 项目介绍 前端 基于 vue3 ts windicss 后端 就是node 层 项目地址&#xff1a; h…

安装MySQL 5.7 亲测有效

前言&#xff1a;本文是笔者在安装MySQL5.7时根据另一位博主大大的安装教程基础上做了一些修改而成 首先在这里表示对博主大大的感谢 下面附博主大大地址 下面的步骤言简意赅 跟着做就不会出错 希望各位读者耐下心来 慢慢解决安装中出现的问题~MySQL 5.7 安装教程&#xff08;全…

CSS函数

目录 一、背景 二、函数的概念 1. var()函数 2、calc()函数 三、总结 一、背景 今天我们就来说一说&#xff0c;常用的两个css自定义属性&#xff0c;也称为css函数。本文中就成为css函数。先来看一下官方对其的定义。 自定义属性&#xff08;有时候也被称作CSS 变量或者级…

6.824/6.5840 Lab 1: MapReduce

宁静的夏天 天空中繁星点点 心里头有些思念 思念着你的脸 ——宁夏 完整代码见&#xff1a; https://github.com/SnowLegend-star/6.824 由于这个lab整体难度实在不小&#xff0c;故考虑再三还是决定留下代码仅供参考 6.824的强度早有耳闻&#xff0c;我终于也是到了挑战这座高…