赞
踩
将已知的问答知识,问题和答案转变成向量存储在向量数据库,在查找答案时,输入问题,将问题向量化,匹配向量库的问题,将向量相似度最高的问题筛选出来,将答案提交。
向量数据库_大模型知识库_向量数据存储_向量数据检索- 腾讯云
腾讯云向量数据库(Tencent Cloud VectorDB)是一款全托管的自研企业级分布式数据库服务,专用于存储、检索、分析多维向量数据。该数据库支持多种索引类型和相似度计算方法,单索引支持千亿级向量规模,可支持百万级 QPS 及毫秒级查询延迟。腾讯云向量数据库不仅能为大模型提供外部知识库,提高大模型回答的准确性,还可广泛应用于推荐系统、自然语言处理等 AI 领域。
- <!--腾讯云向量数据库使用-->
- <dependency>
- <groupId>com.tencent.tcvectordb</groupId>
- <artifactId>vectordatabase-sdk-java</artifactId>
- <version>1.2.0</version>
- </dependency>
- #向量数据库地址-购买服务器后,获取到外网访问域名,账号密码
- vectordb.url=${VECTORDB_URL:http://xxxxxxxxx.com:10000}
- vectordb.user=${VECTORDB_USER:root}
- vectordb.key=${VECTORDB_KEY:123456}
- import com.tencent.tcvectordb.client.VectorDBClient;
- import com.tencent.tcvectordb.model.param.database.ConnectParam;
- import com.tencent.tcvectordb.model.param.enums.ReadConsistencyEnum;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.context.annotation.Bean;
- import org.springframework.stereotype.Component;
-
-
- @Component
- public class InitVectorClient {
-
- @Value("${vectordb.url:}")
- private String vdbUrl;
-
- @Value("${vectordb.user:}")
- private String vdbUser;
-
- @Value("${vectordb.key:}")
- private String vdbKey;
-
- @Bean
- public VectorDBClient vdbClient(){
- ConnectParam connectParam = ConnectParam.newBuilder()
- .withUrl(vdbUrl)
- .withUsername(vdbUser)
- .withKey(vdbKey)
- .withTimeout(30)
- .build();
- VectorDBClient client = new VectorDBClient(connectParam, ReadConsistencyEnum.EVENTUAL_CONSISTENCY);
- return client;
- }
-
- }
这里使用HTTP的方式
- curl --location --request POST 'xxxxx.com:10000/database/create' \
- --header 'Authorization: Bearer account=root&api_key=123456' \
- --header 'Content-Type: application/json' \
- --data-raw '{
- "database": "db_xiaosi"
- }'
-
-
-
- curl --location --request POST 'xxxxx.com:10000/collection/create' \
- --header 'Content-Type: application/json' \
- --header 'Authorization: Bearer account=root&api_key=123456' \
- --data-raw '{
- "database": "db_xiaosi",
- "collection": "t_bug",
- "replicaNum": 0,
- "shardNum": 1,
- "description": "BUG表关键字向量",
- "indexes": [
- {
- "fieldName": "id",
- "fieldType": "string",
- "indexType": "primaryKey"
- },
- {
- "fieldName": "bug_name",
- "fieldType": "string",
- "indexType": "filter"
- },
- {
- "fieldName": "is_deleted",
- "fieldType": "uint64",
- "indexType": "filter"
- },
- {
- "fieldName": "vector",
- "fieldType": "vector",
- "indexType": "HNSW",
- "dimension": 1536,
- "metricType": "COSINE",
- "params": {
- "M": 16,
- "efConstruction": 200
- }
- }
- ]
- }'
- package com.ikscrm.platform.api.manager.bug;
-
- import cn.hutool.core.date.DateUtil;
- import com.ikscrm.platform.api.dao.vector.BugVector;
- import com.tencent.tcvectordb.client.VectorDBClient;
- import com.tencent.tcvectordb.model.Collection;
- import com.tencent.tcvectordb.model.Database;
- import com.tencent.tcvectordb.model.DocField;
- import com.tencent.tcvectordb.model.Document;
- import com.tencent.tcvectordb.model.param.dml.*;
- import com.tencent.tcvectordb.model.param.entity.AffectRes;
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.stereotype.Component;
-
- import javax.annotation.Resource;
- import java.util.ArrayList;
- import java.util.List;
-
- /**
- * 向量数据库能力
- * 接口文档 https://cloud.tencent.com/document/product/1709/97768
- * 错误码 https://cloud.tencent.com/document/product/1709/104047
- * @Date 2024/3/6 13:49
- */
- @Component
- @Slf4j
- public class VectorManager {
-
-
- @Resource
- private VectorDBClient vdbClient;
-
- /**
- * 根据向量查询相似数据。
- *
- * @param dbName 数据库名称
- * @param tableName 表名称
- * @param vector 向量
- * @return 返回更新操作影响的记录数
- * @throws RuntimeException 如果更新过程中发生业务异常
- */
- public List<BugVector> findBugList(String dbName, String tableName, List<Double> vector) {
- List<BugVector> resultList = new ArrayList<>();
- Database database = vdbClient.database(dbName);
- Collection collection = database.describeCollection(tableName);
- Filter filter = new Filter("is_deleted=0");
-
- //这部分的算法需要深入了解
- SearchByVectorParam searchByVectorParam = SearchByVectorParam.newBuilder()
- .addVector(vector)
- // 若使用 HNSW 索引,则需要指定参数ef,ef越大,召回率越高,但也会影响检索速度
- .withParams(new HNSWSearchParams(15))
- // 指定 Top K 的 K 值
- .withLimit(20)
- // 过滤获取到结果
- .withFilter(filter)
- .build();
- // 输出相似性检索结果,检索结果为二维数组,每一位为一组返回结果,分别对应 search 时指定的多个向量
- List<List<Document>> svDocs = collection.search(searchByVectorParam);
- for (List<Document> docs : svDocs) {
- for (Document doc : docs) {
- BugVector build = new BugVector();
- build.setId(doc.getId());
- build.setScore(doc.getScore());
- build.setVector(doc.getVector());
- for (DocField field : doc.getDocFields()) {
- if (field.getName().equals("bug_name")) {
- build.setBugName(field.getStringValue());
- }
- if (field.getName().equals("bug_title")) {
- build.setBugTitle(field.getStringValue());
- }
- if (field.getName().equals("is_deleted")) {
- build.setIsDeleted(Integer.valueOf(field.getStringValue()));
- }
- if (field.getName().equals("create_time")) {
- build.setCreateTime(field.getStringValue());
- }
- if (field.getName().equals("update_time")) {
- build.setUpdateTime(field.getStringValue());
- }
- }
- resultList.add(build);
- }
- }
- return resultList;
- }
-
-
- /**
- * 将问题向量列表插入到指定的数据库和集合中。
- *
- * @param dbName 数据库名称,指定要操作的数据库。
- * @param tableName 集合名称,即数据表名称,指定要插入数据的表。
- * @param list 要插入的数据列表,列表中的每个元素都是TaskVector类型,包含了问题的向量信息及其他相关字段。
- */
- public Long insertBugList(String dbName, String tableName, List<BugVector> list) {
- try {
- Database database = vdbClient.database(dbName);
- Collection collection = database.describeCollection(tableName);
- List<Document> documentList = new ArrayList<>();
- list.forEach(item -> {
- documentList.add(Document.newBuilder()
- .withId(item.getId())
- .withVector(item.getVector())
- .addDocField(new DocField("bug_name", item.getBugName()))
- .addDocField(new DocField("bug_title", item.getBugTitle()))
- .addDocField(new DocField("is_deleted", item.getIsDeleted()))
- .addDocField(new DocField("create_time", DateUtil.now()))
- .addDocField(new DocField("update_time", DateUtil.now()))
- .build());
- });
- InsertParam insertParam = InsertParam.newBuilder().addAllDocument(documentList).build();
- // upsert 实际数据会有延迟
- AffectRes upsert = collection.upsert(insertParam);
- log.info("向量列表插入数量:{},完成:{}", list.size(), upsert.getAffectedCount());
- return upsert.getAffectedCount();
- } catch (Exception ex) {
- log.error("向量列表插入异常", ex);
- throw new RuntimeException("向量列表插入异常" + ex.getMessage());
- }
- }
- }
腾讯云的向量库使用方式基本就是这样着,在这里简单的使用到了他的插入和向量查询功能。下一篇讲解GPT的如何与向量数据库结合使用
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。