1.概述
如果需要实现 RAG ,首先需要将数据进行分块向量化实现,下面就讲一下如何使用 milvus 实现向量化存储的过程。
2.实现过程
2.1 安装 milvus
milvus 是一个向量高性能的向量数据库。
安装过程比较简单
我们使用 docker-compose 运行就可以了
wget https://github.com/milvus-io/milvus/releases/download/v2.6.0/milvus-standalone-docker-compose.yml -O docker-compose.yml
执行 docker-compose up -d 就可以了。
我们可以通过控制台访问 milvus
访问地址 http://ip:9091/webui
milvus 和我们的普通数据库也差不多。
一样有数据库,表(milvus 叫做 集合)的概念。
2.2 创建springboot 项目
我使用的spring-ai 版本是最新的 1.0.1
引入必要的依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>1.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<!--向量数据库的依赖-->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-vector-store-milvus</artifactId>
</dependency>
<!--智谱清言的依赖-->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-zhipuai</artifactId>
</dependency>
2.3 增加配置
我们需要注意的是,使用智谱清言 需要知道以下几点:
1.如果需要使用 智谱清言 的 嵌入模型,他的向量化是需要将 输入 发送到智谱的嵌入模型进行词嵌入的,这个嵌入是需要收费的,因此之后,还是需要自定义嵌入模型。
2.需要了解向量模型的维度和最大token数量
https://docs.bigmodel.cn/cn/guide/models/embedding/embedding-3
可以自定义维度,维度最小 64维 最大维度 2048 维,最大支持 6000个汉字左右。
https://docs.bigmodel.cn/cn/guide/models/embedding/embedding-2
维度 1024 维度,最大支持 6000个汉字左右。
- 智谱ai 的配置
spring:
ai:
zhipuai:
//需要去智谱AI网站申请
api-key: ${key}
embedding: Embedding-2
- milvus 配置
spring:
ai:
zhipuai:
api-key: ${key}
embedding: Embedding-2
vectorstore:
milvus:
client:
host: "192.168.2.14"
port: 19530
username: "root"
password: "Milvus"
databaseName: "knowledge"
collectionName: "mydoc"
embeddingDimension: 1024
initializeSchema: true
indexType: HNSW
# 余弦相似度
metricType: COSINE
注意 这里我们需要 指定 initializeSchema 为 true,这个作用是在启动应用的时候,spring 会自动帮我们创建数据集。
2.4 实现数据向量化
当我们做好配置后,我们就可以着手写我们的程序了。
@Autowired
public VectorStore vectorStore;
@GetMapping("/addDoc")
public ResponseEntity <String> addDoc(){
List <Document> documents = List.of(
new Document("人工智能在医疗领域的应用正在改变诊断和治疗方式,从影像识别到个性化药物,AI技术为患者带来更好的医疗服务。"),
new Document("量子计算的发展有望解决传统计算机无法处理的复杂问题,为密码学、材料科学和药物研发等领域带来革命性突破。"),
new Document("5G网络的普及正在推动物联网、自动驾驶和智慧城市的发展,为数字社会奠定基础。"),
new Document("区块链技术不仅应用于加密货币,还在供应链管理、数字身份验证和智能合约等领域展现出巨大潜力。"),
new Document("虚拟现实和增强现实技术正在改变娱乐、教育和远程工作方式,提供沉浸式体验。"),
new Document("日本京都的古老寺庙与现代都市完美融合,春季樱花和秋季红叶吸引了来自世界各地的游客。"),
new Document("意大利托斯卡纳的田园风光、葡萄园和中世纪小镇构成了迷人的文化景观,是美食和艺术爱好者的天堂。"),
new Document("新西兰南岛的壮丽自然景观,包括冰川、峡湾和湖泊,为户外运动爱好者提供了绝佳的目的地。"),
new Document("秘鲁马丘比丘是印加文明的瑰宝,这座古老的城市遗址坐落在安第斯山脉之中,令人叹为观止。"),
new Document("挪威的峡湾地区以其壮观的瀑布、陡峭的悬崖和宁静的水域而闻名,是观赏极光的理想之地。"));
vectorStore.add(documents);
return ResponseEntity.ok("Added Documents");
}
我们将这些数据进行向量化,这些数据我是通过ai 帮我生成的。
2.5 实现向量查询
@GetMapping("/search")
public ResponseEntity <List<Document>> search(@RequestParam("query")String query){
List<Document> results = this.vectorStore.similaritySearch(SearchRequest.builder().query(query).topK(2).build());
return ResponseEntity.ok(results);
}
查询结果
我们可以看到查询的相关度和打分都出来了。
整体来讲,配置的过程麻烦一点,通过引入 spring ai 的向量操作接口,还是挺方便的, 我们这个是引用了 智谱清言的向量模型,我们还是可以通过使用 将向量模型本地化。