向量数据库 基于 Collection 上传文件

向量数据库提供 Collection 的自动化文档处理能力,支持直接上传 Markdown、PDF、Word、PPT 等格式文件于 Collection。这里说明基于 Collection 集合上传文件的关键操作。

相关产品
向量数据库 产品页,含版本规格、价格与购买入口。

一、SDK 参考

类别 SDK Demo
Python upload_file.py
Java VectorDBExampleWithCollectionUploadFile.java
Go collection_upload_file_demo

二、创建 Collection

创建一个数据库集合来存储文件内容,同时为文件的关键字段(如文件名、文本内容、图片信息等)建立索引以优化查询效率。关键字段,如下表所示。

注意:说明:

注意:创建数据库集合,文件的关键字段均可以自定义,在文件上传时,可通过 field_mappings 保留的文件参数逐一映射自定义的字段名。具体信息,请参见 上传文件。

字段名 字段含义 索引设置要求或建议
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)类型,否则接口将报错,导致文件无法上传。

PythonJavagoimport 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 模型的名称。你需根据业务的语言类型、数据维度要求等综合选择合适的模型。 取值如下所示。更多信息,参见 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)在原始文档中的顺序。

PyhonJavaGoimport 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 指定的条件表达式的内容。代码示例,如下所示。

PythonJavaGOimport 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![vdb-image](51292004-6700-4777-82c3-95275913cef4.png)\\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![vdb-image](42bad2a3-9313-47e3-b09e-43c3643c446f.png)\\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 腾讯云版权所有这篇档(含所有文字、数据、图片等内容)完整的著作权归腾讯云计算(北京)有限责任公司单独所有,未经腾讯云事先明确书面许可,任何主体不得以任何形式复制、修改、使用、抄袭、传播这篇档全部或部分内容。前述行为构成对腾讯云著作权的侵犯,腾讯云将依法采取措施追究法律责任。【商标声明】![vdb-image](ef173e04-5503-421a-b4e6-ae414b3e0ce9.png)及其它腾讯云服务相关的商标均为腾讯云计算(北京)有限责任公司及其关联公司所有。]}

五、根据文件名查询文件

上传文件之后,可根据文件名查询文件。代码示例,如下所示。

PythonJavaGOres = 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()。

PythonJavaGOres = 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的语块),从而覆盖目标语块及其关联上下文,确保内容逻辑的连贯性与完整性。具体代码示例,如下所示。

PythonJavaGodoc = 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,限定查询范围在目标段落内,避免跨段数据的干扰。具体示例,如下所示。

PythonJavaGosection_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![vdb-image](42bad2a3-9313-47e3-b09e-43c3643c446f.png)\\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"}

赞 (0)
上一篇 4天前
下一篇 4天前