向量索引(Python SDK V2)

通过OSS向量检索,您可以基于语义内容、OSS元数据、多媒体元数据、对象ETag及标签和自定义元数据等条件,快速定位海量Object中的目标文件,优化检索效率。本文介绍如何使用Python SDK V2进行向量检索。

注意事项

  • 本文示例代码以华东1(杭州)的地域IDcn-hangzhou为例,默认使用外网Endpoint,如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的RegionEndpoint的对应关系,请参见OSS地域和访问域名

  • 本文以从环境变量读取访问凭证为例。如何配置访问凭证,请参见配置访问凭证

示例代码

开启向量检索功能

以下代码用于为指定Bucket开启向量检索功能。

import argparse
import alibabacloud_oss_v2 as oss

# 创建命令行参数解析器,并添加描述信息
parser = argparse.ArgumentParser(description="open meta query sample")
# 添加必需的命令行参数 --region,用于指定存储空间所在的区域
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
# 添加必需的命令行参数 --bucket,用于指定要操作的存储空间名称
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
# 添加可选的命令行参数 --endpoint,用于指定访问OSS时使用的域名
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')

def main():
    # 解析命令行参数
    args = parser.parse_args()

    # 从环境变量中加载认证信息
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # 使用SDK提供的默认配置
    cfg = oss.config.load_default()
    # 设置认证信息提供者
    cfg.credentials_provider = credentials_provider
    # 根据命令行参数设置区域
    cfg.region = args.region
    # 如果提供了endpoint,则更新配置中的endpoint
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # 创建OSS客户端
    client = oss.Client(cfg)

    # 构建一个OpenMetaQuery请求,,用于开启存储空间的向量检索功能
    result = client.open_meta_query(oss.OpenMetaQueryRequest(
            bucket=args.bucket,
            mode='semantic',# 设置为"semantic",表示选择向量检索
    ))

    # 打印请求的结果状态码和请求ID
    print(f'status code: {result.status_code},'
          f' request id: {result.request_id},'
          )

# 当作为主程序运行时调用main函数
if __name__ == "__main__":
    main()

获取元数据索引库信息

以下代码用于获取指定Bucket的元数据索引库信息。

import argparse
import alibabacloud_oss_v2 as oss

# 创建一个命令行参数解析器,并添加必要的参数
parser = argparse.ArgumentParser(description="get meta query status sample")
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')

def main():
    # 解析命令行参数
    args = parser.parse_args()

    # 从环境变量中加载凭据信息
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # 使用SDK的默认配置
    cfg = oss.config.load_default()
    # 设置凭据提供者为从环境变量获取的凭据
    cfg.credentials_provider = credentials_provider
    # 设置OSS服务所在的区域
    cfg.region = args.region
    # 如果提供了endpoint,则设置自定义的endpoint
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # 创建OSS客户端
    client = oss.Client(cfg)

    # 调用get_meta_query_status方法来获取指定存储空间的元数据索引库信息
    result = client.get_meta_query_status(oss.GetMetaQueryStatusRequest(
            bucket=args.bucket,
    ))

    # 打印返回结果中的相关信息
    print(f'status code: {result.status_code},'
            f' request id: {result.request_id},'
            f' create time: {result.meta_query_status.create_time},'
            f' update time: {result.meta_query_status.update_time},'
            f' state: {result.meta_query_status.state},'
            f' phase: {result.meta_query_status.phase},'
    )

# 当脚本被直接运行时,调用main函数
if __name__ == "__main__":
    main()

查询满足指定条件的Object

以下代码通过向量检索功能查询满足指定语义检索内容的Object。

import argparse
import alibabacloud_oss_v2 as oss

# 创建命令行参数解析器,用于处理命令行输入
parser = argparse.ArgumentParser(description="do meta query semantic sample")
# 添加必要的命令行参数
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)  # 存储空间所在地域
parser.add_argument('--bucket', help='The name of the bucket.', required=True)  # 存储空间名称
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')  # OSS访问域名,可选

def main():
    # 解析命令行参数
    args = parser.parse_args()

    # 从环境变量中加载访问凭证
    # 运行前需要设置环境变量:OSS_ACCESS_KEY_ID 和 OSS_ACCESS_KEY_SECRET
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # 加载SDK默认配置
    cfg = oss.config.load_default()
    # 设置凭证提供者
    cfg.credentials_provider = credentials_provider
    # 设置区域
    cfg.region = args.region
    # 如果提供了endpoint,则更新配置中的endpoint
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # 创建OSS客户端实例
    client = oss.Client(cfg)

    # 发起元数据查询请求 - 向量检索模式
    result = client.do_meta_query(oss.DoMetaQueryRequest(
            bucket=args.bucket,
            mode='semantic',
            meta_query=oss.MetaQuery(
                max_results=1000,
                query='俯瞰白雪覆盖的森林',
                order='desc',
                media_types=oss.MetaQueryMediaTypes(
                    media_type=['image']
                ),
                simple_query='{"Operation":"gt", "Field": "Size", "Value": "30"}',
            ),
    ))

    # 打印检索结果
    print(vars(result))

if __name__ == "__main__":
    main()

关闭向量检索功能

以下代码用于关闭指定Bucket的向量检索功能。

import argparse
import alibabacloud_oss_v2 as oss

# 创建一个命令行参数解析器,用于处理命令行参数
parser = argparse.ArgumentParser(description="close meta query sample")
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')

def main():
    # 解析命令行参数
    args = parser.parse_args()

    # 从环境变量中加载凭据信息
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # 使用SDK的默认配置
    cfg = oss.config.load_default()
    # 设置凭据提供者为从环境变量获取的凭据
    cfg.credentials_provider = credentials_provider
    # 设置配置中的区域信息
    cfg.region = args.region
    # 如果提供了endpoint,则设置配置中的endpoint
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # 创建OSS客户端
    client = oss.Client(cfg)

    # 调用close_meta_query方法关闭存储空间的检索功能
    result = client.close_meta_query(oss.CloseMetaQueryRequest(
            bucket=args.bucket,
    ))

    # 打印响应的状态码和请求ID
    print(f'status code: {result.status_code}, request id: {result.request_id}')

# 当此脚本直接运行时执行main函数
if __name__ == "__main__":
    main()

相关文档