Spring AI 向量数据库详解与 RAG 简单实战项目

一、什么是向量数据库?

向量数据库用于存储、检索稠密语义向量(Embedding),是构建 RAG(检索增强生成)系统的核心组件。它支持近似最近邻搜索(ANN),可根据语义相似度找出最相关的文本。


二、Spring AI 的向量库支持

Spring AI 提供统一接口 VectorStore,支持以下数据库作为向量存储:

向量数据库模块依赖特点
Redisspring-ai-redis-store快速、适合中小规模
PGVectorspring-ai-pgvector-storePostgreSQL 扩展
Milvusspring-ai-milvus-store高性能向量引擎
Qdrantspring-ai-qdrant-storeRust 编写,支持 REST

三、核心接口结构

public interface VectorStore {void add(List<Document> documents);List<Document> similaritySearch(String query, int topK);
}

文档结构

public class Document {private String content;private Map<String, String> metadata;
}

四、文本转向量底层原理

Spring AI 使用 EmbeddingClient 调用 LLM 服务(如 OpenAI)将文本转为向量:

EmbeddingResponse embed(String input);
  • 背后原理是 Transformer 模型中的 Encoder,将语义映射到向量空间
  • 常用模型:text-embedding-ada-002(1536维)

五、以 PGVector 为例的工作流程

添加向量

EmbeddingResponse response = embeddingClient.embed("企业文化内容");
Document doc = new Document("企业文化内容", Map.of("topic", "文化"));
vectorStore.add(List.of(doc));

底层使用 SQL 插入向量字段(float8[]):

INSERT INTO documents (content, metadata, embedding)
VALUES (?, ?, ?::vector)

查询向量

List<Document> docs = vectorStore.similaritySearch("公司节假日安排", 3);

生成查询 embedding,执行 SQL:

SELECT * FROM documents
ORDER BY embedding <-> ?::vector
LIMIT 3;

六、RAG 实战项目结构(Spring AI)

项目目标:上传知识文档,生成向量库,用户提问返回智能回答。

项目结构

spring-ai-rag-demo/
├── config/
│   └── AiConfig.java
├── controller/
│   └── QaController.java
├── service/
│   └── RagService.java
├── util/
│   └── TextSplitter.java
├── application.yml

application.yml 示例

spring:ai:openai:api-key: sk-xxxchat:model: gpt-3.5-turboembedding:model: text-embedding-ada-002vectorstore:type: pgvectorindex-name: rag_documentsdimensions: 1536

配置类

@Configuration
public class AiConfig {@Beanpublic EmbeddingClient embeddingClient(OpenAiEmbeddingClient client) {return client;}
}

TextSplitter 工具类

public class TextSplitter {public static List<String> split(String text, int chunkSize) {List<String> chunks = new ArrayList<>();for (int i = 0; i < text.length(); i += chunkSize) {chunks.add(text.substring(i, Math.min(i + chunkSize, text.length())));}return chunks;}
}

RagService

@Service
@RequiredArgsConstructor
public class RagService {private final EmbeddingClient embeddingClient;private final VectorStore vectorStore;private final ChatClient chatClient;public void uploadDoc(String rawText) {List<String> chunks = TextSplitter.split(rawText, 300);List<Document> docs = chunks.stream().map(text -> new Document(text, Map.of())).toList();vectorStore.add(docs);}public String ask(String question) {List<Document> relevant = vectorStore.similaritySearch(question, 3);String context = relevant.stream().map(Document::getContent).collect(Collectors.joining("\n\n"));Prompt prompt = Prompt.builder().system("你是公司智能问答助手,请结合提供的资料回答问题。").user("资料如下:\n" + context + "\n\n问题:" + question).build();return chatClient.call(prompt).getResult().getOutput().getContent();}
}

控制器

@RestController
@RequiredArgsConstructor
@RequestMapping("/qa")
public class QaController {private final RagService ragService;@PostMapping("/upload")public String upload(@RequestBody String text) {ragService.uploadDoc(text);return "文档已上传并向量化";}@GetMapping("/ask")public String ask(@RequestParam String question) {return ragService.ask(question);}
}

七、向量库选择建议

使用场景推荐向量库原因
小型项目 / 内存快读Redis部署轻便,速度快
需要持久化 + 查询PGVectorSQL 强大,易集成 PostgreSQL 项目
大规模检索系统Milvus/Qdrant高并发 + ANN 检索优化

八、可视化与测试工具

  • RedisInsight 查看 Redis 向量数据
  • pgAdmin/Beekeeper 查看 PG 向量字段
  • Qdrant Console / Milvus UI

九、RAG 流程图

用户上传文档
文本切分
EmbeddingClient 生成向量
存入 VectorStore
用户提问
生成查询向量
VectorStore 相似搜索
拼接 Prompt
ChatClient 生成回答

十、总结

  • Spring AI 使用统一的 VectorStore 接口封装向量数据库操作
  • 向量生成通过 EmbeddingClient 与 OpenAI/Ollama 接口
  • 可基于向量检索构建 RAG 问答系统,支持常见向量库(PGVector、Redis、Milvus)
  • Java 开发者可零门槛快速搭建企业级智能问答系统

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

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

相关文章

【RK3568+PG2L50H开发板实验例程】Linux部分/FPGA FSPI 通信案例

本原创文章由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处&#xff08;www.meyesemi.com) 1. 简介 本案例旨在 ARM端运行 Linux系统&#xff0c;基通过 FSPI测试。 2. ARM端和 FPGA端通信流程 (1)ARM端实现SP…

github如何创建一个自己的仓库保姆级教程

文章目录 准备阶段(github官网)添加ssh公钥添加token创建仓库 本地设置本地代理创建仓库添加文件到仓库进行提交 准备阶段(github官网) 添加ssh公钥 创建SSH KEY。先看一下你C盘用户目录下有没有.ssh目录&#xff0c;有的话看下里面有没有id_rsa和id_rsa.pub这两个文件&#…

LabVIEW 网络流通信功能

LabVIEW 的网络流技术实现主机 VI&#xff08;Host VI&#xff09;与客户端 VI&#xff08;ClientVI&#xff09;间的双向数据交互&#xff0c;包含命令发送与波形数据传输&#xff0c;支持跨设备、跨进程的实时通信&#xff0c;满足分布式系统中数据交互与控制需求。 主机 VI逻…

Prompt 精通之路(一)- AI 时代的新语言:到底什么是 Prompt?为什么它如此重要?

AI 时代的新语言&#xff1a;到底什么是 Prompt&#xff1f;为什么它如此重要&#xff1f; 标签&#xff1a; #Prompt新手指南 #提示词入门 #AI指令 #人工智能 #ChatGPT &#x1f680; Prompt 精通之路&#xff1a;系列文章导航 第一篇&#xff1a;AI 时代的新语言&#xff1a…

uniapp 滚动tab

uniapp woui unibest <route lang"json5">{style: {navigationBarTitleText: 知识产权,navigationBarBackgroundColor: #C80F06,navigationBarTextStyle: white,backgroundColorTop: #C80F06,},} </route> <template><view class"bgc-b …

日事清驾驶舱模式上线:实时数据更新+项目管理+数据可视化,提升决策效率​

大家好&#xff01;我们在日事清最新更新中推出了一个令人激动的新功能——驾驶舱模式。这一全新界面将为企业管理者和团队提供一个全面、实时的数据展示平台。下面&#xff0c;让我们详细了解这个功能如何帮助您更好地把握企业动态和提升决策效率。 快速入口&#xff1a;一键激…

【Maven】Maven深度避坑指南:依赖冲突全维度解决方案与工业级实战(超万字解析)

注&#xff1a;本文基于50大型企业级项目经验&#xff0c;结合Maven底层源码机制&#xff0c;系统化解决依赖冲突问题。包含20个实战场景、10类特殊案例及5大防御体系构建方案。 Maven深度避坑指南&#xff1a;依赖冲突全维度解决方案与工业级实战&#xff08;超万字解析&#…

Rust Web 全栈开发(二):构建 HTTP Server

Rust Web 全栈开发&#xff08;二&#xff09;&#xff1a;构建 HTTP Server Rust Web 全栈开发&#xff08;二&#xff09;&#xff1a;构建 HTTP Server创建成员包/库&#xff1a;httpserver、http解析 HTTP 请求HTTP 请求的构成构建 HttpRequest 构建 HTTP 响应HTTP 响应的构…

小架构step系列01:小架构初衷

1 概述 小公司做业务服务&#xff0c;需要聚焦到实际的业务上&#xff0c;尽快通过业务服务客户&#xff0c;给客户创建价值&#xff0c;公司才能生存下去。在技术上采用的Web应用架构具备以下特点&#xff1a; 主要由开源组件组装而成。这样既可以节省成本&#xff0c;也可以把…

苹果AR/VR头显路线图曝光,微美全息推进AI/AR智能眼镜新品开启视觉体验篇章

日前&#xff0c;郭明錤发表了一篇关于苹果&#xff08;AAPL.US&#xff09;2025-2028头戴式产品路线图的文章&#xff0c;里面提到苹果正在开发涵盖MR头显、AI眼镜、AR眼镜、Birdbath眼镜等共计7款设备。 苹果的头显设备中&#xff0c;大量出货的产品是类似于Ray-Ban Meta的智…

python pyecharts 数据分析及可视化(2)

一、任务要求 任务二&#xff1a;感冒高发期分析 【任务说明】 感冒是一种常见的急性上呼吸道病毒性感染性疾病&#xff0c;多由鼻病 毒、副流感病毒、呼吸道合胞病毒、埃可病毒、柯萨奇病毒、冠状病 毒、腺病毒等引起。临床表现为鼻塞、喷嚏、流涕、发热、咳嗽、头 痛等&#…

React自学 基础一

React基础 React 是一个由 Facebook&#xff08;现 Meta&#xff09;开发并维护的、开源的 JavaScript 库&#xff0c;主要用于 构建用户界面&#xff08;UI&#xff09;&#xff0c;尤其是单页面应用程序中的动态、交互式界面。 简单示例&#xff1a; import React, { useSt…

PHP语法基础篇(八):超全局变量

超全局变量是在 PHP 4.1.0 中引入的&#xff0c;并且是内置变量&#xff0c;可以在所有作用域中始终可用。 PHP 中的许多预定义变量都是"超全局的"&#xff0c;这意味着它们在一个脚本的全部作用域中都可用。在函数或方法中无需执行 global $variable; 就可以访问它们…

NumPy-核心函数concatenate()深度解析

NumPy-核心函数concatenate深度解析 一、concatenate()基础语法与核心参数函数签名与核心作用基础特性&#xff1a;形状匹配规则 二、多维数组拼接实战示例1. 一维数组&#xff1a;最简单的序列拼接2. 二维数组&#xff1a;按行与按列拼接对比按行拼接&#xff08;垂直方向&…

aws(学习笔记第四十八课) appsync-graphql-dynamodb

aws(学习笔记第四十八课) appsync-graphql-dynamodb 使用graphql来方便操作dynamodb 理解graphql中的graphql api&#xff0c;schema&#xff0c;resolver 学习内容&#xff1a; graphqlgraphql apischemaresolver 1. 代码连接和修改 1.1 代码链接 代码链接&#xff08;app…

关于微前端框架micro,子应用设置--el-primary-color失效的问题

设置了manualChunks导致失效,去掉即可,比较小众的问题 下面是deepseek的分析 关于 manualChunks 导致 Element Plus 主题变量失效的问题 你找到的确实是问题的关键所在。这个 manualChunks 配置影响了 Element Plus 样式和变量的加载顺序&#xff0c;从而导致主题变量失效。…

MySQL 学习 之 你还在用 TIMESTAMP 吗?

目录 1. 弊端1.1. 取值范围1.2. 时区依赖1.3. 隐式转换 2. 区别3. 解决 1. 弊端 1.1. 取值范围 TIMESTAMP 的取值范围为 1970-01-01 00:00:01 UTC 到 2038-01-19 03:14:07 UTC&#xff0c;超出范围的数据会被强制归零或触发异常‌。 具体表现为在基金债券等业务中&#xff0…

java中字节和字符有何区别,为什么有字节流和字符流?

在Java中&#xff0c;字节&#xff08;byte&#xff09;和字符&#xff08;char&#xff09;是两种不同的数据类型&#xff0c;它们的主要区别在于所表示的数据单位、用途以及编码方式,字节流和字符流的区分就是为了解决编码问题。 字节&#xff08;byte&#xff09;&#xff…

伴随矩阵 线性代数

伴随矩阵的定义 伴随矩阵的作用是什么&#xff1f;我们可以看到其伴随矩阵乘上自己等于一个数&#xff08;自身的行列式&#xff09;乘以E&#xff0c;所以对于一个方阵来说&#xff0c;其逆矩阵就是自己的伴随矩阵的倍数。 所以说伴随矩阵的作用就是用来更好的求解逆矩阵的。…

百胜软件获邀走进华为,AI实践经验分享精彩绽放

在数字化浪潮席卷全球的当下&#xff0c;零售行业正经历着深刻变革&#xff0c;人工智能技术成为重塑行业格局的关键力量。6月26日&#xff0c;“走进华为——智领零售&#xff0c;AI赋能新未来”活动在华为练秋湖研发中心成功举办。百胜软件作为数字零售深耕者&#xff0c;携“…