在一些垂直领域以及公司内部信息相关或者实时性相关的大模型应用,就无法直接使用chatGPT。
这个时候,向量知识库就进入了。
通过坐标向量最接近的即为匹配相关答案。
向量模型定义:将文档向量化,保证内容越相似的文本,在向量空间中距离越近;
第一步:引入依赖
java
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
测试输入一段文本,被存储在里面的坐标
java
float[] textFlot = openAiEmbeddingModel.embed("我是中国人");
System.out.println("输出"+ Arrays.toString(textFlot));
第二步,配置:
java
embedding:
options:
model: text-embedding-v3
dimensions: 1024
存储文档的可以用redis, es等;
对于API调用层,都是如下的调用方法
本次案例使用自带的SimpleVectorStore
java
@Bean
public VectorStore vectorStore(OpenAiEmbeddingModel embeddingModel) {
return SimpleVectorStore.builder(embeddingModel).build();
}
第三步:实现测试
我们需要先将文档转为Document,存入向量库
java
// 1.创建PDF的读取器
PagePdfDocumentReader reader = new PagePdfDocumentReader(
resource, // 文件源
PdfDocumentReaderConfig.builder()
.withPageExtractedTextFormatter(ExtractedTextFormatter.defaults())
.withPagesPerDocument(1) // 每1页PDF作为一个Document
.build()
);
// 2.读取PDF文档,拆分为Document
List<Document> documents = reader.read();
// 3.写入向量库
vectorStore.add(documents);
然后进行组装搜索
java
SearchRequest request = SearchRequest.builder()
.query("论语中教育的目的是什么")
.topK(1)
.similarityThreshold(0.6)
.filterExpression("file_name == '知识笔记.pdf'")
.build();
最后通过调用接口搜索
java
List<Document> docs = vectorStore.similaritySearch(request);
以上就实现了一个简单的自带存储PDF,然后进行向量接口搜索的demo