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

news2024/12/26 20:00:05

整体介绍:

基于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;

    @Autowired
    public 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>
      <input
        type="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.coloradmin.cn/o/2253245.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

跨平台应用开发框架(4)----Qt(系统篇)

目录 1.Qt事件 1.事件来源 2.事件处理 3.按键事件 1.组合按键 4.鼠标事件 1.鼠标单击事件 2.鼠标释放事件 3.鼠标双击事件 4.鼠标移动事件 5.滚轮事件 5.定时器 1.QTimerEvent类 2.QTimer 类 3.获取系统日期及时间 6.事件分发器 7.事件过滤器 2.Qt文件 1.输入…

算法刷题Day8:BM30 二叉搜索树与双向链表

题目 牛客网题目传送门 思路 对二叉搜索树进行中序遍历&#xff0c;结果就是按序数组。因此想办法把前面遍历过的节点给记下来&#xff0c;记作pre。当遍历到某个节点node的时候&#xff0c;令前驱指向pre&#xff0c;然后让pre的后驱指向node。 代码 class TreeNode:def…

MySQL--视图

目录 1 认识视图 1.1 视图的定义 1.1 创建视图 1.2 查询 1.3 修改 1.4 删除 1.5 视图的优缺点 1.5.1 优点 1.5.2 缺点 1.6 视图的类型 1.7 视图与物化视图 2 视图检查选项 2.1 CASCADED 2.2 LOCAL 3 视图更新及作用 3.1 视图案列结合 3.1.1 屏蔽敏感数据 3.1…

基于Matlab高速动车组转臂定位橡胶节点刚度对车辆动力学影响仿真研究

本研究针对高速动车组转臂定位系统中橡胶节点的刚度对车辆动力学性能的影响进行仿真研究。随着高速铁路的发展&#xff0c;动车组的运行稳定性和舒适性成为设计和运营的核心问题&#xff0c;其中&#xff0c;转臂定位系统作为动车组悬挂系统的重要组成部分&#xff0c;其性能对…

并发专题(8)之JUC阻塞容器源码剖析

一、ArrayBlockingQueue源码剖析 ArrayBlockingQueue底层是采用数组实现的一个队列。因为底层是数据&#xff0c;一般被成为有界队列、其阻塞模式是基于ReentrantLock来实现的。 // 存数据操作 add(E),offer(E),put(E)&#xff0c;offer(E,time,unit) // add(E)&#xff1a;添加…

AI/ML 基础知识与常用术语全解析

目录 一.引言 二.AI/ML 基础知识 1.人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09; (1).定义 (2).发展历程 (3).应用领域 2.机器学习&#xff08;Machine Learning&#xff0c;ML&#xff09; (1).定义 (2).学习方式 ①.监督学习 ②.无监督…

【WRF-Urban】WPS中有关Urban的变量设置

【WRF-Urban】WPS中有关Urban的变量设置 地理数据源的配置WRF-Urban所需静态地理数据1、LANDUSE&#xff1a;包含城市地表分类的土地利用数据。2、URB_PARAM&#xff1a;城市参数数据集。3、FRC_URB2D&#xff1a;城市覆盖度数据集 WRF默认设置&#xff08;美国&#xff09;数据…

NVR录像机汇聚管理EasyNVR多个NVR同时管理基于B/S架构的技术特点与能力应用

EasyNVR视频融合平台基于云边端协同设计&#xff0c;能够轻松接入并管理海量的视频数据。该平台兼容性强、拓展灵活&#xff0c;提供了视频监控直播、录像存储、云存储服务、回放检索以及平台级联等一系列功能。B/S架构使得EasyNVR实现了视频监控的多元化兼容与高效管理。 其采…

c++预编译头文件

文章目录 c预编译头文件1.使用g编译预编译头文件2.使用visual studio进行预编译头文件2.1visual studio如何设置输出预处理文件&#xff08;.i文件&#xff09;2.2visual studio 如何设置预编译&#xff08;初始创建空项目的情况下&#xff09;2.3 visual studio打开输出编译时…

Zookeeper的通知机制是什么?

大家好&#xff0c;我是锋哥。今天分享关于【Zookeeper的通知机制是什么?】面试题。希望对大家有帮助&#xff1b; Zookeeper的通知机制是什么? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Zookeeper的通知机制主要通过Watcher实现&#xff0c;它是Zookeeper客…

基于Pyside6开发一个通用的在线升级工具

UI main.ui <?xml version"1.0" encoding"UTF-8"?> <ui version"4.0"><class>MainWindow</class><widget class"QMainWindow" name"MainWindow"><property name"geometry"&…

开源 - Ideal库 - Excel帮助类,ExcelHelper实现(四)

书接上回&#xff0c;前面章节已经实现Excel帮助类的第一步TableHeper的对象集合与DataTable相互转换功能&#xff0c;今天实现进入其第二步的核心功能ExcelHelper实现。 01、接口设计 下面我们根据第一章中讲解的核心设计思路&#xff0c;先进行接口设计&#xff0c;确定Exce…

嵌入式系统应用-LVGL的应用-平衡球游戏 part1

平衡球游戏 part1 1 平衡球游戏的界面设计2 界面设计2.1 背景设计2.2 球的设计2.3 移动球的坐标2.4 用鼠标移动这个球2.5 增加边框规则2.6 效果图2.7 游戏失败重启游戏 3 为小球增加增加动画效果3.1 增加移动效果代码3.2 具体效果图片 平衡球游戏 part2 第二部分文章在这里 1 …

《Python基础》之Pandas库

目录 一、简介 二、Pandas的核心数据结构 1、Series 2、DataFrame 三、数据读取与写入 1、数据读取 2、数据写入 四、数据清洗与处理 1、处理缺失值 2、处理重复值 3、数据转换 五、数据分析与可视化 1、统计描述 2、分组聚合 3、数据可视化 六、高级技巧 1、时…

网络安全-夜神模拟器如何通过虚拟机的Burp Suite代理应用程序接口

第一步、查看虚拟机的IP地址 我们可以通过ifconfig命令来查看虚拟机的IP地址,如下图所示。 第二步、在Burp Suite上设置代理 打开虚拟机上的Burp Suite,进入到代理模块中,进入到代理设置中心 打开系统代理设置中心之后,将我们虚拟机的地址添加到上面,作为新的代理。 第…

PyTorch 2.5.1: Bugs修复版发布

一&#xff0c;前言 在深度学习框架的不断迭代中&#xff0c;PyTorch 社区始终致力于提供更稳定、更高效的工具。最近&#xff0c;PyTorch 2.5.1 版本正式发布&#xff0c;这个版本主要针对 2.5.0 中发现的问题进行了修复&#xff0c;以提升用户体验。 二&#xff0c;PyTorch 2…

SpringAi整合大模型(进阶版)

进阶版是在基础的对话版之上进行新增功能。 如果还没弄出基础版的&#xff0c;请参考 https://blog.csdn.net/weixin_54925172/article/details/144143523?sharetypeblogdetail&sharerId144143523&sharereferPC&sharesourceweixin_54925172&spm1011.2480.30…

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

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

CSS函数

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

UG NX二次开发(C#)-选择对象居中(不是全部居中)

文章目录 1、前言2、什么是对象居中3、功能实现代码3.1 对象居中3.1 恢复原视图1、前言 在UG NX二次开发过程中,我们经常会用到居中以查看完整的模型,但是对于如果想展示某些对象,而不是全部模型时,那么我们就想将选择的对象(如体对象)居中查看,当查看结束后还能恢复到…