使用Spring AI 、 Qdrant 和 Ollama 实现完全本私有化的RAG应用
迄今为止,Python 一直是实现检索增强生成(RAG)应用程序的首选语言,几乎成为开发大型语言模型(LLM)应用程序的默认选择。然而,对于 Java 的爱好者和倡导者来说,这一趋势并不意味着终结。恰恰相反,这是一种创新的机会。在这篇文章中,我们将探讨如何创建一个可扩展的、本地化的 RAG 应用程序,以处理复杂的文档。这将通过整合 #springboot 的稳健性、#qdrant 的高效性和 #ollama 的智能性来实现。
介绍
图片中所描绘的架构代表了一种处理和分析复杂文档(如调研报告、财务报告等)的复杂方法。用户首先通过一个称为 /load 的 API 上传文档,然后使用另一个称为 /ask 的 API 向系统提问。这表明这是一个交互式系统,初始动作是文档上传,随后是查询过程,使用户能够从上传的文档中提取有意义的信息。
此架构的核心是 “Spring AI”,当用户上传文档时,Spring AI 接收解析并分析文本。它将复杂文档的内容转化为一种结构化形式,使其适合于高级数据处理技术。Spring AI 的精髓在于其能够细致地理解和消化这些文档的内容,为处理过程的下一阶段做准备。
在 Spring AI 的初步处理之后,我们进入数据处理和存储的领域。在这里,处理后的数据被转换为向量,即捕捉文档语义本质的数值表示。这个转换至关重要,因为它使系统能够执行复杂的推理,这一任务由 Ollama 的组件管理。AI 驱动的 Llama3 模型随后使用这些嵌入来理解和解释内容,从而对用户查询做出智能响应。最后,这些嵌入被存储在专为文档设计的向量存储 Qdrant 中。通过将信息存储为向量,系统确保能够高效地检索和分析数据,从而快速、智能地响应用户查询。这种存储解决方案是系统能够处理重复交互的基础,每次查询都利用存储的嵌入来提供精确和上下文相关的见解。
通过这种三位一体的架构,系统提供了一种从文档上传到信息检索的无缝体验,由处理和理解复杂调研数据的高级 AI Llama3 所支撑。
实现
项目脚手架如下:
下面是代码详情
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>org.liugddx</groupId>
<artifactId>springboot-rag</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-rag</name>
<description>springboot-rag</description>
<properties>
<java.version>21</java.version>
<spring-ai.version>0.8.1</spring-ai.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-qdrant-store-spring-boot-starter</artifactId>
</de