本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
自动优化
Auto-Optimize 是一项自动优化矢量索引的服务,使用户无需数周的专家手动调整即可平衡搜索质量、速度和成本。它根据用户定义的延迟和召回要求评估索引配置,并生成优化建议,因此只需要最少的专业知识。建议通常在 30-60 分钟内送达。
传统的向量索引配置需要大量的专业知识和实验才能实现最佳性能。诸如ef_construction(控制索引构建质量)(决定图形连接数)m(控制HNSW搜索)和量化方法ef_search(二进制量化(32x、16x、8x)、标量量化(4x))之类的参数会显著影响搜索准确性和资源利用率。Auto-Optimize 使用超参数优化算法,在您定义的延迟和召回要求范围内发现最适合您的数据集的索引配置。
优势
自动优化 OpenSearch 具有以下好处:
-
自动参数调整-无需对算法 (HNSW)、量化、重新评分和引擎参数进行手动实验,从而节省时间并缩短向量搜索优化的学习曲线。
-
优化搜索速度-默认情况下 OpenSearch ,针对内存性能进行配置。自动优化可以发现有利的权衡取舍,从而提高搜索质量并节省成本,同时保持可接受的搜索速度。
-
成本优化-通过寻找降低索引内存需求的选项来降低成本,同时最大限度地减少搜索质量和速度的权衡。
-
优化搜索质量 ——有可能提供比默认设置更高的召回率,或者发现有利的权衡取舍,从而在最大限度地减少召回损失的情况下节省大量成本。
自动优化与其他 OpenSearch 功能配合使用,例如用于向量索引的 GPU 加速为矢量搜索工作负载提供全面的性能优化。
工作原理
自动优化通过基于作业的架构运行,该架构可分析您的矢量数据并提供优化建议。关键点:
-
用户在 Amazon S3 存储桶中以 Parquet 或 JSONL 格式共享他们的数据集。
-
他们通过配置可接受的召回和延迟阈值来配置无服务器自动优化作业。更宽松的阈值使服务能够发现更显著的成本优化。
-
在完全由 Ama OpenSearch zon Service 管理的基础设施上运行的自动优化作业。任务不会消耗您的域名或集合上的资源。Workers 并行运行以评估索引配置,并使用对大型数据集的采样通常在 30-60 分钟内得出结果。
-
每项任务均按可预测的统一费率计费。有关定价信息,请参阅 Amazon OpenSearch 服务定价
。
先决条件
-
数据集格式和权限-您必须在 Amazon S3 存储桶文件夹中将数据集作为一个或多个 Parquet 或 JSONL 文件提供。例如:
-
实木复合地板:
s3://dataset-bucket-us-east-1/dataset_folder/first_half.parquet和s3://dataset-bucket-us-east-1/dataset_folder/second_half.parquet -
JSONL:
s3://dataset-bucket-us-east-1/dataset_folder/data.jsonl
提供封闭文件夹 URI(例如
s3://dataset-bucket-us-east-1/dataset_folder/)。该文件夹必须包含单一格式的文件,不要在同一个文件夹中混用 Parquet 和 JSONL 文件。该数据集将用于生成推荐。确保您的联合角色对该资源具有以下 Amazon S3 权限:"s3:Get*", "s3:List*", "s3:Describe*"。 -
-
指定正确的数据集元数据-提供的数据集必须包含一行浮点值。每列的名称和每个向量的维度必须与控制台中提供的选项相匹配。例如,如果数据集包含命名的向量,
train_data这些向量是每个768维度,则这些值必须与自动优化控制台相匹配。 -
(如果使用矢量摄取功能)-如果您计划使用摄取功能(采用自动优化建议以自动创建索引和摄取数据),则必须将集群配置为授予自动优化权限,以便将数据集提取到 OpenSearch 集群中。 OpenSearch 对于具有 OpenSearch 域访问策略的域,请通过该策略向新创建的角色授予访问权限。对于具有精细访问控制的 OpenSearch 域,请将管道角色添加为后端角色。对于 OpenSearch 无服务器集合,请将管道角色添加到数据访问策略中。
-
IAM 权限-您需要以下 IAM 权限才能使用自动优化:
opensearch:SubmitAutoOptimizeJobopensearch:GetAutoOptimizeJobopensearch:DeleteAutoOptimizeJobopensearch:CancelAutoOptimizeJobopensearch:ListAutoOptimizeJobs
注意
这些是基于身份的策略。自动优化不支持基于资源的策略。
-
凭证到期-将您的联合用户会话配置为证书的最短到期时间至少为 1 小时。对于非常大的数据集或高维度,可以考虑将过期时间延长至 3 小时。
自动优化的用例
在以下情况下,自动优化特别有用:
初始配置优化
首次部署矢量搜索应用程序时,确定最佳 HNSW 参数通常需要大量的测试和领域专业知识。自动优化通过分析您的数据和工作负载特征来推荐生产就绪配置,从而消除了这一 trial-and-error过程。
此用例非常适合刚接触矢量搜索的团队或需要快速建立基准配置的从其他矢量数据库平台迁移的团队。
缩放优化
当您的矢量数据集从数千个向量增加到数百万个向量时,最初效果良好的参数可能会变得不理想。自动优化建议进行调整以保持大规模性能。
降低成本
向量索引会消耗大量的计算和存储资源,对于高维嵌入尤其如此。Auto-Optimize 通过寻找更有效的参数配置来发现降低成本的机会,这些配置既能保持所需的性能水平,又能使用更少的资源。
例如,自动优化可能会发现您的当前m值(图形连接性)高于精度要求所需的值,从而使您能够在不影响搜索质量的情况下缩短索引时间和存储空间。
性能故障排除
当在向量搜索操作中遇到查询性能缓慢或延迟高时,自动优化可以分析您的数据集并确定更优的配置。该服务提供解决性能瓶颈的具体建议,例如调整图形连接或搜索参数。
限制
-
区域可用性-自动优化仅在以下 AWS 区域可用:
ap-south-1
eu-west-1
us-west-2
us-east-2
us-east-1
eu-central-1
ap-southeast-2
ap-northeast-1
ap-southeast-1
-
集合类型-仅矢量搜索集合和 OpenSearch 域(2.19、3.1 和 3.3)支持自动优化。
-
发动机支架
按部署类型划分的引擎支持 Engine Serverless OpenSearch 托管 Lucene 否 是 Faiss 支持 是 nmslib 否 否 -
算法支持-自动优化仅支持基于 HNSW 的向量索引。
-
并发作业-每个区域的每个账户最多可以运行 10 个并发优化作业。如果达到上限,则不能接受任何新工作。
-
Job 持续时间-优化作业可能需要 15 分钟到几小时不等,具体取决于数据集大小、维度和所需的性能指标。
-
推荐-自动优化最多只能建议 3 条建议。
-
数据集
支持的格式:Parquet、JSONL
数据存储:亚马逊 S3
账单和成本
Auto-Optimize 使用按作业定价模型,即无论数据集大小和优化配置如何,您都要为每项成功的优化作业付费。您不会因为失败或取消的任务而被收费。此外,自动优化在与托管或无服务器 OpenSearch 集群不同的基础架构上运行,因此它不会影响先前存在的集群的资源利用率。
定价模式
自动优化费用与标准 OpenSearch 无服务器或 OpenSearch 托管域计算和存储成本分开计费。
有关定价信息,请参阅 Amazon OpenSearch 服务定价
支持的数据格式
自动优化支持存储在 Amazon S3 中的矢量数据集的以下数据格式:
Parquet 格式
Parquet 是一种针对分析工作负载进行了优化的列式存储格式。每个 Parquet 文件都应包含一列代表您的矢量数据的浮点数组。
Parquet 文件结构示例(以表格形式查看):
| id | train_data | |-----|--------------------------------| | 1 | [0.12, 0.45, 0.78, ..., 0.33] | | 2 | [0.56, 0.89, 0.12, ..., 0.67] | | 3 | [0.34, 0.67, 0.90, ..., 0.11] |
JSONL 格式
JSONL(JSON 行)是一种文本格式,其中每行都是一个有效的 JSON 对象。每行都应包含一个带有浮点数组的字段,表示您的矢量数据。
JSONL 文件示例:
{"id": 1, "train_data": [0.12, 0.45, 0.78, 0.33]} {"id": 2, "train_data": [0.56, 0.89, 0.12, 0.67]} {"id": 3, "train_data": [0.34, 0.67, 0.90, 0.11]}
在格式之间转换
如果您的数据格式不同,则可以使用以下 Python 脚本对其进行转换。
将 JSON 或 JSONL 转换为实木复合地板
#!/usr/bin/env python3 import json import pyarrow as pa import pyarrow.parquet as pq from pathlib import Path from typing import Any, Dict, List def load_json_any(path: Path) -> List[Dict[str, Any]]: """ Load JSON that can be: - a list of objects - a single object - JSON Lines (one object per line) Returns list[dict]. """ text = path.read_text().strip() # Try full JSON file try: obj = json.loads(text) if isinstance(obj, list): return obj if isinstance(obj, dict): return [obj] except json.JSONDecodeError: pass # Fallback → JSON Lines records = [] for i, line in enumerate(text.splitlines(), start=1): line = line.strip() if not line: continue try: rec = json.loads(line) except json.JSONDecodeError as e: raise ValueError(f"Invalid JSON on line {i}: {e}") if not isinstance(rec, dict): raise ValueError(f"Line {i} must contain a JSON object") records.append(rec) return records def json_to_parquet(json_path: str, parquet_path: str, compression: str = "snappy"): """Convert ANY JSON to Parquet (schema inferred).""" records = load_json_any(Path(json_path)) table = pa.Table.from_pylist(records) pq.write_table(table, parquet_path, compression=compression) print(f"Wrote {len(records)} rows to {parquet_path}") if __name__ == "__main__": INPUT_JSON = "vectors.jsonl" OUTPUT_PARQUET = "vectors.parquet" json_to_parquet(INPUT_JSON, OUTPUT_PARQUET)
将 Parquet 转换为 JSONL
#!/usr/bin/env python3 import json import pyarrow.parquet as pq def parquet_to_jsonl(parquet_path: str, jsonl_path: str): """Convert a Parquet file to JSONL format.""" table = pq.read_table(parquet_path) rows = table.to_pylist() with open(jsonl_path, "w") as f: for row in rows: f.write(json.dumps(row) + "\n") print(f"Wrote {len(rows)} rows to {jsonl_path}") if __name__ == "__main__": INPUT_PARQUET = "vectors.parquet" OUTPUT_JSONL = "vectors.jsonl" parquet_to_jsonl(INPUT_PARQUET, OUTPUT_JSONL)
相关功能
自动优化可与其他 Amazon S OpenSearch ervice 功能配合使用,帮助您构建和优化矢量搜索应用程序:
-
用于向量索引的 GPU 加速-使用 GPU 加速加速向量索引构建,以减少索引时间和成本。
-
矢量摄入-快速将来自 Amazon S3 的矢量数据提取并索引到您的域或集合中。