创建文档库

创建一个文档库(DocumentCollection)用于存储Chunks文本和向量数据。

代码调用

def create_document_collection(account,
                               account_password,
                               namespace,
                               collection,
                               metadata: str = None,
                               full_text_retrieval_fields: str = None,
                               parser: str = None,
                               embedding_model: str = None,
                               metrics: str = None,
                               hnsw_m: int = None,
                               pq_enable: int = None,
                               external_storage: int = None,):
    request = gpdb_20160503_models.CreateDocumentCollectionRequest(
        region_id=ADBPG_INSTANCE_REGION,
        dbinstance_id=ADBPG_INSTANCE_ID,
        manager_account=account,
        manager_account_password=account_password,
        namespace=namespace,
        collection=collection,
        metadata=metadata,
        full_text_retrieval_fields=full_text_retrieval_fields,
        parser=parser,
        embedding_model=embedding_model,
        metrics=metrics,
        hnsw_m=hnsw_m,
        pq_enable=pq_enable,
        external_storage=external_storage
    )
    response = get_client().create_document_collection(request)
    print(f"create_document_collection response code: {response.status_code}, body:{response.body}")


if __name__ == '__main__':
    metadata = '{"title":"text", "page":"int"}'
    full_text_retrieval_fields = "title"
    embedding_model = "m3e-small"
    create_document_collection("testacc", "Test1234", "ns1", "dc1", 
                               metadata=metadata, full_text_retrieval_fields=full_text_retrieval_fields, 
                               embedding_model=embedding_model)


# output: body:
# {
#    "Message":"success",
#    "RequestId":"7BC35B66-5F49-1E79-A153-8D26576C4A3E",
#    "Status":"success"
# }

其中create_document_collection的参数说明如下:

  • account:AnalyticDB PostgreSQL版实例的数据库初始账号。

  • account_password:初始账号对应的密码。

  • namespace: 文档库所在的Namespace名称。

  • collection:要创建的文档库名称。

  • metadata:自定义map结构的数据元信息,key为字段名,value为字段类型。

  • full_text_retrieval_fields:自定义的逗号分隔的全文检索字段,字段必须属于metadata的key。

  • parser:全文检索参数,分词器,默认zh_cn。详情请参见全文检索介绍

  • embedding_model:Embedding模型。详情请参见Embedding模型介绍

  • metrics:向量索引参数,索引算法。详情请参见向量索引

  • hnsw_m:向量索引参数,HNSW算法中的最大邻居数,范围1~1000。详情请参见向量索引

  • pq_enable:向量索引参数,索引是否开启PQ(Product quantization)算法加速。详情请参见向量索引

  • external_storage: 向量索引参数,是否使用mmap缓存。详情请参见向量索引

查看数据库的变更效果

代码调用成功后,可登录DMS,查看创建的表结构(表名为ns1.dc1)。

字段

类型

字段来源

说明

id

text

固定字段

主键,表示单条Chunk文本的UUID。

vector

real[]

固定字段

向量数据ARRAY,长度对应指定的Embedding模型的维度。

doc_name

text

固定字段

文档名称。

content

text

固定字段

单条Chunk文本,由文档在Loader和Splitter后得到。

loader_metadata

json

固定字段

文档在Loader解析时对应的元数据。

to_tsvector

TSVECTOR

固定字段

保存全文检索字段,数据来源为full_text_retrieval_fields指定的字段数据。其中content为默认字段,本调用场景表示会从content和title两个数据源做全文检索。

title

text

Metadata定义

用户自定义。

page

int

Metadata定义

用户自定义。

全文检索介绍

为了提高检索的精度,除了向量相似度外,AnalyticDB PostgreSQL版还支持全文检索,并且能和向量相似度检索同时使用达到双路召回效果。

定义全文检索字段

在使用全文检索前,首先需指定哪些字段用于全文检索的数据源,文档库的接口已经默认使用content字段,您还可以指定其它的Metadata自定义字段。

分词

创建文档库时可以指定Parser字段作为分词器,一般场景下,使用默认的中文zh_ch即可,如果有特殊的分词字符要求,请联系阿里云技术支持。

在插入数据时,分词器会将全文检索指定字段的数据按照分词符切分,保存到to_tsvector中,供后续全文检索使用。

Embedding模型介绍

Embedding支持如下模型:

embedding_model

维度

说明

m3e-small

512

来源于moka-ai/m3e-small,仅支持中文,不支持英文。

m3e-base

768

来源于moka-ai/m3e-base,支持中英文。

text2vec

1024

来源于GanymedeNil/text2vec-large-chinese,支持中英文。

text-embedding-v1

1536

来源于灵积的通用文本向量,支持中英文。

text-embedding-v2

1536

text-embedding-v1的升级版。

clip-vit-b-32(多模)

512

开源的多模模型,支持文本、图片。

向量索引

向量索引支持设置如下参数:

参数

说明

metrics

相似度距离度量算法,取值说明如下:

  • l2:使用欧氏距离(平方)函数构建索引,通常用于图片相似度检索场景。

  • ip:使用反内积距离函数构建索引,通常用于向量归一化之后替代余弦相似度。

  • cosine:使用余弦距离函数构建索引,通常用于文本相似度检索场景。

hnsw_m

HNSW算法中的最大邻居数。OpenAPI会根据向量维度自动设置不同的值。

pq_enable

是否开启PQ向量降维的功能,取值说明如下:

  • 0:关闭。

  • 1:开启。

PQ向量降维依赖于存量的向量样本数据进行训练,如果数据量小于50w时,不建议设置此参数。

external_storage

是否使用mmap构建HNSW索引,取值说明如下:

  • 0:默认会采用段页式存储构建索引,该模式可以使用PostgreSQL中的shared_buffer做缓存,支持删除和更新等操作。

  • 1:该索引会采用mmap构建索引,该模式不支持删除更新等操作。