当前位置:   article > 正文

AI-知识库搭建(一)腾讯云向量数据库使用

AI-知识库搭建(一)腾讯云向量数据库使用

一、AI知识库

将已知的问答知识,问题和答案转变成向量存储在向量数据库,在查找答案时,输入问题,将问题向量化,匹配向量库的问题,将向量相似度最高的问题筛选出来,将答案提交。

二、腾讯云向量数据库

向量数据库_大模型知识库_向量数据存储_向量数据检索- 腾讯云

腾讯云向量数据库(Tencent Cloud VectorDB)是一款全托管的自研企业级分布式数据库服务,专用于存储、检索、分析多维向量数据。该数据库支持多种索引类型和相似度计算方法,单索引支持千亿级向量规模,可支持百万级 QPS 及毫秒级查询延迟。腾讯云向量数据库不仅能为大模型提供外部知识库,提高大模型回答的准确性,还可广泛应用于推荐系统、自然语言处理等 AI 领域。

三、使用教程(java)

1、项目引用依赖
  1. <!--腾讯云向量数据库使用-->
  2. <dependency>
  3. <groupId>com.tencent.tcvectordb</groupId>
  4. <artifactId>vectordatabase-sdk-java</artifactId>
  5. <version>1.2.0</version>
  6. </dependency>
2、application.properties 配置
  1. #向量数据库地址-购买服务器后,获取到外网访问域名,账号密码
  2. vectordb.url=${VECTORDB_URL:http://xxxxxxxxx.com:10000}
  3. vectordb.user=${VECTORDB_USER:root}
  4. vectordb.key=${VECTORDB_KEY:123456}
3、初始化客户端
  1. import com.tencent.tcvectordb.client.VectorDBClient;
  2. import com.tencent.tcvectordb.model.param.database.ConnectParam;
  3. import com.tencent.tcvectordb.model.param.enums.ReadConsistencyEnum;
  4. import org.springframework.beans.factory.annotation.Value;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.stereotype.Component;
  7. @Component
  8. public class InitVectorClient {
  9. @Value("${vectordb.url:}")
  10. private String vdbUrl;
  11. @Value("${vectordb.user:}")
  12. private String vdbUser;
  13. @Value("${vectordb.key:}")
  14. private String vdbKey;
  15. @Bean
  16. public VectorDBClient vdbClient(){
  17. ConnectParam connectParam = ConnectParam.newBuilder()
  18. .withUrl(vdbUrl)
  19. .withUsername(vdbUser)
  20. .withKey(vdbKey)
  21. .withTimeout(30)
  22. .build();
  23. VectorDBClient client = new VectorDBClient(connectParam, ReadConsistencyEnum.EVENTUAL_CONSISTENCY);
  24. return client;
  25. }
  26. }
4、创建表结构

这里使用HTTP的方式

  1. curl --location --request POST 'xxxxx.com:10000/database/create' \
  2. --header 'Authorization: Bearer account=root&api_key=123456' \
  3. --header 'Content-Type: application/json' \
  4. --data-raw '{
  5. "database": "db_xiaosi"
  6. }'
  7. curl --location --request POST 'xxxxx.com:10000/collection/create' \
  8. --header 'Content-Type: application/json' \
  9. --header 'Authorization: Bearer account=root&api_key=123456' \
  10. --data-raw '{
  11. "database": "db_xiaosi",
  12. "collection": "t_bug",
  13. "replicaNum": 0,
  14. "shardNum": 1,
  15. "description": "BUG表关键字向量",
  16. "indexes": [
  17. {
  18. "fieldName": "id",
  19. "fieldType": "string",
  20. "indexType": "primaryKey"
  21. },
  22. {
  23. "fieldName": "bug_name",
  24. "fieldType": "string",
  25. "indexType": "filter"
  26. },
  27. {
  28. "fieldName": "is_deleted",
  29. "fieldType": "uint64",
  30. "indexType": "filter"
  31. },
  32. {
  33. "fieldName": "vector",
  34. "fieldType": "vector",
  35. "indexType": "HNSW",
  36. "dimension": 1536,
  37. "metricType": "COSINE",
  38. "params": {
  39. "M": 16,
  40. "efConstruction": 200
  41. }
  42. }
  43. ]
  44. }'
5、封装http请求类
  1. package com.ikscrm.platform.api.manager.bug;
  2. import cn.hutool.core.date.DateUtil;
  3. import com.ikscrm.platform.api.dao.vector.BugVector;
  4. import com.tencent.tcvectordb.client.VectorDBClient;
  5. import com.tencent.tcvectordb.model.Collection;
  6. import com.tencent.tcvectordb.model.Database;
  7. import com.tencent.tcvectordb.model.DocField;
  8. import com.tencent.tcvectordb.model.Document;
  9. import com.tencent.tcvectordb.model.param.dml.*;
  10. import com.tencent.tcvectordb.model.param.entity.AffectRes;
  11. import lombok.extern.slf4j.Slf4j;
  12. import org.springframework.stereotype.Component;
  13. import javax.annotation.Resource;
  14. import java.util.ArrayList;
  15. import java.util.List;
  16. /**
  17. * 向量数据库能力
  18. * 接口文档 https://cloud.tencent.com/document/product/1709/97768
  19. * 错误码 https://cloud.tencent.com/document/product/1709/104047
  20. * @Date 2024/3/6 13:49
  21. */
  22. @Component
  23. @Slf4j
  24. public class VectorManager {
  25. @Resource
  26. private VectorDBClient vdbClient;
  27. /**
  28. * 根据向量查询相似数据。
  29. *
  30. * @param dbName 数据库名称
  31. * @param tableName 表名称
  32. * @param vector 向量
  33. * @return 返回更新操作影响的记录数
  34. * @throws RuntimeException 如果更新过程中发生业务异常
  35. */
  36. public List<BugVector> findBugList(String dbName, String tableName, List<Double> vector) {
  37. List<BugVector> resultList = new ArrayList<>();
  38. Database database = vdbClient.database(dbName);
  39. Collection collection = database.describeCollection(tableName);
  40. Filter filter = new Filter("is_deleted=0");
  41. //这部分的算法需要深入了解
  42. SearchByVectorParam searchByVectorParam = SearchByVectorParam.newBuilder()
  43. .addVector(vector)
  44. // 若使用 HNSW 索引,则需要指定参数ef,ef越大,召回率越高,但也会影响检索速度
  45. .withParams(new HNSWSearchParams(15))
  46. // 指定 Top K 的 K 值
  47. .withLimit(20)
  48. // 过滤获取到结果
  49. .withFilter(filter)
  50. .build();
  51. // 输出相似性检索结果,检索结果为二维数组,每一位为一组返回结果,分别对应 search 时指定的多个向量
  52. List<List<Document>> svDocs = collection.search(searchByVectorParam);
  53. for (List<Document> docs : svDocs) {
  54. for (Document doc : docs) {
  55. BugVector build = new BugVector();
  56. build.setId(doc.getId());
  57. build.setScore(doc.getScore());
  58. build.setVector(doc.getVector());
  59. for (DocField field : doc.getDocFields()) {
  60. if (field.getName().equals("bug_name")) {
  61. build.setBugName(field.getStringValue());
  62. }
  63. if (field.getName().equals("bug_title")) {
  64. build.setBugTitle(field.getStringValue());
  65. }
  66. if (field.getName().equals("is_deleted")) {
  67. build.setIsDeleted(Integer.valueOf(field.getStringValue()));
  68. }
  69. if (field.getName().equals("create_time")) {
  70. build.setCreateTime(field.getStringValue());
  71. }
  72. if (field.getName().equals("update_time")) {
  73. build.setUpdateTime(field.getStringValue());
  74. }
  75. }
  76. resultList.add(build);
  77. }
  78. }
  79. return resultList;
  80. }
  81. /**
  82. * 将问题向量列表插入到指定的数据库和集合中。
  83. *
  84. * @param dbName 数据库名称,指定要操作的数据库。
  85. * @param tableName 集合名称,即数据表名称,指定要插入数据的表。
  86. * @param list 要插入的数据列表,列表中的每个元素都是TaskVector类型,包含了问题的向量信息及其他相关字段。
  87. */
  88. public Long insertBugList(String dbName, String tableName, List<BugVector> list) {
  89. try {
  90. Database database = vdbClient.database(dbName);
  91. Collection collection = database.describeCollection(tableName);
  92. List<Document> documentList = new ArrayList<>();
  93. list.forEach(item -> {
  94. documentList.add(Document.newBuilder()
  95. .withId(item.getId())
  96. .withVector(item.getVector())
  97. .addDocField(new DocField("bug_name", item.getBugName()))
  98. .addDocField(new DocField("bug_title", item.getBugTitle()))
  99. .addDocField(new DocField("is_deleted", item.getIsDeleted()))
  100. .addDocField(new DocField("create_time", DateUtil.now()))
  101. .addDocField(new DocField("update_time", DateUtil.now()))
  102. .build());
  103. });
  104. InsertParam insertParam = InsertParam.newBuilder().addAllDocument(documentList).build();
  105. // upsert 实际数据会有延迟
  106. AffectRes upsert = collection.upsert(insertParam);
  107. log.info("向量列表插入数量:{},完成:{}", list.size(), upsert.getAffectedCount());
  108. return upsert.getAffectedCount();
  109. } catch (Exception ex) {
  110. log.error("向量列表插入异常", ex);
  111. throw new RuntimeException("向量列表插入异常" + ex.getMessage());
  112. }
  113. }
  114. }

腾讯云的向量库使用方式基本就是这样着,在这里简单的使用到了他的插入和向量查询功能。下一篇讲解GPT的如何与向量数据库结合使用

AI-知识库搭建(二)GPT-Embedding模式使用-CSDN博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/701273
推荐阅读
相关标签
  

闽ICP备14008679号