腾讯云向量数据库(Tencent Cloud VectorDB)AI 套件 功能支持直接写入 Markdown 文件。本章节介绍如何应用 AI 套件上传文件写入数据,并基于输入的文本信息对文件内容进行相似性检索的方法。以 Linux 操作系统为例,使用 Python、Java、Go SDK 示例代码分别演示。运行本章节所提供的示例代码,您将初步了解 AI 套件一站式文档检索的解决方案。
导入 SDK 依赖模块
import tcvectordbfrom tcvectordb.model.ai_database import AIDatabasefrom tcvectordb.model.collection_view import Embedding, SplitterProcess, Language, CollectionViewfrom tcvectordb.model.document import Filter, Documentfrom tcvectordb.model.document_set import DocumentSetfrom tcvectordb.model.enum import FieldType, IndexType, ReadConsistencyfrom tcvectordb.model.index import Index, FilterIndex
import com.tencent.tcvectordb.client.RPCVectorDBClient;import com.tencent.tcvectordb.model.*;
package mainimport ("context""time""log""github.com/tencent/vectordatabase-sdk-go/tcvectordb")
创建 Client
导入 SDK 所需的模块之后,需先创建一个向量数据库的客户端对象,与向量数据库服务器连接才能进行交互。
#create a database client objectclient = tcvectordb.RPCVectorDBClient(url='http://10.0.X.X', username='root', key='eC4bLRy2va******************************', read_consistency=ReadConsistency.EVENTUAL_CONSISTENCY, timeout=30)
public class VectorDBExample {public static void main(String[] args) {// 创建VectorDB ClientConnectParam connectParam = ConnectParam.newBuilder().withUrl("http://10.0.X.X:80").withUsername("root").withKey("eC4bLRy2va******************************
").withTimeout(30).build();VectorDBClient client = new RPCVectorDBClient(connectParam,ReadConsistencyEnum.EVENTUAL_CONSISTENCY);}}
func main() {// 初始化客户端var defaultOption = &tcvectordb.ClientOption{Timeout: time.Second * 5,MaxIdldConnPerHost: 2,IdleConnTimeout: time.Minute,ReadConsistency: tcvectordb.EventualConsistency,}client, err := tcvectordb.NewRpcClient("http://10.0.X.X:80", "root", "eC4bLRy2va******************************", defaultOption)if err != nil {panic(err)}}
创建数据库
基于已创建的客户端对象,创建数据库 db-test-ai。
db = client.create_ai_database(database_name='db-test-ai')
AIDatabase db = client.createAIDatabase("db-test-ai");
var (ctx = context.Background()aiDatabase = "db-test-ai")db, _ := client.CreateAIDatabase(context.Background(), aiDatabase)log.Printf("Create AI database success, %s", db.DatabaseName)
创建集合视图
创建 CollectionView 之前,需要针对预上传的文件数据选取可作为 Filter 索引的标量字段,以便使用该字段的 Filter 条件表达式过滤查找文件。通常选取文件的 Metadata 信息字段。如下示例,预以文件的作者字段为 Filter 索引,将字段名 author 设置 Filter 索引。
# 第一步:设计索引,为文件 meta 信息标量字段 author 配置 Filter 索引index = Index()index.add(FilterIndex('author', FieldType.String, IndexType.FILTER))# 第二步:创建集合视图coll_view = db.create_collection_view(name='coll-ai-files',description='This is a collectionView',index=index)print(vars(coll_view))
// link database, client 为 VectorDBClient() 创建的客户端对象AIDatabase db = client.aiDatabase("db-test-ai");// 初始化 ColletionView 参数CreateCollectionViewParam collectionParam = CreateCollectionViewParam.newBuilder().withName("coll-ai-files").withDescription("This is a collectionView").addField(new FilterIndex("author", FieldType.String, IndexType.FILTER)).build();// Create CollectionViewCollectionView db.createCollectionView(collectionParam);
var (ctx = context.Background()aiDatabase = "db-test-ai"collectionViewName = "coll-ai-files")// 第一步:设计索引,为文件 meta 信息标量字段 author 配置 Filter 索引index := tcvectordb.Indexes{FilterIndex: []tcvectordb.FilterIndex{{FieldName: "author",FieldType: tcvectordb.String,IndexType: tcvectordb.FILTER,},},}// 第二步:创建集合视图coll, _ := db.CreateCollectionView(ctx, collectionViewName, tcvectordb.CreateCollectionViewParams{Description: "This is a collectionView",Indexes: index,})log.Printf("CreateCollectionView success: %v: %v", coll.DatabaseName, coll.CollectionViewName)
上传文件
集合视图创建完成之后,便可指定上传文件所在路径,上传文件于数据库中。如下示例,文件路径为
/tmp/腾讯云向量数据库.pdf
,将该文件内容及其向量数据存储于集合视图 coll-ai-files 中。说明:
# 上传文件# 1. 指定文件在客户端的存放路径# 2. 自定义文件meta数据res = coll_view.load_and_split_text(local_file_path="/tmp/腾讯云向量数据库.pdf",metadata={'author': 'Tencent'})
// link database, client 为 VectorDBClient() 创建的客户端对象AIDatabase db = client.aiDatabase("db-test-ai");// link collectionViewCollectionView collection = db.describeCollectionView("coll-ai-files");// LocalFilePath 配置上传文件的本地路径// DocumentSetName 指定文件存储于数据库的名称LoadAndSplitTextParam param = LoadAndSplitTextParam.newBuilder().withLocalFilePath("/tmp/腾讯云向量数据库.pdf").Build();// 配置文件 Meatdata 标量字段的值Map<String, Object> metaDataMap = new HashMap<>();metaDataMap.put("author", "Tencent");// 调用 loadAndSplitText() 上传文件collection.loadAndSplitText(param, metaDataMap);
metaData := map[string]interface{}{"author": "Tencent",}UpsertResult, _ := coll.LoadAndSplitText(ctx, tcvectordb.LoadAndSplitTextParams{LocalFilePath: "/tmp/腾讯云向量数据库.pdf",MetaData: metaData,})log.Printf("LoadAndSplitText success: %+v", UpsertResult)
查询文件
上传文件可能存在延迟,查询文件,以便确认文件已在后台解析完成。如下示例,指定文件名,查询存储于数据库中的文件状态。返回参数 indexedStatus 将显示文件预处理、Embedding 向量化的状态。
New:等待解析。
Loading:文件解析中。
Failure:文件解析、写入出错。
Ready:文件解析、写入完成。
res = coll_view.get_document_set(document_set_name="腾讯云向量数据库.pdf")print(vars(res))
String fileId="";String fileName = "腾讯云向量数据库.pdf";System.out.println(collection.getFile(fileName,fileId).toString());
result, _ := coll.GetDocumentSetByName(ctx, "腾讯云向量数据库.pdf")log.Printf("GetDocumentSetByName success: %+v", result)
相似性内容检索
确认文件已解析完成之后,便可开始进行相似性内容检索。如下示例,检索信息
什么是向量数据库
,默认返回相似度最高的信息。# content 指定需检索的文本内容# document_set_name 指定检索的文件名doc_list = coll_view.search(content='向量是指什么',document_set_name = ['腾讯云向量数据库.pdf'])for doc in doc_list:print(vars(doc))
检索结果,如下所示。
关键信息 | 子参数 | 参数含义 |
score | - | 表示查询向量与检索结果向量之间的相似性计算分数。 输出结果按照相似程度得分由高到低逐一排列。 |
data | text | 检索到的结果。 |
{'score': 0.8473929762840271,'data': {'text': '### 什么是向量?\\n向量是指在数学和物理中用来表示大小和方向的量。它由一组有序的数值组成,这些数值代表了向量在每个坐标轴上的分量。\\n','startPos': 441,'endPos': 508,'pre': ['## 关键概念\\n如果您不熟悉向量数据库和相似性搜索领域,请优先阅读以下基本概念,便于您对向量数据库有一个初步的了解。\\n'],'next': ['### 什么是非结构化数据?\\n非结构化数据,是指图像、文本、音频等数据。与结构化数据相比,非结构化数据不遵循预定义模型或组织方式,通常更难以处理和分析。\\n']},'documentSet': {'documentSetId': '1192727327592550400','documentSetName': '腾讯云向量数据库.pdf','author': 'Tencent'}}{'score': 0.7868989706039429,'data': {'text': '### 什么是 AI 中的向量表示?\\n当我们处理非结构化数据时,需要将其转换为计算机可以理解和处理的形式。向量表示是一种将非结构化数据转换为嵌入向量的技术,通过多维度向量数值表述某个对象或事物的属性或者特征。腾讯云向量数据库提供的模型能力,目前在开发调试中。\\n','startPos': 585,'endPos': 784,'pre': ['### 什么是非结构化数据?\\n非结构化数据,是指图像、文本、音频等数据。与结构化数据相比,非结构化数据不遵循预定义模型或组织方式,通常更难以处理和分析。\\n'],'next': ['### 什么是向量检索?\\n向量检索是一种基于向量空间模型的信息检索方法。将非结构化的数据表示为向量存入向量数据库,向量检索通过计算查询向量与数据库中存储的向量的相似度来找到目标向量。\\n']},'documentSet': {'documentSetId': '1192727327592550400','documentSetName': '腾讯云向量数据库.pdf','author': 'Tencent'}}{'score': 0.7792050242424011,'data': {'text': '### 什么是向量检索?\\n向量检索是一种基于向量空间模型的信息检索方法。将非结构化的数据表示为向量存入向量数据库,向量检索通过计算查询向量与数据库中存储的向量的相似度来找到目标向量。\\n','startPos': 784,'endPos': 876,'pre': ['### 什么是 AI 中的向量表示?\\n当我们处理非结构化数据时,需要将其转换为计算机可以理解和处理的形式。向量表示是一种将非结构化数据转换为嵌入向量的技术,通过多维度向量数值表述某个对象或事物的属性或者特征。腾讯云向量数据库提供的模型能力,目前在开发调试中。\\n'],'next': ['## 为什么是腾讯云向量数据库?\\n腾讯云向量数据库作为一种专门存储和检索向量数据的服务提供给用户, 在高性能、高可用、大规模、低成本、简单易用、稳定可靠、智能运维等方面体现出显著优势。 \\n']},'documentSet': {'documentSetId': '1192727327592550400','documentSetName': '腾讯云向量数据库.pdf','author': 'Tencent'}}
// link database, client 为 VectorDBClient() 创建的客户端对象AIDatabase db = client.aiDatabase("db-test-ai");// link collectionViewCollectionView collection = db.describeCollectionView("coll-ai-files");// 设置查询参数// Content 配置需检索的文本信息// DocumentSetNames 指定需要查找的文件名,可批量设置SearchByContentsParam searchByContentsParam = SearchByContentsParam.newBuilder().withContent("向量是指什么").withDocumentSetNames(Arrays.asList("腾讯云向量数据库.pdf")).build();// 根据配置的查询条件进行内容检索List<Document> searchRes = collection.search(searchByContentsParam);// 输出检索结果int i = 0;for (Document doc : searchRes) {System.out.println("\\tres" +(i++)+": "+ doc.toString());}
检索结果,如下所示。
关键信息 | 子参数 | 参数含义 |
score | - | 表示查询向量与检索结果向量之间的相似性计算分数。 输出结果按照相似程度得分由高到低逐一排列。 |
data | text | 检索到的结果。 |
res0: {"score": 0.8938464522361755,"data": {"text": "### 什么是向量?\\n向量是指在数学和物理中用来表示大小和方向的量。它由一组有序的数值组成,这些数值代表了向量在每个坐标轴上的分量。\\n","endPos": 508,"startPos": 441,"next": ["### 什么是非结构化数据?\\n非结构化数据,是指图像、文本、音频等数据。与结构化数据相比,非结构化数据不遵循预定义模型或组织方式,通常更难以处理和分析。\\n"],"pre": ["## 关键概念\\n如果您不熟悉向量数据库和相似性搜索领域,请优先阅读以下基本概念,便于您对向量数据库有一个初步的了解。\\n"]},"documentSet": {"documentSetName": "\\"腾讯云向量数据库.pdf\\"","documentSetId": "\\"1182525034158882816\\"","docFields": [{"name": "author","value": "Tencent"},{"name": "tags","value": ["Embedding","向量","AI"]}]}}res1: {"score": 0.8378515839576721,"data": {"text": "### 什么是 AI 中的向量表示?\\n当我们处理非结构化数据时,需要将其转换为计算机可以理解和处理的形式。向量表示是一种将非结构化数据转换为嵌入向量的技术,通过多维度向量数值表述某个对象或事物的属性或者特征。腾讯云向量数据库提供的模型能力,目前在开发调试中。\\n","endPos": 784,"startPos": 585,"next": ["### 什么是向量检索?\\n向量检索是一种基于向量空间模型的信息检索方法。将非结构化的数据表示为向量存入向量数据库,向量检索通过计算查询向量与数据库中存储的向量的相似度来找到目标向量。\\n"],"pre": ["### 什么是非结构化数据?\\n非结构化数据,是指图像、文本、音频等数据。与结构化数据相比,非结构化数据不遵循预定义模型或组织方式,通常更难以处理和分析。\\n"]},"documentSet": {"documentSetName": "\\"腾讯云向量数据库.pdf\\"","documentSetId": "\\"1182525034158882816\\"","docFields": [{"name": "author","value": "Tencent"},{"name": "tags","value": ["Embedding","向量","AI"]}]}}res2: {"score": 0.8152828216552734,"data": {"text": "### 什么是向量检索?\\n向量检索是一种基于向量空间模型的信息检索方法。将非结构化的数据表示为向量存入向量数据库,向量检索通过计算查询向量与数据库中存储的向量的相似度来找到目标向量。\\n","endPos": 876,"startPos": 784,"next": ["## 为什么是腾讯云向量数据库?\\n腾讯云向量数据库作为一种专门存储和检索向量数据的服务提供给用户, 在高性能、高可用、大规模、低成本、简单易用、稳定可靠、智能运维等方面体现出显著优势。 \\n"],"pre": ["### 什么是 AI 中的向量表示?\\n当我们处理非结构化数据时,需要将其转换为计算机可以理解和处理的形式。向量表示是一种将非结构化数据转换为嵌入向量的技术,通过多维度向量数值表述某个对象或事物的属性或者特征。腾讯云向量数据库提供的模型能力,目前在开发调试中。\\n"]},"documentSet": {"documentSetName": "\\"腾讯云向量数据库.pdf\\"","documentSetId": "\\"1182525034158882816\\"","docFields": [{"name": "author","value": "Tencent"},{"name": "tags","value": ["Embedding","向量","AI"]}]}}
// 等待文件解析完成time.Sleep(time.Second * 30)searchRes, _ := coll.Search(ctx, tcvectordb.SearchAIDocumentSetsParams{Content: "向量是指什么",DocumentSetName: []string{"腾讯云向量数据库.pdf"},})for _, doc := range searchRes.Documents {log.Printf("document: %+v", doc)}
检索结果,如下所示。
关键信息 | 子参数 | 参数含义 |
score | - | 表示查询向量与检索结果向量之间的相似性计算分数。 输出结果按照相似程度得分由高到低逐一排列。 |
data | text | 检索到的结果。 |
2024/01/05 16:18:22 document: {DatabaseName:db-test-ai CollectionViewName:coll-ai-files DocumentSetId:1192743758593921024 DocumentSetName:腾讯云向量数据库.pdf Score:0.8473929762840271 SearchData:{Text:### 什么是向量?向量是指在数学和物理中用来表示大小和方向的量。它由一组有序的数值组成,这些数值代表了向量在每个坐标轴上的分量。StartPos:441 EndPos:508 Pre:[## 关键概念如果您不熟悉向量数据库和相似性搜索领域,请优先阅读以下基本概念,便于您对向量数据库有一个初步的了解。] Next:[### 什么是非结构化数据?非结构化数据,是指图像、文本、音频等数据。与结构化数据相比,非结构化数据不遵循预定义模型或组织方式,通常更难以处理和分析。]} ScalarFields:map[author:Tencent]}2024/01/05 16:18:22 document: {DatabaseName:db-test-ai CollectionViewName:coll-ai-files DocumentSetId:1192743758593921024 DocumentSetName:腾讯云向量数据库.pdf Score:0.7868989706039429 SearchData:{Text:### 什么是 AI 中的向量表示?当我们处理非结构化数据时,需要将其转换为计算机可以理解和处理的形式。向量表示是一种将非结构化数据转换为嵌入向量的技术,通过多维度向量数值表述某个对象或事物的属性或者特征。腾讯云向量数据库提供的模型能力,目前在开发调试中。StartPos:585 EndPos:784 Pre:[### 什么是非结构化数据?非结构化数据,是指图像、文本、音频等数据。与结构化数据相比,非结构化数据不遵循预定义模型或组织方式,通常更难以处理和分析。] Next:[### 什么是向量检索?向量检索是一种基于向量空间模型的信息检索方法。将非结构化的数据表示为向量存入向量数据库,向量检索通过计算查询向量与数据库中存储的向量的相似度来找到目标向量。]} ScalarFields:map[author:Tencent]}2024/01/05 16:18:22 document: {DatabaseName:db-test-ai CollectionViewName:coll-ai-files DocumentSetId:1192743758593921024 DocumentSetName:腾讯云向量数据库.pdf Score:0.7792050242424011 SearchData:{Text:### 什么是向量检索?向量检索是一种基于向量空间模型的信息检索方法。将非结构化的数据表示为向量存入向量数据库,向量检索通过计算查询向量与数据库中存储的向量的相似度来找到目标向量。StartPos:784 EndPos:876 Pre:[### 什么是 AI 中的向量表示?当我们处理非结构化数据时,需要将其转换为计算机可以理解和处理的形式。向量表示是一种将非结构化数据转换为嵌入向量的技术,通过多维度向量数值表述某个对象或事物的属性或者特征。腾讯云向量数据库提供的模型能力,目前在开发调试中。] Next:[## 为什么是腾讯云向量数据库?腾讯云向量数据库作为一种专门存储和检索向量数据的服务提供给用户, 在高性能、高可用、大规模、低成本、简单易用、稳定可靠、智能运维等方面体现出显著优势。
删除数据库
client.drop_ai_database(database_name='db-test-ai')
client.dropAIDatabase("db-test-ai");
result, _ := client.DropAIDatabase(context.Background(), aiDatabase)