)
技术栈框架Spring Boot 4.1.1嵌入模型Qwen3-Embedding-4B向量持久化存储PGVector 17PostgreSQL 17 预装 pgvector 扩展步骤为了持久化存储向量需要先部署pgvector/pgvector:pg17在工程中引入以下依赖注意版本号尽量一致!-- LangChian4j 基础 --dependencygroupIddev.langchain4j/groupIdartifactIdlangchain4j/artifactIdversion1.19.0/version/dependency!-- OpenAI 适配 --dependencygroupIddev.langchain4j/groupIdartifactIdlangchain4j-open-ai/artifactIdversion1.19.0/versionscopecompile/scope/dependency!-- pgvector --dependencygroupIddev.langchain4j/groupIdartifactIdlangchain4j-pgvector/artifactIdversion1.19.0-beta29/versionscopecompile/scope/dependency编写配置类注入嵌入模型这里使用的是硅基流动上的嵌入模型和向量持久化存储数据库ConfigurationpublicclassLLMConfig{BeanpublicEmbeddingModelembeddingModel(){returnOpenAiEmbeddingModel.builder().apiKey(sk-xxxxx).baseUrl(https://api.siliconflow.cn/v1).modelName(Qwen/Qwen3-Embedding-4B)// 2560维.build();}BeanpublicPgVectorEmbeddingStorepgVectorEmbeddingStore(){returnPgVectorEmbeddingStore.builder().host(xxx.xxx.xxx.xxx).port(15432).database(test_db).user(xxx).password(xxx).table(document_embeddings).dimension(2560)// 必须与嵌入模型的维度一致.build();}}项目启动后PGVector会自动在数据库test_db中启用vector拓展并创建document_embeddings表来存储向量化后的文本可以在test_db中执行SELECT extname FROM pg_extension WHERE extname vector来验证是否已经启用了拓展注意PgVectorEmbeddingStore在初始化首次建立连接、准备表结构时会默认自动执行类似这样的 SQL来启用拓展CREATEEXTENSIONIFNOTEXISTSvector;-- 若未启用则自动启用同时还会执行建表CREATE TABLE IF NOT EXISTS ...和建索引但是连接账号必须有权限执行在 PostgreSQL 15 及以上只有超级用户或该**数据库的所有者(owner)**才能执行CREATE EXTENSION。如果既不是超级用户也不是test_db的所有者会自动执行失败抛异常。在 PostgreSQL 14 及以下只要用户有数据库的 CREATE 权限就能建编写测试方法SpringBootTestpublicclassRAGTests{AutowiredprivateEmbeddingModelembeddingModel;AutowiredprivateEmbeddingStoreTextSegmentpgVectorEmbeddingStore;// 测试文本向量化入库TestvoidtestRAG(){// 构建文档元信息MetadatametadatanewMetadata();metadata.put(doc_id,DOC_2026001);metadata.put(author,张三);metadata.put(create_time,System.currentTimeMillis());DocumentdocumentDocument.from(Spring Boot 是一个用于构建微服务的框架它基于 Spring 框架提供自动化配置……,metadata);// 切分文档为 300 字符的片段每个片段之间间隔 50 字符ListTextSegmentsegmentsDocumentSplitters.recursive(300,50).split(document);// 向量化ListEmbeddingembeddingsembeddingModel.embedAll(segments).content();// 向量化入库pgVectorEmbeddingStore.addAll(embeddings,segments);System.out.println(文档切分为 segments.size() 个片段已全部向量化并入库。);}// 测试相似度查询TestvoidtestQuery(){Stringquery什么是 Spring Boot;// 将查询文本向量化EmbeddingqueryEmbeddingembeddingModel.embed(query).content();// 执行相似度检索取最相似的 2 条EmbeddingSearchRequestsearchRequestEmbeddingSearchRequest.builder().queryEmbedding(queryEmbedding).maxResults(2).minScore(0.6)// 相似度阈值.build();EmbeddingSearchResultTextSegmentsearchResultpgVectorEmbeddingStore.search(searchRequest);System.out.println(【检索结果】);for(EmbeddingMatchTextSegmentmatch:searchResult.matches()){System.out.println(相似度得分: match.score());System.out.println(匹配内容: match.embedded().text());System.out.println(metadatamatch.embedded().metadata());}}}先执行testRAG方法测试文本向量化入库再执行testQuery方法测试相似度查询