SpringAI集成RAG实操(postgresql+pgvector)中(集成到项目中)

发布时间:2026/8/26 20:20:13
SpringAI集成RAG实操(postgresql+pgvector)中(集成到项目中) 1、在pom.xml 引入依赖!-- 自动整合 PGVector 向量存储 --dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-vector-store-pgvector/artifactIdversion1.0.0-M7/version/dependency2、application.yml 加入pgvector配置spring:ai:dashscope:# 需要替换为你自己的 keyapi-key:你的API-Keyembedding:options:model:qwen3.7-text-embeddingdimensions:1024################################################################# postgresql 向量数据库配置 ###################################################################vectorstore:pgvector:initialize-schema:true# 会自定初始化向量数据表 vector_storeindex-type:HNSW# 量索引的类型为 HNSW分层可导航小世界图。dimensions:1024# 存储的向量维度为 1024。distance-type:COSINE_DISTANCE# 相似度度量方式为“余弦距离max-document-batch-size:10000# Optional: Maximum number of documents per batchid-type:uuidtable-name:vector_store# 向量数据表表名schema-name:publicdatasource:url:jdbc:postgresql://localhost:5432/postgresusername:postgrespassword:123456项目启动时会自动创建向量数据表表名为vector_store3、测试向表中vector_store 插入数据service/** * 向量数据库表 vector_store 业务操作接口类 */publicinterfaceIVectorStoreService{/** * 简单示例往向量数据库中插入字符串类型的数据 * param knowledge * return */StringaddSimple(Stringknowledge);/** * 从向量数据库中筛选文档 * param content * return */ListDocumentsimilaritySearch(Stringcontent);}serviceImplServiceSlf4jpublicclassVectorStoreServiceImplimplementsIVectorStoreService{AutowiredprivatePgVectorStorepgVectorStore;AutowiredQualifier(openAiChatModel)privateChatModelchatModel;OverridepublicStringaddSimple(Stringknowledge){DocumentdocumentnewDocument(knowledge);pgVectorStore.add(List.of(document));return添加知识库成功;}/** * 根据内容相识度查询 * param content */publicListDocumentsimilaritySearch(Stringcontent){QueryquerynewQuery(content);ChatClient.BuilderchatClientBuilderChatClient.builder(chatModel);// 构建查询重写转换器RewriteQueryTransformerqueryTransformerRewriteQueryTransformer.builder().chatClientBuilder(chatClientBuilder).build();// 构建翻译成中文转换器/* QueryTransformer queryTransformer TranslationQueryTransformer.builder() .chatClientBuilder(chatClientBuilder) .targetLanguage(Chinese) .build();*/// 重写QuerytransformqueryTransformer.transform(query);SearchRequestsearchRequestSearchRequest.builder().query(transform.text())//搜索的查询文本,重写后的查询.topK(5)// 返回的最大结果数.similarityThreshold(0.5)// 相似度阈值分数用于筛选搜索结果。只有相似度得分大于或等于该“阈值”的文档才会被返回。请注意这是一个在客户端而非服务端执行的后处理步骤。阈值设为 0.0 表示接受任意相似度或禁用相似度阈值过滤阈值设为 1.0 则表示要求完全匹配。//.filterExpression(title in [如何提升自身魅力吸引潜在伴侣]) //基于文档元数据的过滤表达式.build();// Retrieve documents similar to a queryListDocumentresultspgVectorStore.similaritySearch(searchRequest);log.info(匹配到的知识库内容{},results.toArray());returnresults;}}测试方法这里就直接写controller了在页面上测试/** * 向量数据库接口 */RestControllerRequestMapping(/vectorStore)publicclassVectorStoreController{AutowiredprivateIVectorStoreServicevectorStoreService;/** * 新增数据 * 向vector_store插入数据 * param knowledge 字符串类型的知识 */PostMapping(/add)publicStringaddSimple(Stringknowledge){returnvectorStoreService.addSimple(knowledge);}/** * 查询-直接接口查询 * param content * return */GetMapping(/query)publicListDocumentsimilaritySearch(Stringcontent){returnvectorStoreService.similaritySearch(content);}}先测试下插入数据查看数据库发现插入成功embedding字段即为向量数组metadata元信息为空是因为我们暂时还没有设置。继续多插入几条测试下检索功能发现只匹配到一条分数为0.664、哪为什么会检索到这条呢先将用户输入的信息向量化再通过jdbc在数据库中匹配5、总结在这里其实我们对RAG中的向量化检索有初步的了解了。在这篇文章中主要是将向量数据库pgvector集成到项目中并用简单的插入表检索表了解了向量化。在检索文档前会将用户输入的文本转化为向量表示再从表中检索内容。【下图红色圈出部分】附上一张RAG的架构图