Java 读取word , 作为私有知识库做RAG答疑

news2024/10/23 19:18:53

检索与生成的技术(RAG),可以提升文本精准度与企业数据相关性

检索增强生成 (RAG) 是一种技术,它结合了检索模型和生成模型,旨在通过私有或专有的数据源来辅助文本生成。在使用大模型时,一个常见问题是模型可能会产生“幻觉”,即生成的信息可能与事实不符;此外,由于模型通常不包含企业的特定数据,其回答往往缺乏针对性和精确性。RAG 通过引入企业知识库中的信息作为上下文,使得生成的回答更加准确、相关且基于最新的企业数据,从而有效缓解了这些问题。

Spring AI  Alibaba :类似Spring cloud alibaba的Spring AI最佳实践

Spring AI Alibaba 是一个专为 Java 和 Spring Boot 生态系统设计的应用框架,旨在将 Spring 的设计理念应用到人工智能领域。

Spring ai 由 Spring 官方团队维护,确保了高质量和稳定性。

其核心优势在于提供了统一的接口来标准化不同AI提供商(如OpenAI、阿里云等)的服务接入方式,使开发者能够通过简单的配置切换不同的AI实现。

此外,Spring AI Alibaba 结合了阿里云的最佳实践,特别是与百炼平台的深度集成,支持多种生成式AI能力,包括对话、文生图、文生语音等功能,极大地简化了在Spring Boot项目中引入和使用AI功能的过程。

构建RAG后端服务:从PDF到智能对话

检索增强的后端代码编写

根据提供的我了解的信息,为了通过检索增强(RAG)的方式读取一个名为专家答疑文档.pdf的PDF文件、构建向量索引,并对外提供服务,我们需要遵循一定的步骤来完成环境准备与编码实现。首先确保你的开发环境满足以下要求:

  1. JDK版本:需在JDK 17或以上。
  1. Spring Boot版本:需要3.3.x或更高版本。
  1. 阿里云API Key获取:按照我了解的信息中的指引,在阿里云申请并记录下通义千问的API Key。

环境配置

配置仓库

由于Spring AI Alibaba当前使用的某些组件尚未正式发布到Maven中央仓库,你需要添加Spring官方维护的仓库到你的项目中:

<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>
添加依赖

接下来,添加必要的依赖项以支持RAG功能以及与阿里云大模型的交互:

<parent>
    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-parent</artifactId>

    <version>3.3.4</version>

</parent>

<dependencies>
    <dependency>
        <groupId>com.alibaba.cloud.ai</groupId>

        <artifactId>spring-ai-alibaba-starter</artifactId>

        <version>1.0.0-M2</version>

    </dependency>

    <!-- 其他所需依赖 -->
</dependencies>

API Key配置

将从阿里云获得的API Key设置为环境变量或者直接在application.properties里指定:

spring.ai.dashscope.api-key=这里填写你的API Key

RAG服务实现

创建一个名为RagService的服务类,用于处理RAG相关的逻辑,包括初始化向量存储和文档检索器等:

public class RagService {

    private final ChatClient chatClient;
    private final VectorStore vectorStore;
    private final DashScopeApi dashscopeApi = new DashScopeApi("这里填写你的API Key");
    DocumentRetriever retriever;

    public RagService(ChatClient chatClient, EmbeddingModel embeddingModel) {
        this.chatClient = chatClient;
        vectorStore = new DashScopeCloudStore(dashscopeApi, new DashScopeStoreOptions("专家答疑库"));
        retriever = new DashScopeDocumentRetriever(dashscopeApi, 
            DashScopeDocumentRetrieverOptions.builder().withIndexName("专家答疑库").build());
    }

    public String buildIndex() {
        String filePath = "专家答疑文档.doc";
        DocumentReader reader = new DashScopeDocumentCloudReader(filePath, dashscopeApi, null);
        List<Document> documentList = reader.get();
        vectorStore.add(documentList);
        return "SUCCESS";
    }

    public StreamResponseSpec queryWithDocumentRetrieval(String message) {
        StreamResponseSpec response = chatClient.prompt()
            .user(message)
            .advisors(new DocumentRetrievalAdvisor(retriever, DEFAULT_USER_TEXT_ADVISE))
            .stream();
        return response;
    }
}

其中,DEFAULT_USER_TEXT_ADVISE应定义为包含{documents}占位符的字符串模板,以便后续替换实际文档内容。

控制器实现

最后,创建一个控制器类,公开/buildIndex/steamChat两个接口,分别对应索引构建和服务请求:

@RestController
@RequestMapping("/ai")
public class RagController {

    private final RagService ragService;

    public RagController(RagService ragService) {
        this.ragService = ragService;
    }

    @GetMapping("/buildIndex")
    public String buildIndex() {
        return ragService.buildIndex();
    }

    @GetMapping("/steamChat")
    public Flux<String> steamChat(@RequestParam(value = "input", required = true) String input,
                                  HttpServletResponse httpResponse) {
        httpResponse.setCharacterEncoding("UTF-8");
        return ragService.queryWithDocumentRetrieval(input).content();
    }
}

通过上述步骤,你已经成功搭建了一个基于Spring AI Alibaba框架的应用程序,它能够利用RAG技术从给定的PDF文件中提取信息,并通过指定的URL对外提供智能对话服务。记得首次启动应用时先访问http://localhost:8080/ai/buildIndex来构建索引,之后就可以正常调用聊天接口了。

流式数据处理:React构建实时聊天应用教程

检索增强的前端代码编写

分析问题的原因

要基于React构建一个简单的支持流输出(如flux<String>)的项目,首先需要确保后端接口能够以流的形式返回数据。本案例中给定的后端接口为http://localhost:8080/ai/steamChat?input=…,它应该已经配置好能够处理请求并返回流式响应。

在React前端部分,关键在于如何正确地读取这个流,并将获取到的信息实时展示给用户。根据我了解的信息中的内容,我们可以了解到如何创建基础的React应用框架以及如何通过Fetch API与后端交互来实现这一目标。特别地,对于流式响应,我们需要使用ReadableStream相关API来逐块接收数据,并即时更新UI。

构建并运行项目的步骤

由于我了解的信息提供了构建基本React项目的方法和所需代码,这里直接给出基于上述要求的具体实现步骤:

  1. 初始化新的React应用:
npx create-react-app frontend
cd frontend
npm install
  1. 编辑公共HTML文件 (public/index.html) 和入口JavaScript文件 (src/index.js),这部分保持默认或按需修改即可。
  1. 开发主要组件 (src/App.js 和 src/components/ChatComponent.js) 用于显示聊天界面及处理逻辑:
    • App.js 主要是容器作用。
    • ChatComponent.js 实现了输入消息、发送消息、清除消息的功能,特别是从服务器异步获取流数据的部分。
  1. 在 ChatComponent.js 中实现对流的支持,参考如下代码片段:
// ... 其他import语句
function ChatComponent() {
  const [input, setInput] = useState('');
  const [messages, setMessages] = useState('');

  const handleSendMessage = async () => {
    try {
      const response = await fetch(`http://localhost:8080/ai/steamChat?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: isDone } = await reader.read();
        done = isDone;
        const chunk = decoder.decode(value, { stream: true });
        setMessages(prev => prev + chunk);
      }
    } catch (error) {
      console.error('Failed to fetch', error);
    }
  };

  // ...其他函数定义

  return (
    <div>
      {/* 输入框、按钮等元素 */}
      <pre>{messages}</pre>  {/* 显示消息区域 */}
    </div>

  );
}

export default ChatComponent;
  1. 启动应用程序:
npm start
对步骤的解释
  • 步骤1至2是标准的新React项目搭建流程。
  • 步骤3和4专注于聊天功能的实际实现。特别是,在处理来自服务器的流时,我们使用了fetch发起HTTP请求,然后利用ReadableStreamgetReader()方法读取流中的数据块,并通过TextDecoder将其转换成可读文本格式。每当收到新的数据块时,就更新状态变量messages,从而触发组件重新渲染,让用户看到最新的消息。
  • 最后一步启动本地开发服务器,使你可以在浏览器中查看你的工作成果。

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

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

相关文章

利用Spring Boot优化企业知识管理

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…

【Java SE】数组的应用

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 1. 数组的概念 1.1 为什么存在数组 1.2 数组是什么 1.3 数组的创建 1.4 数组的初始化 1.4.1 动态初始化 1.4.2 静态初始化 1.4.3 默认值 1.5 数组的使…

【最新华为OD机试E卷-支持在线评测】英文输入法(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…

AD之Layout设计规则

设计规则&#xff1a; 间距 线宽 过孔 铺铜 其他 1.添加类 这里建立了PWR类&#xff0c;与电源相关的网络 2.间距规则:6mil的成本低 3.线宽规则&#xff1a;PWR的优先级排第一&#xff0c;否则不起作用 4.过孔规则&#xff1a;8mil<大小<12mil 4.铺铜规则

音视频开发:FFmpeg库的使用

文章目录 一、FFmpeg的介绍二、FFmpeg的安装三、FFmpeg的使用1.ffplay&#xff1a;播放音视频2.ffprobe&#xff1a;查看视频信息3.ffmpeg&#xff1a;处理视频(1)格式转换(2)帮助 四、参考资料 一、FFmpeg的介绍 FFmpeg 是使用广泛的多媒体框架&#xff0c;是一个强大的音视频…

LeetCode讲解篇之740. 删除并获得点数

文章目录 题目描述题解思路题解代码题解链接 题目描述 题解思路 首先对于这题我们如果将所有点数装入一个切片f中&#xff0c;该切片f中的i号下标表示所有点数为i的点数之和 那么这题就转换成了打家劫舍这道题&#xff0c;也就是求选择了切片中某个下标的元素后&#xff0c;该…

观察者模式和发布-订阅模式的区别

观察者模式是&#xff0c;当被观察者的数据发生变化时&#xff0c;调用被观察者的 notify 方法&#xff0c;去通知所有观察者执行 update 方法进行更新&#xff1b; 对于发布-订阅模式&#xff0c;首先发布者与订阅者互相并不知道彼此的存在&#xff0c;他们是通过事件中心来进…

Element中el-table组件设置max-height右侧出现空白列的解决方法

之前就出现过这个情况&#xff0c;没理过&#xff0c;因为不影响啥除了不美观...但今天看着实在是难受&#xff0c;怎么都不顺眼(可能是我自己烦躁--) 试了很多网上的方法&#xff0c;都不得行&#xff0c;后面发现了这篇文章&#xff0c;解决了! 感谢&#xff01; Element中t…

微知-Mellanox 网卡和NVIDIA Bluefield DPU如何备份firmware?

某些场合需要从网卡或者DPU上读取网卡的firmware 备份命令&#xff1a; flint -d 06:00.0 ri 1.bin实操&#xff1a; 注意&#xff1a; 有些网卡不支持到处firmware

工具软件分享:11个免费的 android数据恢复应用程序功能分析

在手机上丢失数据是一个很大的错误。但是&#xff0c;在这种情况下&#xff0c;除了惊慌失措之外&#xff0c;最好开始使用android数据恢复应用程序搜索以查找将其取回的方法。您可以检查手机的备份存储以在Android上进行数据恢复&#xff0c;但是如果数据仍然无处可寻&#xf…

elementui时间选择器time-picker返回值不对的问题

1. 问题 天杀的elementui的time-picker&#xff0c;导致我开发的系统出现了一次生产问题&#xff0c;原因竟然是因为组件库的bug&#xff01;直接上截图。 如图&#xff0c;正常情况下&#xff0c;选择时间后&#xff0c;想要得到的值理应是当天的时间&#xff0c;如图是当年…

什么是AI网关?AI网关在企业系统中承担什么角色?

AI 大模型的发展正在推动各行业的增长&#xff0c;据有关报告显示&#xff1a;“未来十年内预计年均增长率将达到37.3%&#xff0c;全球企业预计在2027年之前将在AI领域投入8000亿美元"。这一迅猛发展促使许多企业进行战略转型&#xff0c;技术团队也需要调整其构建、运行…

牛客编程初学者入门训练——BC17 缩短二进制

BC17 缩短二进制 描述 我们处理的整数通常用十进制表示&#xff0c;在计算机内存中是以二进制补码形式存储&#xff0c;但通常二进制表示的整数比较长&#xff0c;为了便于在程序设计过程中理解和处理数据&#xff0c;通常采用八进制和十六进制&#xff0c;缩短了二进制补码表…

Spark高级用法-自定义函数

用户可以根据需求自己封装计算的逻辑&#xff0c;对字段数据进行计算 内置函数&#xff0c;是spark提供的对字段操作的方法 &#xff0c;split(字段) 对字段中的数进行切割&#xff0c;F.sum(字段) 会将该字段下的数据进行求和 实际业务中又能内置函数不满足计算需求&#xff0…

AI如何对产品设计带来更多的可能性?

AI(人工智能)对产品设计带来了广泛而深远的可能性&#xff0c;这些可能性主要体现在以下几个方面 1.创新设计的激发 创意生成:AI能够学习和模仿人类设计师的创作过程&#xff0c;通过深度学习等技术生成全新的、独特的设计概念。这些概念可能源于对大量设计案例的学习和分析&am…

AMD在Advancing AI发布会上发布三大核心硬件产品,挑战英伟达AI芯片市场

美国时间10月10日&#xff0c;AMD在旧金山召开了Advancing AI发布会。 这是老对手英伟达2024 AI Summit 结束后的第三天。与英伟达大会的不同之处在于&#xff0c;英伟达专注于软件方面的更新&#xff0c;而AMD主打“硬”牌。 这一次&#xff0c;他们带来了三款核心硬件产品&…

Python 批量转换 Shapefile 为 GeoJSON

批量转换 Shapefile (.shp) 为 GeoJSON 文件的脚本详解 &#x1f5fa;️&#x1f504; 在地理信息系统&#xff08;GIS&#xff09;和遥感领域&#xff0c;Shapefile&#xff08;.shp&#xff09;格式与GeoJSON格式是两种常用的数据格式。Shapefile 作为矢量数据的标准格式之一…

使用scss生成旋转圆圈

图片 html代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title>…

直播相关04-录制麦克风声音, 通过编程录音

一 通过编程录音 开发录音功能的主要步骤是&#xff1a; 注册设备获取输入格式对象打开设备采集数据释放资源 需要用到的FFmpeg库有4个。 extern "C" { // 设备相关API #include <libavdevice/avdevice.h> // 格式相关API&#xff0c;也就是说&#xff0c;win…

Mysql(2)—SQL语法详解(通俗易懂)

一、关于SQL 1.1 简介 SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是一种用于管理关系型数据库的标准编程语言。它主要用于数据的查询、插入、更新和删除等操作。SQL最初在1970年代由IBM的研究人员开发&#xff0c;旨在处理关系数据模型…