【Spring AI】Java实现类似langchain的向量数据库RAG_原理与具体实践 ...

打印 上一主题 下一主题

主题 872|帖子 872|积分 2616

先容一下RAG:

检索增强生成(RAG)是一种技能,它结合了检索模型和生成模型来进步文本生成的质量。通过从企业私有或专有的数据源中检索干系信息,并将这些信息与大型语言模型相结合,RAG能够显著镌汰模型产生幻觉的情况,同时使复兴更加精确、干系。这办理了大模型在缺乏特定上下文或最新数据时提供的答案不敷准确的题目。
向量数据库在Rag中的具体作用阐明:

在检索增强生成(RAG)过程中,向量数据库起着焦点作用。首先,原始文档或数据通过Embedding模型转化为高维向量,随后这些向量被存储于向量数据库中。当有新的查询哀求时,系统将该查询也转换为相应的向量,并在向量数据库中查找最相似的向量以获取干系上下文信息。使用向量数据库的原因在于其能高效地处理大规模高维向量的存储与检索题目,支持快速精确匹配,这对于进步RAG系统的响应速度及准确性至关重要。别的,向量数据库还能够很好地支持非结构化数据的管理,使得从大量文本或其他类型的内容中提取有价值的信息成为可能。
Spring AI alibaba 是什么:

Spring AI Alibaba 是基于 Spring Boot 的应用框架,专为 Java 开发者设计,用于集成和使用阿里云的通义大模型等AI服务。其焦点优势在于提供了标准化接口,使得开发者能够以一致的方式访问差别AI供应商(如OpenAI、Azure、阿里云)的服务,只需更改设置即可切换差别的AI实现。这极大简化了开发流程,镌汰了因适配差别API而带来的工作量。别的,Spring AI Alibaba 还支持多种生成式使命,如对话、文生图、语音合成,而且与 Flux 流输出兼容,方便构建复杂的AI应用。通过Spring Boot的自动装配机制,可以轻松地在现有项目中添增强盛的AI能力。

具体实践:

检索增强的后端代码编写

为了实现基于检索增强生成 (RAG) 的功能,以读取阿里巴巴财政报表PDF并提供相应的服务,我们首先需要明白怎样设置Spring AI Alibaba来支持RAG能力。根据提供的我相识的信息,这涉及到一系列的预备工作和具体的代码实现步骤。
1. 情况预备



  • JDK版本:确保你的开发情况使用的是JDK 17或更高版本。


  • Spring Boot版本:项目需基于Spring Boot 3.3.x及以上版本构建。


  • 阿里云账号与API Key获取




    • 登录阿里云百炼平台,开通“百炼大模型推理”服务。





    • 服务开通后,在用户中央创建一个新的API Key,并妥善保存用于后续设置。

2. 设置阿里云通义千问 API Key

在你的应用步伐情况中设置AI_DASHSCOPE_API_KEY情况变量:
  1. export AI_DASHSCOPE_API_KEY=您的实际API密钥
复制代码
并在application.properties文件中添加如下设置项来引用这个情况变量:
  1. spring.ai.dashscope.api-key: ${AI_DASHSCOPE_API_KEY}
复制代码
3. 添加必要的依靠库

由于Spring AI Alibaba现在处于早期阶段,其Maven仓库尚未正式发布全部干系组件,因此我们需要指定额外的仓库地址以便能够下载所需的库。请将以下仓库设置参加到你的pom.xml文件内:
  1. <repositories>
  2.     <repository>
  3.         <id>sonatype-snapshots</id>
  4.         <url>https://oss.sonatype.org/content/repositories/snapshots</url>
  5.         <snapshots>
  6.             <enabled>true</enabled>
  7.         </snapshots>
  8.     </repository>
  9.     <repository>
  10.         <id>spring-milestones</id>
  11.         <name>Spring Milestones</name>
  12.         <url>https://repo.spring.io/milestone</url>
  13.         <snapshots>
  14.             <enabled>false</enabled>
  15.         </snapshots>
  16.     </repository>
  17.     <repository>
  18.         <id>spring-snapshots</id>
  19.         <name>Spring Snapshots</name>
  20.         <url>https://repo.spring.io/snapshot</url>
  21.         <releases>
  22.             <enabled>false</enabled>
  23.         </releases>
  24.     </repository>
  25. </repositories>
  26. <dependencies>
  27.     <dependency>
  28.         <groupId>com.alibaba.cloud.ai</groupId>
  29.         <artifactId>spring-ai-alibaba-starter</artifactId>
  30.         <version>1.0.0-M2</version>
  31.     </dependency>
  32.     <!-- 其他必要的依赖 -->
  33. </dependencies>
复制代码

4. RAG服务实现

接下来是焦点的服务逻辑实现,包罗向量存储、文档检索等关键组件的定义。我们将创建一个名为RagService的服务类,它负责处理从PDF提取内容、建立索引以及终极基于查询条件进行响应的过程。
创建RagService类

  1. public class RagService {
  2.     // ...省略了构造器和其他成员变量声明...
  3.    
  4.     public String buildIndex() {
  5.         String filePath = "阿里巴巴财报.pdf";
  6.         DocumentReader reader = new DashScopeDocumentCloudReader(filePath, dashscopeApi, null);
  7.         List<Document> documentList = reader.get();
  8.         vectorStore.add(documentList);
  9.         return "索引构建完成";
  10.     }
  11.    
  12.     public StreamResponseSpec queryWithDocumentRetrieval(String message) {
  13.         StreamResponseSpec response = chatClient.prompt().user(message)
  14.                 .advisors(new DocumentRetrievalAdvisor(retriever, DEFAULT_USER_TEXT_ADVISE)).stream();
  15.         return response;
  16.     }
  17. }
复制代码
提供REST接口

最后一步是在Controller层暴露两个端点,一个是用来初始化索引的/buildIndex,另一个则是实际对外提供查询服务的/ragChat:
  1. @RestController
  2. @RequestMapping("/ai")
  3. public class RagController {
  4.     @Autowired
  5.     private RagService ragService;
  6.     @GetMapping("/buildIndex")
  7.     public String buildIndex() {
  8.         return ragService.buildIndex();
  9.     }
  10.     @GetMapping("/ragChat")
  11.     public Flux<String> generate(@RequestParam("input") String input, HttpServletResponse httpResponse) {
  12.         StreamResponseSpec chatResponse = ragService.queryWithDocumentRetrieval(input);
  13.         httpResponse.setCharacterEncoding("UTF-8");
  14.         return chatResponse.content();
  15.     }
  16. }
复制代码
以上就是通过检索增强技能实现读取PDF文件并提供问答服务的整体流程。此方案使用了Spring AI Alibaba提供的RAG框架,并结合阿里云的大规模语言模型能力,实现了高效的知识检索与自然语言处理。在实际摆设前,请确保全部依靠均已被正确添加至项目,而且已按照要求设置了正确的情况变量及属性设置。
检索增强的前端代码编写

检索增强的前端代码编写

根据我相识的信息中提供的关于基于React构建支持流输出的前端项目标内容,我们可以按照类似的步骤来构建一个能够与后端http://localhost:8080/ai/ragChat?input=…接口交互,并处理返回的flux<String>数据流的前端应用。下面将具体叙述怎样搭建这样的项目。
构建项目并填写代码

首先,我们需要创建一个新的React应用,并确保安装全部必需的依靠项。这可以通过运行以下下令实现:
  1. npx create-react-app ragchat-frontend
  2. cd ragchat-frontend
  3. npm install
复制代码
接下来,我们将依次设置或修改几个关键文件以满足项目需求。
public/index.html

无需特别改动此文件,保持默认内容即可。
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.   <meta charset="UTF-8">
  5.   <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.   <title>RAG Chat App</title>
  7. </head>
  8. <body>
  9.   <div id="root"></div>
  10. </body>
  11. </html>
复制代码
src/index.js

同样地,这个文件基本可以保持原样,仅用于渲染应用入口组件App。
  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. import App from './App';
  4. ReactDOM.render(
  5.   <React.StrictMode>
  6.     <App />
  7.   </React.StrictMode>,
  8.   document.getElementById('root')
  9. );
复制代码
src/App.js

这里是主应用步伐组件,我们将其简单指向我们的谈天组件RAGChatComponent。
  1. import React from 'react';
  2. import RAGChatComponent from './components/RAGChatComponent';
  3. function App() {
  4.   return (
  5.     <div className="App">
  6.       <RAGChatComponent />
  7.     </div>
  8.   );
  9. }
  10. export default App;
复制代码
src/components/RAGChatComponent.js

这是焦点功能地点的地方。我们需要在此处添加逻辑来发送哀求到指定的URL,而且处理从服务器吸收到的数据流。
  1. import React, { useState } from 'react';
  2. function RAGChatComponent() {
  3.   const [input, setInput] = useState('');
  4.   const [messages, setMessages] = useState('');
  5.   const handleInputChange = (event) => {
  6.     setInput(event.target.value);
  7.   };
  8.   const handleSendMessage = async () => {
  9.     try {
  10.       const response = await fetch(`http://localhost:8080/ai/ragChat?input=${input}`);
  11.       if (!response.ok) throw new Error("Network response was not ok");
  12.       
  13.       const reader = response.body.getReader();
  14.       const decoder = new TextDecoder('utf-8');
  15.       let done = false;
  16.       while (!done) {
  17.         const { value, done: readerDone } = await reader.read();
  18.         done = readerDone;
  19.         const chunk = decoder.decode(value, { stream: true });
  20.         setMessages((prevMessages) => prevMessages + chunk);
  21.       }
  22.       // 请求完成后添加换行符
  23.       setMessages((prevMessages) => prevMessages + '\n\n=============================\n\n');
  24.     } catch (error) {
  25.       console.error('Failed to fetch', error);
  26.     }
  27.   };
  28.   const handleClearMessages = () => {
  29.     setMessages('');
  30.   };
  31.   return (
  32.     <div>
  33.       <input
  34.         type="text"
  35.         value={input}
  36.         onChange={handleInputChange}
  37.         placeholder="Enter your message"
  38.       />
  39.       <button onClick={handleSendMessage}>Send</button>
  40.       <button onClick={handleClearMessages}>Clear</button>
  41.       <div>
  42.         <h3>Messages:</h3>
  43.         <pre>{messages}</pre>
  44.       </div>
  45.     </div>
  46.   );
  47. }
  48. export default RAGChatComponent;
复制代码
通过以上步骤,你已经成功设置了一个简单的React应用,该应用能够向给定的后端服务发送哀求,并及时表现返回的文本流。请确保你的后端服务正在本地运行于http://localhost:8080,而且允许来自前端的跨域哀求(CORS)。假如需要进一步定制样式或其他功能,可以根据实际需求调整上述代码。



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

水军大提督

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表