用Spring AI 做智能客服,基于私有知识库和RAG技术

news2024/10/16 16:29:49

Java智能客服系统运用RAG技术提升答疑精准度

基于Spring ai 的 RAG(检索增强生成)技术,Java智能客服系统能够利用私有知识库中的信息提供更准确的答疑服务。

它的核心思路是:

首先,将客服QA以Word形式导入到系统中,通过向量化处理并存储在如阿里云的远程VectorStore中。

当用户提出问题时,Java编写的智能客服程序使用DocumentRetriever从VectorStore检索相关文档片段,并将其与原始查询一起传递给大模型进行处理。

大模型结合上下文信息生成回复内容,从而实现了基于已有知识的有效客户互动。此过程中,Spring AI Alibaba框架支持无缝集成这些组件,确保了Java智能客服解决方案的高度可扩展性和灵活性。

RAG 是一种用于提升大模型精准度的检索增强生成技术

检索增强生成 (RAG) 是一种结合了检索模型和生成模型的技术,以提高大模型的响应准确性。在使用大模型时,一个常见问题是模型可能会产生“幻觉”,即生成的信息可能并不准确或相关。此外,大模型通常不包含企业的私有知识库,因此其回答可能过于泛泛而不精准。RAG通过引入私有知识库解决了这些问题,使得模型能够基于具体且专有的数据集生成更加精确、具体的答案。这样,不仅可以减少模型的幻觉现象,还能让生成的内容更贴合企业的实际情况。

Spring AI Alibaba 是一个阿里依托Spring AI构建的本地化最佳实践

Spring AI Alibaba 是一个基于 Java 的框架,旨在将 Spring 生态系统的设计原则应用到人工智能领域。它为开发者提供了一个统一的接口,使得对接不同AI服务提供商(如阿里云、OpenAI等)变得简单且高效。由Spring官方团队维护,确保了高质量与持续更新。此外,Spring AI Alibaba还整合了阿里巴巴集团的最佳实践,特别是关于RAG(检索增强生成)技术的应用,使开发者能够轻松构建具备复杂对话能力的应用程序。通过标准化的接口和强大的后端支持,Spring AI Alibaba极大地简化了在Java项目中集成高级AI功能的过程。

后端编码实践:打造检索增强的Spring AI Alibaba应用

为了实现通过读取一个名为“智能客服的专家QA.docs”的word文件来构建向量索引,并提供对外服务的功能,我们需要按照以下步骤进行操作:

前置要求

确保你的开发环境满足如下条件:

  • JDK版本在17或以上。
  • Spring Boot版本在3.3.x或以上。

获取并配置API Key

  1. 登录阿里云账号,访问阿里云百炼页面,开通“百炼大模型推理”服务。
  1. 开通成功后,创建一个新的API Key,并记下它,用于后续配置。

设置环境变量或者通过application.properties注入API Key:

export AI_DASHSCOPE_API_KEY=YOUR_VALID_API_KEY

或者在application.properties中添加:

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

添加仓库和依赖

由于所需的Spring AI Alibaba相关组件尚未提交到Maven中央仓库,因此需要添加Spring自己的仓库和snapshot仓库至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>

并在项目中引入必要的依赖项:

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

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

  <version>1.0.0-M2</version>

</dependency>

构建RAG服务

接下来定义我们的RagService类,负责处理文档读取、索引构建及查询逻辑。

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;
    this.vectorStore = new DashScopeCloudStore(dashscopeApi, new DashScopeStoreOptions("智能客服知识库"));
    this.retriever = new DashScopeDocumentRetriever(dashscopeApi,
        DashScopeDocumentRetrieverOptions.builder().withIndexName("智能客服知识库").build());
  }

  public String buildIndex() {
    String filePath = "/path/to/智能客服的QA.docs"; // 更改为你实际文件路径
    DocumentReader reader = new DashScopeDocumentCloudReader(filePath, dashscopeApi, null);
    List<Document> documentList = reader.get();
    vectorStore.add(documentList);
    return "SUCCESS";
  }

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

创建Controller暴露服务

最后,创建一个控制器来暴露构建索引和聊天接口。

@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 = false) String input, HttpServletResponse response) {
    if (input == null || input.isEmpty()) {
      input = "默认问题";
    }
    StreamResponseSpec chatResponse = ragService.queryWithDocumentRetrieval(input);
    response.setCharacterEncoding("UTF-8");
    return chatResponse.content();
  }
}

解释

上述步骤首先确保了开发环境满足基本需求并通过阿里云获取到了必要的API密钥。接着通过自定义仓库地址和添加特定依赖,使得Spring应用能够利用阿里云提供的AI能力。RagService类实现了从指定文件读取数据并构建向量索引的过程,而RagController则提供了两个HTTP GET方法:一个用于初始化索引(/buildIndex),另一个用于基于构建好的索引来响应用户的查询请求(/steamChat)。这种方式允许开发者灵活地使用外部文档作为信息来源,增强了应用程序与用户之间的交互体验。

React实战:构建实时聊天应用教程


为了基于React构建一个简单的支持流输出的前端项目,我们可以遵循以下步骤。这个项目的后端接口位于 http://localhost:8080/ai/steamChat?input=…,并且返回类型为 Flux<String>

1. 创建一个新的 React 应用并安装所需依赖

首先,使用create-react-app创建一个新的React应用,并进入项目目录安装必要的npm包:

npx create-react-app frontend
cd frontend
npm install

2. 编写基础HTML文件

编辑public/index.html以设置基本的文档结构:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Stream Chat App</title>

</head>

<body>
  <div id="root"></div>

</body>

</html>

3. 配置入口文件

修改src/index.js来渲染根组件App:

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';

ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById('root')
);

4. 设计主应用组件

src/App.js中定义App组件,它将作为整个应用程序的容器,并引入聊天组件:

import React from 'react';
import ChatComponent from './components/ChatComponent';

function App() {
  return (
    <div className="App">
      <ChatComponent />
    </div>

  );
}

export default App;

5. 实现聊天组件

最后,在src/components/ChatComponent.js内编写实际处理用户输入和显示消息逻辑的部分。这部分代码会发送请求到给定的后端URL,并处理从服务器接收到的数据流。

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/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: readerDone } = await reader.read();
        done = readerDone;
        const chunk = decoder.decode(value, { stream: true });
        setMessages((prevMessages) => prevMessages + chunk);
      }
    } 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;

上述代码段展示了如何通过异步函数handleSendMessage向后端发起请求,并读取响应体中的数据流。每次接收到新数据时,都会更新状态变量messages以反映最新的消息内容。

6. 启动项目

完成所有配置与编码后,您可以通过执行以下命令启动前端开发服务器:

npm start

这将使您的应用在本地开发环境中运行于http://localhost:3000


这段描述提供了一个详细的指南来帮助开发者理解如何根据需求建立一个简单的基于React的支持流输出的前端项目。它覆盖了从初始化项目直到实现关键功能(如发送消息及实时接收响应)的全过程。

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

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

相关文章

python配合yolo分类模型开发分类软件

上一篇文章写了yolo的分类模型的训练&#xff0c;写篇文章基于yolo分类模型开发分类软件。开发环境:pycharm&#xff0c;PySide6 6.6.1 &#xff0c;PySide6-Addons 6.6.1&#xff0c;PySide6-Essentials 6.6.1&#xff0c;torch 2.3.1cu121&#xff0c;torchaudio 2.3.1cu121&…

能源领域下暖通行业现状-研究

基于AI大语言模型的暖通行业能源管理系统构建研究 一、能源管理中的突出问题 1. **能源消耗监测不准确** 现有的监测系统在获取设备实时能耗数据方面存在精度不足的问题&#xff0c;难以准确反映能源的实际使用情况。这使得节能决策缺乏可靠的数据支持&#xff0c;无法精准定位…

Hbase安装及使用

安装 官网下载:Apache HBase – Apache HBase Downloads 启动 先启动zookeeper及hadoop 关系&#xff1a;HBase通过Zookeeper来做master的高可用、RegionServer的监控、元数据的入口以及集群配置的维护等工作。 再启动start-hbase.sh(/opt/module/hbase-2.2.3/bin&#xf…

大华智能云网关注册管理平台 SQL注入漏洞复现(CNVD-2024-38747)

0x01 产品简介 大华智能云网关注册管理平台是一款专为解决社会面视频资源接入问题而设计的高效、便捷的管理工具,平台凭借其高效接入、灵活部署、安全保障、兼容性和便捷管理等特点,成为了解决社会面视频资源接入问题的优选方案。该平台不仅提高了联网效率,降低了联网成本,…

【计算机网络】详解IP协议网段划分路由转发子网掩码网络号

一、IP功能 IP可以实现主机定位和路由选择&#xff0c;提供一种能力&#xff0c;将数据可靠地从A点跨网络送到B点。数据先根据目的IP在局域网之间进行转发&#xff0c;再在局域网内进行内网转发。 二、IP协议报头 4 位版本号(version)&#xff1a;指定 IP 协议的版本&#xff…

如何轻松使用pip安装Git仓库中的私有Python模块(使用pip和Git仓库发布和安装私有Python模块)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Git模块 📒📝 Git仓库要求🔖 项目目录结构🔖 文件说明📝 编写setup.py📝 配置MANIFEST.in📝 推送代码到Git仓库📝 使用pip安装模块🔖 使用用户名和密码🔖 使用Personal Access Token (PAT)🔖 示例📝 更…

opencv外接矩形cv2.boundingRect和cv2.minAreaRect区别

在OpenCV中&#xff0c;cv2.boundingRect和cv2.minAreaRect是两个用于获取图像中形状边界的函数&#xff0c;但它们在功能和返回结果上有所不同。以下是两者的详细区别&#xff1a; 1. cv2.boundingRect 和 cv2.minAreaRect 功能描述 cv2.boundingRect 主要是用来计算图像轮廓…

企业资产安全之数据防泄密要领

在数字化时代&#xff0c;数据已成为企业最宝贵的资产之一。然而&#xff0c;随着数据价值的增加&#xff0c;数据泄露的风险也随之上升。从内部员工的无意泄露到外部黑客的恶意攻击&#xff0c;企业数据安全面临着前所未有的挑战。SDC沙盒数据防泄密解决方案&#xff0c;正是为…

从零入门AI篡改图片检测(金融场景)#Datawhale十月组队学习

1.大赛背景 在全球人工智能发展和治理广受关注的大趋势下&#xff0c;由中国图象图形学学会、蚂蚁集团、云安全联盟CSA大中华区主办&#xff0c;广泛联合学界、机构共同组织发起全球AI攻防挑战赛。本次比赛包含攻防两大赛道&#xff0c;分别聚焦大模型自身安全和大模型生成内容…

Android Compose使用LinearProgressIndicator绘制显示异常

使用依赖版本 androidx.compose.material3:material3:1.3.0-beta05 对应代码 LinearProgressIndicator(progress { 0.7f })直接使用上述代码绘制进度条时&#xff0c;最终显示效果如下&#xff1a; 问题原因 LinearProgressIndicator中gapSize属性表示进度和背景之前的空…

【文献及模型、制图分享】中国新型城镇化与绿色发展协调演进关系研究(熵值法、耦合协调模型)

文献介绍 双碳目标下&#xff0c;新型城镇化与绿色发展的协调演进对于推动中国经济高质量发展意义重大。运用熵值法、耦合协调模型等研究方法&#xff0c;分析了2005—2020年中国30个省&#xff08;自治区、直辖市&#xff09;新型城镇化与绿色发展协调演进的时空格局特征与类…

DOM中的元素获取方式、事件以及属性操作

一、WebApi介绍 1. Api的概念 API ( Application Programming Interface&#xff1a;应用程序编程接口) 是一些预先定义的函数&#xff0c;目的是提供应用程序与开发人员基于某软件或硬件得以访问一组程序的能力&#xff0c;而又无需访问源码&#xff0c;无需了解其内部的工作…

26K star!学习AI也不难,这个项目讲的非常全

马上就要2024年了&#xff0c;谁不想学习一下AI相关的知识呢&#xff1f;怎么开始上手一直困扰着很多初学者&#xff0c;现在网上也充斥着各种搬运的垃圾课程&#xff0c;更是让人难以选择&#xff0c;我们就是希望帮初学者避开那些垃圾内容。 今天我们推荐的开源项目是微软推…

Windows上安装Go并配置环境变量(图文步骤)

前言 1. 本文主要讲解的是在windows上安装Go语言的环境和配置环境变量&#xff1b; Go语言版本&#xff1a;1.23.2 Windows版本&#xff1a;win11&#xff08;win10通用&#xff09; 下载Go环境 下载go环境&#xff1a;Go下载官网链接(https://golang.google.cn/dl/) 等待…

阿里大佬带你一周刷完 Java 面试八股文,比刷视频效果好多了

今天在脉脉刷到了这么一条消息&#xff0c;现在这个大环境&#xff0c;都后悔学 Java 了&#xff0c;想转行学前端&#xff0c; 看完很是震惊&#xff0c;据大数据统计&#xff0c;Java 的待遇是要好过前端的。小伙伴竟然被卷到想要转行......但是行情这个东西&#xff0c;也不…

Python实时视频流+网络摄像头+视频检测流程播放

实时视频处理 概述需求网络摄像头推流流媒体服务器查看设备视频、音频设备列表查看指定设备配置信息 不编码、指定分辨率推流编码加速python服务端处理多线程最终的处理方式 问题与分析 概述 一款桌面应用&#xff0c;可以配置视频处理参数&#xff0c;根据参数播放网络摄像头…

MySQL 8.4.0解压版安装记录

这几天&#xff0c;安装最新版mysql 8.4的时候&#xff0c;遇到了不少问题&#xff0c;网上的教程大多数都是旧版本的&#xff0c;也安装不成功。 参考了大量教程后&#xff0c;经过自己的摸索终于装好了&#xff0c;这里记录一下。 我下载的是8.4.0 LTS MySQL :: Download …

智绘城市地图:使用百度地图 API 实现智能定位

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

全网最易详解-数据仓库分区详解

最近要搭某个业务域的数仓&#xff0c;本来设计规划的挺好的&#xff0c;该搭DIM,DWD,DWS的也都设计好了&#xff0c;结果一跑数仓&#xff0c;全是大大小小的BUG&#xff0c;最后揪出来整个过程&#xff0c;最大的烦人东西就是设计ETL数据入库分区的问题。 那么这时候肯定有…

AI大模型学习路线,只看这一篇就够了!

1. 打好基础&#xff1a;数学与编程 数学基础 线性代数&#xff1a;理解矩阵、向量、特征值、特征向量等概念。 推荐课程&#xff1a;Khan Academy的线性代数课程、MIT的线性代数公开课。 微积分&#xff1a;掌握导数、积分、多变量微积分等基础知识。 推荐课程&#xff1a…