使用Spring AI 和 LLM 实现数据库查询

AIDocumentLibraryChat 项目已扩展为支持提问来搜索关系数据库。用户可以输入一个问题,然后嵌入搜索相关的数据库表和列来回答问题。然后,LLM 获取相关表的数据库架构,并根据找到的表和列生成一个 SQL 查询,来展示结果回答问题。

数据集和元数据

使用的开源数据集有 6 个表,彼此之间有关系。它包含有关博物馆和艺术品的数据。为了获得有用的问题查询,必须为数据集提供元数据,并且必须在嵌入中转换元数据。

数据集和元数据

为了使 LLM 能够找到所需的表和列,它需要知道它们的名称和描述。对于像 museum 表这样的所有数据表,元数据都存储在 column_metadata 和 table_metadata 表中。它们的数据可以在以下文件中找到: column_metadata.csv 和 table_metadata.csv它们包含表或列的唯一 ID、名称、描述等。该描述用于创建与问题嵌入进行比较的嵌入。描述的质量对结果有很大的影响,因为更好的描述会使嵌入更精确。提供同义词是提高质量的一种选择。表元数据包含表的模式,以便仅向 LLM 提示符添加相关的表模式。

嵌入

为了在 Postgresql 中存储嵌入,使用了向量扩展。可以使用 OpenAI 端点或 Spring AI 提供的 ONNX 库创建嵌入。创建了三种类型的嵌入:

  • Tabledescription嵌入
  • Columndescription嵌入
  • Rowcolumn嵌入

Tabledescription 嵌入有一个基于表描述的向量,嵌入有 tablename、datatype = table 和元数据中的元数据 id。
Columndescription 嵌入有一个基于列描述的向量,嵌入有表名、带列名的数据名、datatype = column 和元数据中的元数据 id。

Rowcolumn 嵌入有一个基于内容行列值的向量。用于美术作品的样式或主题,以便能够使用问题中的值。元数据具有datatype = row、作为 dataname 的列名、表名和元数据 id。

实现搜索

搜索有 3 个步骤:

  1. 检索嵌入
  2. 创建提示
  3. 执行查询并返回结果

检索嵌入

为了从具有向量扩展的 Postgresql 数据库中读取嵌入,Spring AI 使用 DocumentVSRepositoryBean 中的 VectorStore

### Spring AI RAG 的概述 Spring AI RAG(Retrieval-Augmented Generation)是一种结合了检索增强生成的技术,旨在提升自然语言处理任务中的上下文理解生成质量。该技术通过将外部知识库与生成模型相结合,在保持高效的同时提高了生成内容的准确性[^1]。 具体来说,Spring AI RAG 利用了嵌入模型(Embedding Model)向量数据库实现高效的语义匹配。这种设计允许开发者快速检索相关文档并将其作为输入传递给生成模型,从而显著提高生成结果的质量[^2]。 --- ### Spring AI RAG 的核心组件 以下是 Spring AI RAG 中的核心组成部分及其作用: #### 1. **Embedding 模型** 嵌入模型用于将文本转换为高维向量表示。这些向量可以捕捉文本的语义特征,并被存储在向量数据库中以便后续检索。例如,可以通过引入 OpenAI 提供的 `embedding` API 来完成这一过程。 #### 2. **向量数据库** 向量数据库负责存储管理由嵌入模型生成的向量数据。常见的向量数据库包括 Milvus Pinecone 等工具。它们提供了高效的相似度查询功能,能够在毫秒级时间内返回最接近目标向量的结果。 #### 3. **生成模型** 在获取到相关文档片段之后,生成模型会利用这些信息生成最终输出。这一步骤通常涉及调用大型预训练语言模型(LLM),比如通义千问 Qwen 或其他第三方服务商提供的 LLM 接口。 --- ### Spring AI RAG 的使用方法 为了更好地理解如何使用 Spring AI RAG 技术,下面给出了一种典型的配置流程以及代码示例。 #### 配置 Maven 依赖项 首先需要确保项目的 `pom.xml` 文件中包含了必要的依赖项。对于希望集成 OpenAI Embedding 功能的情况,可按照如下方式添加依赖: ```xml <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-openai-spring-boot-starter</artifactId> <version>1.0.0-M1</version> </dependency> ``` 上述代码片段展示了如何引入 OpenAI 支持所需的 Starter 组件。 #### 初始化服务实例 接下来定义一个简单的 Java 类用来初始化所需的服务对象。这里假设已经完成了基础环境搭建工作并且拥有有效的 API 密钥访问权限。 ```java import org.springframework.ai.openai.OpenAIClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AppConfig { @Bean public OpenAIClient openAiClient() { return new OpenAIClient("your-api-key-here"); } } ``` 此部分实现了对 OpenAI 客户端实例化操作的支持。 #### 实现基本逻辑 最后编写实际业务场景下的代码实现。以下是一个完整的例子演示了整个流程从创建请求直到接收响应为止的关键环节。 ```java @Service public class RagService { private final OpenAIClient client; public RagService(OpenAIClient client) { this.client = client; } public String generateResponse(String query) throws Exception { // Step 1: Convert the input into an embedding vector. var embeddingsRequest = new EmbeddingsRequest(query); var embeddingsResponse = client.createEmbeddings(embeddingsRequest); double[] queryVector = embeddingsResponse.getData().get(0).getEmbedding(); // Step 2: Query a vector database to find similar documents (not shown here). // Assume we have retrieved some relevant document snippets as context. List<String> contexts = Arrays.asList( "Context snippet A", "Context snippet B" ); StringBuilder promptBuilder = new StringBuilder(); for (String ctx : contexts) { promptBuilder.append(ctx).append("\n\n"); } promptBuilder.append("Question: ").append(query).append("\nAnswer:"); // Step 3: Use the combined information to call a generation model like Qwen or GPT. CompletionRequest completionRequest = new CompletionRequest(promptBuilder.toString()); CompletionResponse response = client.createCompletion(completionRequest); return response.getChoices().get(0).getText(); } } ``` 以上代码说明了如何逐步执行检索增强生成的任务链路,涵盖了从原始询问转化为嵌入形式直至最终获得答案的所有主要阶段。 --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值