向量数据库提供 Collection 的自动化文档处理能力,支持直接上传 Markdown、PDF、Word、PPT 等格式文件于 Collection。本文介绍基于 Collection 集合上传文件的关键操作。
SDK 参考
类别 | SDK Demo |
Python | |
Java | |
Go |
创建 Collection
创建一个数据库集合来存储文件内容,同时为文件的关键字段(如文件名、文本内容、图片信息等)建立索引以优化查询效率。关键字段,如下表所示。
说明:
字段名 | 字段含义 | 索引设置要求或建议 |
file_name | 标记文件名。 | 该字段必须定义为 string 类型的 filter 索引,以支持文件的过滤检索和处理同名文件覆盖的情况。 |
text | 存放文件知识点的原始文本内容。 | 由于文本内容可能较大,不建议为该字段创建索引,以避免占用过多内存空间。 在查询时,只需要通过 output_fields 参数指定该字段即可返回原始文本。 |
section_num | 标记段落(section)在原始文档中的顺序(如1, 2, 3, …)。 | 该字段可创建 filter 索引,以支持通过 section_num 的条件表达式,查询文件特定段落编号的内容。召回的内容也可以根据该值获取对应召回 chunk 所在段落的全部文本。 |
chunk_num | 标记文本片段(chunk)在文件中的顺序(如1, 2, 3, …)。 | 该字段可创建 filter 索引,以支持通过 chunk_num 的条件表达式,按语块顺序范围检索(如查询第5-10块的内容)文件。本文示例为该字段创建索引。 |
image_list | 存放 PDF 文件中图片的 Key 列表。 说明: 在原始检索出的文本块中,图片采用{key}占位符进行标记。系统会同步生成包含所有图片实际 URL 地址的索引列表,每个{key}对应唯一的图片链接。通过将文本块中的占位符替换为对应的<img>标签及真实 URL,即可完整还原原始文档的图文排版结构,最终生成符合网页标准的 HTML 文件。 | 不建议为该字段创建索引。如果需要创建索引,必须确保其为数组(array)类型,否则接口将报错,导致文件无法上传。 |
import tcvectordbfrom tcvectordb.model.enum import FieldType, IndexType, MetricTypefrom tcvectordb.model.index import Index, VectorIndex, FilterIndex, HNSWParams## 若需要使用文本信息进行相似性检索文件内容,则创建集合时需要指定 Embedding 模型相关信息。ebd = Embedding(vector_field='vector', field='text', model_name='bge-base-zh')coll = client.create_collection_if_not_exists(database_name="db-test",collection_name="coll-file-test",shard=2,replicas=1,description='test collection file upload',embedding=ebd,indexes=[FilterIndex('id', field_type=FieldType.String, index_type=IndexType.PRIMARY_KEY),VectorIndex('vector', 768, IndexType.HNSW, MetricType.IP, HNSWParams(m=16, efconstruction=200)),FilterIndex(name='file_name', field_type=FieldType.String, index_type=IndexType.FILTER),FilterIndex(name='chunk_num', field_type=FieldType.Uint64, index_type=IndexType.FILTER),FilterIndex(name='section_num', field_type=FieldType.Uint64, index_type=IndexType.FILTER),],)# print collectionprint(vars(coll))
package com.tencent.tcvectordb.examples;import com.tencent.tcvectordb.client.VectorDBClient;import com.tencent.tcvectordb.model.*;import com.tencent.tcvectordb.model.Collection;import com.tencent.tcvectordb.model.param.collection.*;import com.tencent.tcvectordb.model.param.collectionView.*;import com.tencent.tcvectordb.model.param.dml.*;import com.tencent.tcvectordb.model.param.entity.GetImageUrlRes;import com.tencent.tcvectordb.model.param.enums.EmbeddingModelEnum;import com.tencent.tcvectordb.model.param.enums.ParsingTypeEnum;import com.tencent.tcvectordb.utils.JsonUtils;import com.tencent.tcvectordb.model.param.enums.OrderEnum;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import java.util.*;import java.util.stream.Collectors;// link database, client 为 VectorDBClient() 创建的客户端对象Database db = client.database("db-test");// 初始化 Colleciton 参数CreateCollectionParam collectionParam = CreateCollectionParam.newBuilder().withName("coll-file-test").withShardNum(2).withReplicaNum(1).withDescription("this is a collection upload file").addField(new FilterIndex("id", FieldType.String, IndexType.PRIMARY_KEY)).addField(new VectorIndex("vector", 768, IndexType.HNSW, MetricType.IP, new HNSWParams(16, 200))).addField(new FilterIndex("file_name", FieldType.String, IndexType.FILTER)).addField(new FilterIndex("chunk_num", FieldType.Uint64, IndexType.FILTER)).addField(new FilterIndex("section_num", FieldType.Uint64, IndexType.FILTER)).withEmbedding(Embedding.newBuilder().withModelName(EmbeddingModelEnum.BGE_BASE_ZH.getModelName()).withField("text").withVectorField("vector").build()).build();Collection collection = db.createCollection(collectionParam);
import ("github.com/tencent/vectordatabase-sdk-go/tcvectordb""github.com/tencent/vectordatabase-sdk-go/tcvectordb/api""github.com/tencent/vectordatabase-sdk-go/tcvectordb/api/ai_document_set")var (ctx = context.Background()database = "db-test"collection = "go-sdk-test")db := client.Database(database)index := tcvectordb.Indexes{}index.VectorIndex = append(index.VectorIndex, tcvectordb.VectorIndex{FilterIndex: tcvectordb.FilterIndex{FieldName: "vector",FieldType: tcvectordb.Vector,IndexType: tcvectordb.HNSW,},Dimension: 768,MetricType: tcvectordb.IP,Params: &tcvectordb.HNSWParam{M: 16,EfConstruction: 200,},})index.FilterIndex = append(index.FilterIndex, tcvectordb.FilterIndex{FieldName: "id", FieldType: tcvectordb.String, IndexType: tcvectordb.PRIMARY})index.FilterIndex = append(index.FilterIndex, tcvectordb.FilterIndex{FieldName: "file_name", FieldType: tcvectordb.String, IndexType: tcvectordb.FILTER})index.FilterIndex = append(index.FilterIndex, tcvectordb.FilterIndex{FieldName: "chunk_num", FieldType: tcvectordb.Uint64, IndexType: tcvectordb.FILTER})index.FilterIndex = append(index.FilterIndex, tcvectordb.FilterIndex{FieldName: "section_num", FieldType: tcvectordb.Uint64, IndexType: tcvectordb.FILTER})// 若需要使用文本信息进行相似性检索文件内容,则创建集合时需要指定 Embedding 模型相关信息。ebd := &tcvectordb.Embedding{VectorField: "vector", Field: "text", ModelName: "bge-base-zh"}coll, _ = db.CreateCollectionIfNotExists(ctx, collection, 2, 1, "test collection", index, &tcvectordb.CreateCollectionParams{Embedding: ebd,})log.Printf("create collection if not exists success: %v: %v", coll.DatabaseName, coll.CollectionName)
上传文件
为已创建的 Collection 上传文件,如下列出上传文件需要设置的关键参数。本示例,上传文件为 tcvdb.pdf。具体接口,请参见 Python-upload_file()、Java-UploadFile()、Go-UploadFile()。
关键参数 | 参数含义 | 补充说明 |
local_file_path | 指定本地上传文件的路径。 | - |
metadata | 文件的 Metadata 元数据信息,可自定义扩展字段。例如:author、tags 等。 | 上传文件时,可为创建 Collection 设置的 Filter 索引的字段赋值,以便在检索时,使用该字段的 Filter 表达式检索文件。 上传文件时,可以新增标量字段,但新增字段不会构建 Filter 索引。 |
splitter_process | 文件拆分时,指定对关键字 keywords 和 Title 的处理规则。 | append_title_to_chunk:在对文件拆分时,配置是否将 Title 追加到切分后的段落后面一并 Embedding。 append_keywords_to_chunk:在对文件拆分时,配置是否将关键字 keywords 追加到切分后的段落一并 Embedding。 |
parsing_process | 指定 PDF 类型文件的解析方式. | VisionModelParsing:文件依据解析模型解析,推荐使用,可解析 PDF 中双栏、表格等复杂格式。 AlgorithmParsing:文件依据算法解析,系统默认解析方式。Markdown、Word、PPT 类型,无需配置该参数,默认使用 AlgorithmParsing 解析。 |
embedding_model | 指定使用的 Embedding 模型的名称。您需根据业务的语言类型、数据维度要求等综合选择合适的模型。 | bge-large-zh-v1.5:适用中文,1024维,推荐使用。 bge-base-zh-v1.5:适用中文,768维。 bge-large-zh:适用中文,1024维。 bge-base-zh:适用中文,768维。 m3e-base:适用中文,768维。 e5-large-v2:适用英文,1024维。 text2vec-large-chinese:适用中文,1024维。 multilingual-e5-base:适用于多种语言类型,768维。 BAAI/bge-m3:适用于多种语言类型,1024维。 |
field_mappings | 指定 Collection 中文件字段的映射关系。 | filename:指定文件名映射的字段。 text:指定文件内容文本映射的字段。 image_list:指定 PDF 文件图片 Key 列表存放的字段。 chunkNum:标记文本片段(chunk)在文件中的顺序。 sectionNum:标记段落(section)在原始文档中的顺序。 |
import tcvectordbfrom tcvectordb.model.document import Filter, Documentfrom tcvectordb.model.collection_view import SplitterProcess, ParsingProcess# 上传文件# 1. local_file_path:指定当前文件在客户端的路径# 2. file_name:配置文件存储于向量数据库的名称,可不配置,从local_file_path获取# 3. splitter_process:配置文件拆分规则# 4. parsing_process:指定文件解析方式# 5. metadata:定义文件 meta 信息字段,示例中指定了author 与 tags# 6. field_mappings:文件与数据库中存储的映射字段# 7. embedding_model:Embedding 模型res = client.upload_file(database_name='db-test',collection_name='coll-file-test',local_file_path="./tcvdb.pdf",metadata={'author': 'Tencent','tags': ['向量', 'Embedding', 'AI']},splitter_process=SplitterProcess(append_keywords_to_chunk=True,append_title_to_chunk=False,# chunk_splitter 参数以正则表达式的方式配置文档拆分方式,如下:\\n{2,} 代表以两个及以上的换行进行拆分,常用在QA对文件拆分中。# chunk_splitter="\\n{2,}",),parsing_process=ParsingProcess(parsing_type='AlgorithmParsing'),embedding_model='bge-base-zh',field_mappings={"filename": "file_name","text": "text","imageList": "image_list","chunkNum": "chunk_num","sectionNum": "section_num",},)print(res)
// 配置文件 matadata 信息,示例中指定了author 与 tagsMap<String, Object> metaDataMap = new HashMap<>();metaDataMap.put("author", "Tencent");metaDataMap.put("tags", Arrays.asList("Embedding", "向量", "AI"));// 配置文件与数据库中存储的映射字段Map<String,String> columnMap = new HashMap<>();columnMap.put("filename", "file_name");columnMap.put("text", "text");columnMap.put("imageList", "image_list");columnMap.put("chunkNum", "chunk_num");columnMap.put("sectionNum", "section_num");// 上传文件// 1. LocalFilePath:指定当前文件在客户端的路径// 2. FileName:指定文件名// 3. SplitterProcess:配置文件拆分规则// 4. ParsingProcess:指定文件解析方式// 5. metadata:定义文件 meta 信息字段,示例中指定了author 与 tags// 6. FieldMappings:文件与数据库中存储的映射字段// 7. EmbeddingModel:Embedding 模型UploadFileParam param = UploadFileParam.newBuilder().withLocalFilePath("../demo_files/tcvdb.pdf").withSplitterProcess(SplitterPreprocessParams.newBuilder().withAppendKeywordsToChunkEnum(true).Build())// parsingProcess is used for parsing pdf file by vision model.withParsingProcess(ParsingProcessParam.newBuilder().withParsingType(ParsingTypeEnum.VisionModel).build()).withFileName("tcvdb.pdf").withFieldMappings(columnMap).withEmbeddingModel("bge-base-zh").Build();client.UploadFile("db-test", "coll-file-test", param, metaDataMap);
appendKeywordsToChunk := trueappendTitleToChunk := falselocalFilePath := "../demo_files/tcvdb.pdf"param := tcvectordb.UploadFileParams{LocalFilePath: localFilePath,SplitterPreprocess: ai_document_set.DocumentSplitterPreprocess{AppendKeywordsToChunk: &appendKeywordsToChunk,AppendTitleToChunk: &appendTitleToChunk,},ParsingProcess: &api.ParsingProcess{ParsingType: "AlgorithmParsing",},EmbeddingModel: "bge-base-zh",FieldMappings: map[string]string{"filename": "file_name","text": "text","imageList": "image_list","chunkNum": "chunk_num","sectionNum": "section_num",},MetaData: map[string]interface{}{"author": "Tencent","tags": []string{"向量", "Embedding", "AI"},},}result, _ := client.UploadFile(ctx, database, collection, param)log.Printf("UploadFile result: %+v", result)
相似性检索文件
指定检索的文本信息,指定检索的文件。检索与指定的文本信息相似,满足 filter 指定的条件表达式的内容。代码示例,如下所示。
import jsonres = client.search_by_text(database_name='db-test',collection_name='coll-file-test',embedding_items=['商标声明'],filter='file_name="tcvdb.pdf"',limit=2,)print(json.dumps(res, ensure_ascii=False))
输出信息,如下所示。
[[{"id": "1372860162988916737", "score": 322.25299, "text": "本文档涉及的第三方主体的商标,依法由权利人所有。未经腾讯云及有关权利人书面许可,任何主体不得以任何方式对前述商标进行使用、复制、修改、传播、抄录等行为,否则将构成对腾讯云及有关权利人商标权的侵犯,腾讯云将依法采取措施追究法律责任。\\n\\n【服务声明】\\n\\n本文档意在向您介绍腾讯云全部或部分产品、服务的当时的相关概况,部分产品、服务的内容可能不时有所调整。您所购买的腾讯云产品、服务的种类、服务标准等应由您与腾讯云之间的商业合同约定,除非双方另有约定,否则,腾讯云对本文档内容不做任何明示或默示的承诺或保证。\\n\\n【联系我们】\\n\\n我们致力于为您提供个性化的售前购买咨询服务,及相应的技术售后服务,任何问题请联系 4009100100。\\n\\n", "file_name": "tcvdb.pdf", "tags": ["向量", "Embedding", "AI"], "author": "Tencent", "chunk_num": 2, "section_num": 1}, {"id": "1372860162988916736", "score": 312.57782, "text": "# 向量数据库产品简介\\n\\n【版权声明】\\n\\n©2013-2023 腾讯云版权所有\\n\\n本文档(含所有文字、数据、图片等内容)完整的著作权归腾讯云计算(北京)有限责任公司单独所有,未经腾讯云事先明确书面许可,任何主体不得以任何形式复制、修改、使用、抄袭、传播本文档全部或部分内容。前述行为构成对腾讯云著作权的侵犯,腾讯云将依法采取措施追究法律责任。\\n\\n【商标声明】\\n\\n\\n\\n及其它腾讯云服务相关的商标均为腾讯云计算(北京)有限责任公司及其关联公司所有。", "tags": ["向量", "Embedding", "AI"], "chunk_num": 1, "image_list": ["51292004-6700-4777-82c3-95275913cef4.png"], "file_name": "tcvdb.pdf", "section_num": 1, "author": "Tencent"}]]。
SearchByEmbeddingItemsParam searchByEmbeddingItemsParam = SearchByEmbeddingItemsParam.newBuilder().withEmbeddingItems(Arrays.asList("商标声明"))// 若使用 HNSW 索引,则需要指定参数 ef,ef 越大,召回率越高,但也会影响检索速度.withParams(new HNSWSearchParams(200))// 设置标量字段的 Filter 表达式,过滤所需查询的文档.withFilter("file_name=\\"tcvdb.pdf\\"").withRetrieveVector(false)// 指定 Top K 的 K 值.withLimit(2).build();List<List<Document>> siDocs = client.searchByEmbeddingItems("db-test", "coll-file-test", searchByEmbeddingItemsParam).getDocuments();int i = 0;for (List<Document> docs : siDocs) {System.out.println("\\tres: " + i++);for (Document doc : docs) {System.out.println(doc.toString());}}
输出信息,如下所示。
res: 0{"id":"1374654342526382106","score":0.7422837018966675,"text":"本文档涉及的第三方主体的商标,依法由权利人所有。未经腾讯云及有关权利人书面许可,任何主体不得以任何方式对前述商标进行使用、复制、修改、传播、抄录等行为,否则将构成对腾讯云及有关权利人商标权的侵犯,腾讯云将依法采取措施追究法律责任。\\n\\n【服务声明】\\n\\n本文档意在向您介绍腾讯云全部或部分产品、服务的当时的相关概况,部分产品、服务的内容可能不时有所调整。您所购买的腾讯云产品、服务的种类、服务标准等应由您与腾讯云之间的商业合同约定,除非双方另有约定,否则,腾讯云对本文档内容不做任何明示或默示的承诺或保证。\\n\\n【联系我们】\\n\\n我们致力于为您提供个性化的售前购买咨询服务,及相应的技术售后服务,任何问题请联系 4009100100。\\n\\n","author":"Tencent","tags":["Embedding","向量","AI"],"chunk_num":2,"section_num":1,"file_name":"tcvdb.pdf"}{"id":"1374654342526382105","score":0.7221110463142395,"tags":["Embedding","向量","AI"],"image_list":["42bad2a3-9313-47e3-b09e-43c3643c446f.png"],"text":"# 向量数据库产品简介\\n\\n【版权声明】\\n\\n©2013-2023 腾讯云版权所有\\n\\n本文档(含所有文字、数据、图片等内容)完整的著作权归腾讯云计算(北京)有限责任公司单独所有,未经腾讯云事先明确书面许可,任何主体不得以任何形式复制、修改、使用、抄袭、传播本文档全部或部分内容。前述行为构成对腾讯云著作权的侵犯,腾讯云将依法采取措施追究法律责任。\\n\\n【商标声明】\\n\\n\\n\\n及其它腾讯云服务相关的商标均为腾讯云计算(北京)有限责任公司及其关联公司所有。","section_num":1,"file_name":"tcvdb.pdf","chunk_num":1,"author":"Tencent"}---------------------- get chunk text by chunk_num ----------------------
log.Println("------------------------------ search file chunks by text ------------------------------")filter := tcvectordb.NewFilter(`file_name="` + filename + `"`)searchRes, err := client.SearchByText(ctx, database, collection,map[string][]string{"text": {"商标声明"}},&tcvectordb.SearchDocumentParams{Filter: filter,Params: &tcvectordb.SearchDocParams{Ef: 200}, // 若使用HNSW索引,则需要指定参数ef,ef越大,召回率越高,但也会影响检索速度RetrieveVector: false, // 是否需要返回向量字段,False:不返回,True:返回Limit: 2, // 指定 Top K 的 K 值})for i, docs := range searchRes.Documents {log.Printf("SearchDocumentResult, index: %d ==================", i)for _, doc := range docs {log.Printf("SearchDocument: %+v", doc)}}
输出信息,如下。
2025/05/20 15:00:57 SearchDocumentResult, index: 0 ==================2025/05/20 15:00:57 SearchDocument: {Id:1374280682098630710 Vector:[] SparseVector:[] Score:323.66516 Fields:map[chunk_num:2 file_name:tcvdb.pdf section_num:1 testInt:1024 testStr:v1 text:本文档涉及的第三方主体的商标,依法由权利人所有。未经腾讯云及有关权利人书面许可,任何主体不得以任何方式对前述商标进行使用、复制、修改、传播、抄录等行为,否则将构成对腾讯云及有关权利人商标权的侵犯,腾讯云将依法采取措施追究法律责任。【服务声明】本文档意在向您介绍腾讯云全部或部分产品、服务的当时的相关概况,部分产品、服务的内容可能不时有所调整。您所购买的腾讯云产品、服务的种类、服务标准等应由您与腾讯云之间的商业合同约定,除非双方另有约定,否则,腾讯云对本文档内容不做任何明示或默示的承诺或保证。【联系我们】我们致力于为您提供个性化的售前购买咨询服务,及相应的技术售后服务,任何问题请联系 4009100100。]}2025/05/20 15:00:57 SearchDocument: {Id:1374280682098630709 Vector:[] SparseVector:[] Score:312.57782 Fields:map[chunk_num:1 file_name:tcvdb.pdf image_list:[ef173e04-5503-421a-b4e6-ae414b3e0ce9.png] section_num:1 testInt:1024 testStr:v1 text:# 向量数据库产品简介【版权声明】©2013-2023 腾讯云版权所有本文档(含所有文字、数据、图片等内容)完整的著作权归腾讯云计算(北京)有限责任公司单独所有,未经腾讯云事先明确书面许可,任何主体不得以任何形式复制、修改、使用、抄袭、传播本文档全部或部分内容。前述行为构成对腾讯云著作权的侵犯,腾讯云将依法采取措施追究法律责任。【商标声明】及其它腾讯云服务相关的商标均为腾讯云计算(北京)有限责任公司及其关联公司所有。]}
精确查询
根据文件名查询文件
上传文件之后,可根据文件名查询文件。代码示例,如下所示。
res = client.query(database_name='python-sdk-test-upload',collection_name='coll-file-test',filter='file_name="tcvdb.pdf"',limit=10)print(json.dumps(res, ensure_ascii=False))
System.out.println("---------------------- query ----------------------");QueryParam queryParam = QueryParam.newBuilder().withFilter("file_name=\\"tcvdb.pdf\\"")// limit 限制返回行数,1 到 16384 之间.withLimit(20)// 偏移.withOffset(0)// 是否返回 vector 数据.withRetrieveVector(false).build();List<Document> qdos = client.query("db-test", "coll-file-test", queryParam);for (Document doc : qdos) {System.out.println("\\tres: " + doc.toString());}
log.Println("------------------------------ Query after waiting 15s to parse file ------------------------------")result, _ := client.Query(ctx, database, collection, []string{}, &tcvectordb.QueryDocumentParams{Filter: tcvectordb.NewFilter(`file_name="` + filename + `"`),Limit: 2,})ids := []string{}for _, doc := range result.Documents {log.Printf("File chunk: %+v", doc)ids = append(ids, doc.Id)}
获取文件图片 URL
使用 AI 套件上传 PDF 类型的文件后,支持获取图片 URL 地址列表。具体接口,请参见 Python-get_image_url()、Java-GetImageUrl()、Go-GetImageUrl()。
res = client.query(database_name='python-sdk-test-upload',collection_name='coll-file-test',filter='file_name="tcvdb.pdf"',limit=10)print(json.dumps(res, ensure_ascii=False))
System.out.println("---------------------- get image url ----------------------");GetImageUrlRes getImageUrlRes = client.GetImageUrl("db-test", "coll-file-test",GetImageUrlParam.newBuilder().setFileName("tcvdb.pdf").setDocumentIds(qdos.stream().map(doc->doc.getId()).collect(Collectors.toList())).build());System.out.println("get image url res:");System.out.println(JsonUtils.toJsonString(getImageUrlRes.getImages()));
log.Println("------------------------------ Get file chunks' imageUrls ------------------------------")res, err := d.client.GetImageUrl(ctx, database, collection, tcvectordb.GetImageUrlParams{FileName: filename,DocumentIds: ids,})if err != nil {return err}for _, docImages := range res.Images {for _, docImage := range docImages {log.Printf("docImage: %+v", docImage)}}
设置语块序号(chunk_num)范围检索文件
当需要基于当前 chunk_num 值(chunk_num=2)补全其前后语块内容时,可通过 filter 指定条件表达式动态调整查询范围。例如,若需获取相邻 chunk_num 的上下文内容,可设置范围条件为 chunk_num >= {current-2} AND chunk_num <= {current+2}(若当前为3,则查询编号1、2、3 、4、5的语块),从而覆盖目标语块及其关联上下文,确保内容逻辑的连贯性与完整性。具体代码示例,如下所示。
doc = res[0][0]chunk_num = doc.get('chunk_num')res = client.query(database_name='python-sdk-test-upload',collection_name='coll-file-test',limit=10,sort={'fieldName': 'chunk_num','direction': 'asc'},filter=f'chunk_num>={0 if chunk_num-2 <= 0 else chunk_num-2} and 'f'chunk_num<={chunk_num+2} and file_name=\\"tcvdb.pdf\\"',)print(json.dumps(res, ensure_ascii=False))
System.out.println("---------------------- get chunk text by chunk_num ----------------------");Long chunkNum = (Long) qdos.get(1).getObject("chunk_num");Long sectionNum = (Long) qdos.get(1).getObject("section_num");if (chunkNum==null || sectionNum==null){return;}Long startChunkNum = chunkNum-2;if(startChunkNum < 0){startChunkNum = 0L;}QueryParam queryParam = QueryParam.newBuilder().withFilter("file_name=\\"tcvdb.pdf\\" and chunk_num >= "+ startChunkNum +" and chunk_num <=" + (chunkNum+2))// limit 限制返回行数,1 到 16384 之间.withLimit(10)// 输出按照 chunk_num 排序.withSort(OrderRule.newBuilder().withFieldName("chunk_num").withDirection(OrderEnum.DESC).build())// 偏移.withOffset(0)// 是否返回 vector 数据.withRetrieveVector(false).build();// 输出相似性检索结果,检索结果为二维数组,每一位为一组返回结果,分别对应 search 时指定的多个向量List<Document> docs = client.query("db-test", "coll-file-test", queryParam);for (Document doc : docs) {System.out.println("\\tres: " + doc.toString());}
log.Println("------------------------------ Query file neighbor chunks ------------------------------")if len(result.Documents) != 2 {return nil}chunkDoc := result.Documents[1]if _, ok := chunkDoc.Fields["chunk_num"]; !ok || chunkDoc.Fields["chunk_num"].Type() != tcvectordb.Uint64 {return nil}chunkNum := chunkDoc.Fields["chunk_num"].Uint64()leftChunkNum := uint64(0)if chunkNum >= 2 {leftChunkNum = chunkNum - 2}rightChunkNum := chunkNum + 2result, err = client.Query(ctx, database, collection, []string{}, &tcvectordb.QueryDocumentParams{Filter: tcvectordb.NewFilter(`file_name="` + filename + `"`).And(`chunk_num>=` +strconv.Itoa(int(leftChunkNum)) + ` and chunk_num<=` + strconv.Itoa(int(rightChunkNum))),Limit: 10,Sort: []document.SortRule{{FieldName: "chunk_num",Direction: "asc",},},})if err != nil {return err}for _, doc := range result.Documents {log.Printf("File expand chunk: %+v", doc)}
输出信息,以 Go SDK 为例,如下所示。
2025/05/22 11:12:40 ------------------------------ Query file neighbor chunks ------------------------------2025/05/22 11:12:40 File expand chunk: {Id:1374948009337135161 Vector:[] SparseVector:[] Score:0 Fields:map[chunk_num:5 file_name:tcvdb.pdf section_num:4 testInt:1024 testStr:v1 text:### 腾讯云向量数据库是什么?腾讯云向量数据库是一款全托管的自研企业级分布式数据库服务,专用于存储、检索、分析多维向量数据。该数据库支持多种索引类型和相似度计算方法,单索引支持10亿级向量规模,可支持百万级 QPS 及毫秒级查询延迟。腾讯云向量数据库不仅能为大模型提供外部知识库,提高大模型回答的准确性,还可广泛应用于推荐系统、NLP 服务、计算机视觉、智能客服等 AI 领域。]}2025/05/22 11:12:40 File expand chunk: {Id:1374948009337135162 Vector:[] SparseVector:[] Score:0 Fields:map[chunk_num:6 file_name:tcvdb.pdf section_num:5 testInt:1024 testStr:v1 text:### 关键概念如果您不熟悉向量数据库和相似性搜索领域,请优先阅读以下基本概念,便于您对向量数据库有一个初步的了解。更多名词解释,请阅读 关键概念。]}2025/05/22 11:12:40 File expand chunk: {Id:1374948009337135163 Vector:[] SparseVector:[] Score:0 Fields:map[chunk_num:7 file_name:tcvdb.pdf section_num:6 testInt:1024 testStr:v1 text:#### 什么是向量?向量是指在数学和物理中用来表示大小和方向的量。它由一组有序的数值组成,这些数值代表了向量在每个坐标轴上的分量。]}2025/05/22 11:12:40 File expand chunk: {Id:1374948009337135164 Vector:[] SparseVector:[] Score:0 Fields:map[chunk_num:8 file_name:tcvdb.pdf section_num:7 testInt:1024 testStr:v1 text:#### 什么是非结构化数据?非结构化数据,是指图像、文本、音频等数据。与结构化数据相比,非结构化数据不遵循预定义模型或组织方式,通常更难以处理和分析。]}2025/05/22 11:12:40 File expand chunk: {Id:1374948009337135165 Vector:[] SparseVector:[] Score:0 Fields:map[chunk_num:9 file_name:tcvdb.pdf section_num:8 testInt:1024 testStr:v1 text:#### 什么是 AI 中的向量表示?当我们处理非结构化数据时,需要将其转换为计算机可以理解和处理的形式。向量表示是一种将非结构化数据转换为嵌入向量的技术,通过多维度向量数值表述某个对象或事物的属性或者特征。腾讯云向量数据库提供的模型能力,目前在开发调试中。具体上线时间,请关注 产品动态。]}
设置段落序号(section_num)检索文件
基于段落序号(section_num)和语块编号(chunk_num),可以精准定位文件内容。例如,若需提取某段落(如 section_num=5)的前五个语块(chunk_num 范围为1至4),可通过 filter 条件表达式设置 section_num = {目标值} AND chunk_num BETWEEN 1 AND 4,限定查询范围在目标段落内,避免跨段数据的干扰。具体示例,如下所示。
section_num = res[1].get('section_num')res = client.query(database_name='python-sdk-test-upload',collection_name='coll-file-test',limit=10,sort={'fieldName': 'chunk_num','direction': 'asc',},filter=f'chunk_num>={0 if chunk_num-2 <= 0 else chunk_num-2} and 'f'chunk_num<={chunk_num+2} and section_num={section_num} and file_name=\\"tcvdb.pdf\\"',)print(json.dumps(res, ensure_ascii=False))vdb_client.close()
System.out.println("---------------------- get chunk text by chunk_num ----------------------");Long chunkNum = (Long) qdos.get(1).getObject("chunk_num");Long sectionNum = (Long) qdos.get(1).getObject("section_num");if (chunkNum==null || sectionNum==null){return;}Long startChunkNum = chunkNum-2;if(startChunkNum < 0){startChunkNum = 0L;}QueryParam queryParam = QueryParam.newBuilder().withFilter("file_name=\\"tcvdb.pdf\\" and chunk_num >= "+ startChunkNum +" and chunk_num <=" + (chunkNum+2) + " and section_num=" + sectionNum)// limit 限制返回行数,1 到 16384 之间.withLimit(20)// 输出按照 chunk_num 排序.withSort(OrderRule.newBuilder().withFieldName("chunk_num").withDirection(OrderEnum.DESC).build())// 偏移.withOffset(0)// 是否返回 vector 数据.withRetrieveVector(false).build();// 输出相似性检索结果,检索结果为二维数组,每一位为一组返回结果,分别对应 search 时指定的多个向量List<Document> docs = client.query("db-test", "coll-file-test", queryParam);for (Document doc : docs) {System.out.println("\\tres: " + doc.toString());}
log.Println("------------------------------ Query file neighbor chunks with same section ------------------------------")if _, ok := chunkDoc.Fields["section_num"]; !ok || chunkDoc.Fields["section_num"].Type() != tcvectordb.Uint64 {return nil}sectionNum := chunkDoc.Fields["section_num"].Uint64()result, err = client.Query(ctx, database, collection, []string{}, &tcvectordb.QueryDocumentParams{Filter: tcvectordb.NewFilter(`file_name="` + filename + `"`).And(`chunk_num>=` +strconv.Itoa(int(leftChunkNum)) + ` and chunk_num<=` + strconv.Itoa(int(rightChunkNum))).And(`section_num=` + strconv.Itoa(int(sectionNum))),Limit: 10,Sort: []document.SortRule{{FieldName: "chunk_num",Direction: "asc",},},})if err != nil {return err}for _, doc := range result.Documents {log.Printf("File expand chunk with same section: %+v", doc)}
Java SDK 输出示例,如下所示。
---------------------- get chunk text by chunk_num ----------------------res: {"id":"1374654342526382105","score":0.0,"file_name":"tcvdb.pdf","chunk_num":1,"text":"# 向量数据库产品简介\\n\\n【版权声明】\\n\\n©2013-2023 腾讯云版权所有\\n\\n本文档(含所有文字、数据、图片等内容)完整的著作权归腾讯云计算(北京)有限责任公司单独所有,未经腾讯云事先明确书面许可,任何主体不得以任何形式复制、修改、使用、抄袭、传播本文档全部或部分内容。前述行为构成对腾讯云著作权的侵犯,腾讯云将依法采取措施追究法律责任。\\n\\n【商标声明】\\n\\n\\n\\n及其它腾讯云服务相关的商标均为腾讯云计算(北京)有限责任公司及其关联公司所有。","author":"Tencent","section_num":1,"tags":["Embedding","向量","AI"],"image_list":["42bad2a3-9313-47e3-b09e-43c3643c446f.png"]}res: {"id":"1374654342526382106","score":0.0,"text":"本文档涉及的第三方主体的商标,依法由权利人所有。未经腾讯云及有关权利人书面许可,任何主体不得以任何方式对前述商标进行使用、复制、修改、传播、抄录等行为,否则将构成对腾讯云及有关权利人商标权的侵犯,腾讯云将依法采取措施追究法律责任。\\n\\n【服务声明】\\n\\n本文档意在向您介绍腾讯云全部或部分产品、服务的当时的相关概况,部分产品、服务的内容可能不时有所调整。您所购买的腾讯云产品、服务的种类、服务标准等应由您与腾讯云之间的商业合同约定,除非双方另有约定,否则,腾讯云对本文档内容不做任何明示或默示的承诺或保证。\\n\\n【联系我们】\\n\\n我们致力于为您提供个性化的售前购买咨询服务,及相应的技术售后服务,任何问题请联系 4009100100。\\n\\n","chunk_num":2,"tags":["Embedding","向量","AI"],"author":"Tencent","section_num":1,"file_name":"tcvdb.pdf"}