1、在pom.xml 引入依赖
<!-- 自动整合 pgvector 向量存储 -->
<dependency>
<groupid>org.springframework.ai</groupid>
<artifactid>spring-ai-starter-vector-store-pgvector</artifactid>
<version>1.0.0-m7</version>
</dependency>2、application.yml 加入pgvector配置
spring:
ai:
dashscope:
# 需要替换为你自己的 key
api-key: 你的api-key
embedding:
options:
model: qwen3.7-text-embedding
dimensions: 1024
######################################################
########### postgresql 向量数据库配置 #############
######################################################
vectorstore:
pgvector:
initialize-schema: true # 会自定初始化向量数据表 vector_store
index-type: hnsw # 量索引的类型为 hnsw(分层可导航小世界图)。
dimensions: 1024 # 存储的向量维度为 1024。
distance-type: cosine_distance # 相似度度量方式为“余弦距离
max-document-batch-size: 10000 # optional: maximum number of documents per batch
id-type: uuid
table-name: vector_store # 向量数据表表名
schema-name: public
datasource:
url: jdbc:postgresql://localhost:5432/postgres
username: postgres
password: 123456 项目启动时会自动创建向量数据表,表名为:vector_store

3、测试向表中vector_store 插入数据
service
/**
* 向量数据库表 vector_store 业务操作接口类
*/
public interface ivectorstoreservice {
/**
* 简单示例,往向量数据库中插入字符串类型的数据
* @param knowledge
* @return
*/
string addsimple(string knowledge);
/**
* 从向量数据库中筛选文档
* @param content
* @return
*/
list<document> similaritysearch(string content);
}serviceimpl
@service
@slf4j
public class vectorstoreserviceimpl implements ivectorstoreservice {
@autowired
private pgvectorstore pgvectorstore;
@autowired
@qualifier("openaichatmodel")
private chatmodel chatmodel;
@override
public string addsimple(string knowledge) {
document document = new document(knowledge);
pgvectorstore.add(list.of(document));
return "添加知识库成功";
}
/**
* 根据内容相识度查询
* @param content
*/
public list<document> similaritysearch(string content){
query query = new query(content);
chatclient.builder chatclientbuilder = chatclient.builder(chatmodel);
// 构建查询重写转换器
rewritequerytransformer querytransformer = rewritequerytransformer.builder()
.chatclientbuilder(chatclientbuilder)
.build();
// 构建翻译成中文转换器
/* querytransformer querytransformer = translationquerytransformer.builder()
.chatclientbuilder(chatclientbuilder)
.targetlanguage("chinese")
.build();*/
// 重写
query transform = querytransformer.transform(query);
searchrequest searchrequest = searchrequest.builder()
.query(transform.text()) //搜索的查询文本,重写后的查询
.topk(5) // 返回的最大结果数
.similaritythreshold(0.5) // 相似度阈值分数,用于筛选搜索结果。只有相似度得分大于或等于该“阈值”的文档才会被返回。请注意,这是一个在客户端而非服务端执行的后处理步骤。阈值设为 0.0 表示接受任意相似度,或禁用相似度阈值过滤;阈值设为 1.0 则表示要求完全匹配。
//.filterexpression("title in ['如何提升自身魅力吸引潜在伴侣?']") //基于文档元数据的过滤表达式
.build();
// retrieve documents similar to a query
list<document> results = pgvectorstore.similaritysearch(searchrequest);
log.info("匹配到的知识库内容:{}",results.toarray());
return results;
}
}测试方法,这里就直接写controller了,在页面上测试
/**
* 向量数据库接口
*/
@restcontroller
@requestmapping("/vectorstore")
public class vectorstorecontroller {
@autowired
private ivectorstoreservice vectorstoreservice;
/**
* 新增数据
* 向vector_store插入数据
* @param knowledge 字符串类型的知识
*/
@postmapping("/add")
public string addsimple(string knowledge){
return vectorstoreservice.addsimple(knowledge);
}
/**
* 查询-直接接口查询
* @param content
* @return
*/
@getmapping("/query")
public list<document> similaritysearch( string content){
return vectorstoreservice.similaritysearch(content);
}
}- 先测试下插入数据

查看数据库,发现插入成功,embedding字段即为向量数组,metadata元信息为空,是因为我们暂时还没有设置。

继续多插入几条

测试下检索功能,发现只匹配到一条,分数为0.66


4、哪为什么会检索到这条呢?
先将用户输入的信息向量化

再通过jdbc在数据库中匹配

5、总结
在这里其实我们对rag中的向量化,检索有初步的了解了。在这篇文章中主要是将向量数据库pgvector集成到项目中,并用简单的插入表,检索表了解了向量化。在检索文档前,会将用户输入的文本转化为向量表示,再从表中检索内容。【下图红色圈出部分】
附上一张rag的架构图:

到此这篇关于springai集成rag实操(postgresql+pgvector)中(集成到项目中)的文章就介绍到这了,更多相关springai集成rag内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论