当前位置: 首页 > news >正文

深入浅出 RAG:万物皆可向量化 (Embedding) 与 Spring AI + pgvector 实战

文章目录

    • 一、 引言:计算机如何“理解”人类语言?
      • 1.1 从传统搜索到语义搜索的进化
      • 1.2 什么是向量化 (Embedding)?万物皆可坐标化
    • 二、 核心原理解析:如何在茫茫人海中找到那个“它”?
      • 2.1 距离的度量:余弦相似度 (Cosine)
      • 2.2 经典概念:什么是 Top-K 召回?
    • 三、 为什么选择 PostgreSQL + pgvector?
      • 3.1 关系型数据库的复兴
      • 3.2 pgvector 简介及核心优势
      • 3.3 扒开底层看 SQL:pgvector 究竟怎么存和查?
    • 四、 Spring AI 代码实战:打通 Embeding 与 pgvector 检索
      • 4.1 环境准备
      • 4.2 Embedding 模型的调用 (把文字变数组)
      • 4.3 数据入库与相似度检索 (Top-K)
    • 五、 总结

给大模型装上真正的“外接硬盘”:从语义检索原理到 Spring Boot 工程落地

在 RAG(检索增强生成)系列的前两篇文章中,我们聊了为什么需要 RAG,也详细讲解了如何通过 Chunking 策略把长文档“切碎”。今天,我们要啃下一块不可或缺的硬骨头:这些切碎的文本,系统到底是怎么理解并检索出来的?

这其中的核心魔法,就是向量化(Embedding)向量检索。本文将带你从底层原理出发,结合业界当红炸子鸡PostgreSQL + pgvector,在 Spring AI 语境下完成一次完美的“语义搜索”实战。



一、 引言:计算机如何“理解”人类语言?

1.1 从传统搜索到语义搜索的进化

传统的搜索(如 Elasticsearch 早期的纯文本匹配或 MySQL 的LIKE)是基于关键字的。你搜“苹果”,它只会返回包含“苹果”这两个字的内容。如果你搜“研发 iPhone 的公司”,传统搜索可能会傻眼,因为字面上毫无重合。

为了让计算机真正“理解”语义,而不是机械地比对字符,Embedding 技术诞生了。

1.2 什么是向量化 (Embedding)?万物皆可坐标化

简单来说,Embedding 就是把人类的文字(词语、句子、甚至图像),翻译成计算机能懂的一长串数字(数组)。这串数字,在数学上就叫作“向量”。

我们可以把向量在这个多维空间里想象成一个具体的“坐标”。

  • 语义相近的词(比如“高兴”和“开心”),它们在空间中的坐标离得非常近。
  • 语义无关的词(比如“高兴”和“水杯”),它们在空间中的坐标离得很远。

这就实现了极其降维打击的能力:我们不再匹配字面,而是匹配“意思”。


二、 核心原理解析:如何在茫茫人海中找到那个“它”?

当所有切碎的文档块,和用户的“问题”都被转换成高维空间里的“坐标点”后,检索的过程就变成了纯粹的几何题。

2.1 距离的度量:余弦相似度 (Cosine)

在几十上百维的空间里,我们怎么判断两个点离得近不近?最常用的数学工具是余弦相似度(Cosine Similarity)
它不去量两个点之间的绝对直线距离,而是看这两个点连线所在的“夹角”。

  • 夹角越小(趋近于0度),余弦值越接近 1,代表在语义方向上极其相似
  • 夹角越大,代表语义方向偏离,毫无关联。

2.2 经典概念:什么是 Top-K 召回?

这就是我们在 RAG 架构图中经常看到的词。
假设你的知识库被切分成了 100 万个文档块(得到了 100 万个向量)。当用户问了一个问题(转换为 1 个向量),系统的任务就是在空间里算出和这个问题夹角最小余弦相似度最高的前 K 个文档块。
这挑选出来的前 K 个最相关的段落,就叫做Top-K 召回。它们将被作为 Prompt 的参考资料,喂给大模型。


三、 为什么选择 PostgreSQL + pgvector?

理解了原理,我们要用什么“数据库”来存这些坐标,并且能飞快地算出余弦相似度呢?

3.1 关系型数据库的复兴

早几年,独立向量数据库(如 Pinecone、Milvus)大行其道。但随着技术发展,大家发现:专门维护一个只有向量的数据库运维成本太高了。业务系统里原有的关系型数据怎么办?

于是,最强大的开源关系型数据库 PostgreSQL 站了出来。

3.2 pgvector 简介及核心优势

pgvector是 PG 的一个开源扩展插件,让 PG 原生支持了向量数据类型以及各种向量相似度计算(余弦、欧氏距离、内积等)。

  • 统一技术栈:你可以把业务数据(如用户的年龄、订单号)和向量数据存放在同一个库甚至同一张表里。
  • 无缝 Metadata 过滤:结合我们上一篇讲的元数据,在 SQL 里加一句WHERE department = 'HR'就能直接缩小向量计算的范围,性能无敌。

3.3 扒开底层看 SQL:pgvector 究竟怎么存和查?

为了让你不仅知其然,还知其所以然。在接入框架之前,我们先看看原生的 PostgreSQL (安装了 pgvector 后) 是怎么写 SQL 的:

1. 创建带有向量字段的表

CREATEEXTENSIONIFNOTEXISTSvector;CREATETABLEdocument_chunks(id bigserialPRIMARYKEY,contenttext,-- 存文本内容metadata jsonb,-- 存元数据 (如部门、时间等)embedding vector(1536)-- 存 1536 维的向量坐标);

2. 插入向量数据

-- 实际开发中,[0.1, 0.2...] 这串数组是大模型 API 算出来后返回给你的INSERTINTOdocument_chunks(content,metadata,embedding)VALUES('苹果不仅仅是水果...','{"department": "HR"}','[0.11, 0.22, 0.33...]');

3. 核心:余弦相似度检索 (Top-K)!

-- 在 pgvector 中, `<=>` 操作符就代表计算“余弦距离 / 余弦相似度”-- ORDER BY 距离 ASC,就是找出“夹角最小、最相似”的数据SELECTcontent,metadataFROMdocument_chunksWHEREmetadata->>'department'='HR'-- 绝赞的业务 Metadata 过滤ORDERBYembedding<=>'[0.14, 0.55, 0.43...]'-- 这串数字是你“问题”的向量LIMIT4;-- 这就是大名鼎鼎的 Top-K (K=4)

看到这里是不是有一种豁然开朗的感觉?所谓高大上的向量数据库,在 SQL 层面其实就是多了一个<=>排序。


四、 Spring AI 代码实战:打通 Embeding 与 pgvector 检索

让我们回到熟悉的 Spring Boot 工程中,看看 Spring AI 是如何把上述原理优雅封装的。

4.1 环境准备

pom.xml中引入 Spring AI 核心包以及 pgvector 启动器(以 PostgreSQL 为例):

<dependencies><!-- 其他 Spring Boot 依赖... --><!-- Spring AI pgvector store 启动器 --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-pgvector-store-spring-boot-starter</artifactId></dependency></dependencies>

配置application.yml连接到装了 pgvector 插件的 PG 数据库:

spring:datasource:url:jdbc:postgresql://localhost:5432/rag_dbusername:myuserpassword:mypasswordai:vectorstore:pgvector:index-type:HNSWdistance-type:COSINE_DISTANCE# 指定使用余弦相似度dimensions:1536# 根据你使用的 Embedding 模型维度决定

4.2 Embedding 模型的调用 (把文字变数组)

在 Spring AI 中,负责处理向量化的接口是EmbeddingModel。它可以无缝对接 OpenAI、通义千问、Ollama 等各家大厂的 Embedding API。

importorg.springframework.ai.embedding.EmbeddingModel;importorg.springframework.ai.embedding.EmbeddingResponse;importjava.util.List;@RestControllerpublicclassEmbeddingController{privatefinalEmbeddingModelembeddingModel;publicEmbeddingController(EmbeddingModelembeddingModel){this.embeddingModel=embeddingModel;}@GetMapping("/embed")publicList<Double>embedMyText(){// 调用底层大厂模型,一键将文字转为 Float/Double 数组returnthis.embeddingModel.embed("苹果不仅仅是水果,还是一家科技公司。");}}

4.3 数据入库与相似度检索 (Top-K)

在实际开发中,我们不需要手动去算余弦夹角,Spring AI 的VectorStore接口直接帮我们办妥了一切。配合上篇讲过的 Chunking:

importorg.springframework.ai.document.Document;importorg.springframework.ai.vectorstore.VectorStore;importorg.springframework.ai.vectorstore.SearchRequest;@ServicepublicclassRagService{privatefinalVectorStorevectorStore;// 这里由于引入了 Starter,底层实现已经是 PgVectorStorepublicRagService(VectorStorevectorStore){this.vectorStore=vectorStore;}// 1. 存入经过 Chunking 处理的文档块publicvoidingestData(List<Document>chunks){// 底层会自动调用 EmbeddingModel 将 content 变成向量,并以原生 SQL 方式存入 PostgreSQLvectorStore.add(chunks);}// 2. 根据用户问题,进行 Top-K 召回检索publicList<Document>searchTopK(StringuserQuestion){// SearchRequest 就是在做余弦相似度计算!returnvectorStore.similaritySearch(SearchRequest.query(userQuestion).withTopK(4)// 我们只要夹角最小(最相似)的前 4 个段落);}}

五、 总结

今天我们拔掉了 RAG 中最硬核的钉子:

  1. 我们明白了计算机是通过向量 (Embedding)余弦相似度 (Cosine Similarity)来真正理解语义并“大海捞针”的。
  2. 我们学习了Top-K 召回的概念本质。
  3. 结合Spring AI与极具性价比的PostgreSQL (pgvector),我们仅仅用了几行代码就搭建起了一个工业级的向量知识检索底层。
http://www.jsqmd.com/news/622573/

相关文章:

  • Zynq SPI信号连接终极指南:从理论到实践的14线解析
  • 教育科技重塑:个性化学习系统的质量——软件测试从业者的专业视角
  • 软件分享-第一期:SBTI人格测试软件
  • 解放双手的3大智能方案:MAA自动化助手让明日方舟日常任务一键完成
  • 如何高效部署ViGEmBus虚拟手柄驱动:Windows游戏控制终极解决方案
  • R 4.5机器学习服务化实战(Shiny+plumber+Docker三重加固):从本地训练到K8s集群一键部署
  • A-47 矿山井下通信应用
  • 艾尔登法环帧率解锁与优化工具:全面提升游戏体验的完整指南
  • 终极指南:如何用UnrealPakViewer快速解析和优化虚幻引擎Pak文件
  • Qwen2.5-VL-7B-Instruct部署教程:GPU算力监控(nvidia-smi)+服务健康检查脚本
  • SMUDebugTool终极实战指南:从硬件调试到性能优化的完整解决方案
  • 告别推送限制:手把手教你用UniPush 2.0云函数,为APP配置全厂商(华为/小米/Vivo/OPPO)离线通道
  • Sunshine游戏串流服务器:5步搭建你的专属云端游戏平台
  • CefFlashBrowser:在2025年轻松访问Flash内容的终极解决方案
  • Triton + RISC-V分
  • 从‘位置式’到‘增量式’:我的ROS机器人小车电机PID调参踩坑实录与选择建议
  • 构建多模态春联应用:Spring_couplet_generation与图像识别结合实践
  • 同事被辞退了,她要求N+1的赔偿,公司同意了,人事经理说:你基本工资2800,一共干了4年,补偿金是14000,同事却不认可。
  • AI开发-python-langchain框架(--excle文档加载 )式
  • Leather Dress Collection效果展示:Leather TankTop Pants美式复古皮革上衣细节
  • Sunshine游戏流媒体:5个实用技巧帮你告别黑屏和卡顿困扰
  • yfinance:如何用Python轻松获取雅虎财经市场数据?
  • FLUX.小红书极致真实V2应用场景:线下门店陈列图(橱窗/货架/导视牌)
  • Fish Speech 1.5快速上手:Web界面操作图解+常见问题速查表
  • 3步完成系统镜像烧录:Balena Etcher终极安全指南
  • PyTorch 2.8镜像快速上手:htop+nvtop+py-spy多维GPU性能监控配置
  • APB总线实战:在FPGA上搭建一个简易SoC,用APB配置PWM和外设(Vivado工程分享)
  • 华硕笔记本性能调优神器:G-Helper如何让游戏本重获新生?
  • 拉曼激光雷达 L0 级数据 Python处理和可视化实现,结果分析
  • Unity发布京东小游戏麓