

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 自動最適化
<a name="serverless-auto-optimize"></a>

Auto-optimize は、ベクトルインデックスの最適化を自動化するサービスであり、数週間の手動エキスパート調整を必要とせずに、ユーザーが検索品質、速度、コストのバランスを取ることができます。ユーザー定義のレイテンシーとリコールの要件に基づいてインデックス設定を評価し、最適化の推奨事項を生成するため、最小限の専門知識が必要です。レコメンデーションは通常 30～60 分以内に配信されます。

従来のベクトルインデックス設定では、最適なパフォーマンスを実現するには、かなりの専門知識と実験が必要です。`ef_construction` (インデックスのビルド品質を制御する)`m`、 (グラフ接続の数を決定する）、 `ef_search` (HNSW 検索を制御する）、量子化メソッド (バイナリ量子化 (32x、16x、8x)、スカラー量子化 (4x)) などのパラメータは、検索精度とリソース使用率の両方に大きな影響を与えます。自動最適化は、ハイパーパラメータ最適化アルゴリズムを使用して、定義されたレイテンシーおよびリコール要件内でデータセットに一意に最適なインデックス設定を検出します。

## 利点
<a name="auto-optimize-benefits"></a>

OpenSearch の自動最適化には、次の利点があります。
+ **自動パラメータ調整** - アルゴリズム (HNSW)、量子化、再スコアリング、エンジンパラメータによる手動実験を排除し、時間を節約し、ベクトル検索の最適化のための学習曲線を減らします。
+ **検索速度の最適化** - デフォルトでは、OpenSearch はインメモリパフォーマンス用に設定されています。自動最適化は、許容可能な検索速度を維持しながら、検索品質とコスト削減を改善する有利なトレードオフを検出します。
+ **コスト最適化** - 検索品質を最小限に抑え、トレードオフを高速化しながら、インデックスメモリ要件を減らすオプションを見つけることでコストを削減します。
+ **検索品質の最適化** - デフォルト設定よりも高いリコールを実現したり、リコール損失を最小限に抑えながら大幅なコスト削減を実現する有利なトレードオフを発見したりできます。

自動最適化は、 などの他の OpenSearch 機能と連携して[ベクトルインデックス作成の GPU アクセラレーション](gpu-acceleration-vector-index.md)、ベクトル検索ワークロードの包括的なパフォーマンス最適化を提供します。

## 仕組み
<a name="auto-optimize-how-it-works"></a>

自動最適化は、ベクトルデータを分析し、最適化の推奨事項を提供するジョブベースのアーキテクチャを介して動作します。キーポイント:
+ ユーザーは、Amazon S3 バケットで Parquet または JSONL 形式でデータセットを共有します。
+ 許容できるリコールとレイテンシーのしきい値を設定することで、サーバーレスの自動最適化ジョブを設定します。しきい値を緩和することで、サービスがより重要なコスト最適化を検出できます。
+ 自動最適化ジョブは、Amazon OpenSearch Service によってフルマネージドされたインフラストラクチャで実行されます。ジョブはドメインまたはコレクション上のリソースを消費しません。ワーカーは並行して実行してインデックス設定を評価し、大規模なデータセットでサンプリングを使用して、通常 30～60 分以内に結果を提供します。
+ 各ジョブは、予測可能な定額料金で請求されます。料金の詳細については、[「Amazon OpenSearch Service の料金](https://aws.amazon.com/opensearch-service/pricing/)」を参照してください。

## 前提条件
<a name="auto-optimize-prerequisites"></a>
+ **データセットの形式とアクセス許可** - データセットを Amazon S3 バケットフォルダ内の 1 つ以上の Parquet ファイルまたは JSONL ファイルとして利用できる必要があります。例えば、次のようになります。
  + Parquet: `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/`)。フォルダには 1 つの形式のファイルが含まれている必要があります。同じフォルダに Parquet ファイルと JSONL ファイルを混在させないでください。このデータセットは、レコメンデーションを生成するために使用されます。フェデレーティッドロールに、そのリソースに対する次の Amazon S3 アクセス許可があることを確認します: `"s3:Get*", "s3:List*", "s3:Describe*"`。
+ **正しいデータセットメタデータを指定する** - 指定されたデータセットには浮動小数点値の行が含まれている必要があります。各列の名前と各ベクトルの次元は、コンソールで提供されるオプションと一致する必要があります。たとえば、データセットに各`768`ディメンションの名前が`train_data`付けられたベクトルが含まれている場合、これらの値は自動最適化コンソールと一致する必要があります。
+ **(ベクトル取り込み機能を使用する場合)** - 取り込み機能を利用する場合 (インデックスを自動的に作成してデータを取り込むために自動最適化レコメンデーションを実行する場合）、データセットを OpenSearch クラスターに取り込むための自動最適化アクセス許可を付与するように OpenSearch クラスターを設定する必要があります。ドメインアクセスポリシーを持つ OpenSearch ドメインの場合、そのポリシーを通じて新しく作成されたロールにアクセス権を付与します。きめ細かなアクセスコントロールを持つ OpenSearch ドメインの場合は、パイプラインロールをバックエンドロールとして追加します。OpenSearch Serverless コレクションの場合、パイプラインロールをデータアクセスポリシーに追加します。
+ **IAM アクセス許可** - 自動最適化を使用するには、次の IAM アクセス許可が必要です。
  + `opensearch:SubmitAutoOptimizeJob`
  + `opensearch:GetAutoOptimizeJob`
  + `opensearch:DeleteAutoOptimizeJob`
  + `opensearch:CancelAutoOptimizeJob`
  + `opensearch:ListAutoOptimizeJobs`
**注記**  
これらはアイデンティティベースのポリシーです。自動最適化は、リソースベースのポリシーをサポートしていません。
+ **認証情報の有効期限** - フェデレーティッドユーザーセッションの認証情報の有効期限が少なくとも 1 時間になるように設定します。非常に大きなデータセットや高次元の場合は、有効期限を最大 3 時間延長することを検討してください。

## 自動最適化のユースケース
<a name="serverless-auto-optimize-use-cases"></a>

自動最適化は、以下のシナリオで特に重要です。

**初期設定の最適化**  
ベクトル検索アプリケーションを最初にデプロイする場合、最適な HNSW パラメータを決定するには、多くの場合、広範なテストとドメインの専門知識が必要です。自動最適化は、データとワークロードの特性を分析して本番環境に対応した設定を推奨することで、このtrial-and-errorプロセスを排除します。

このユースケースは、ベクトル検索を初めて行うチームや、ベースライン設定を迅速に確立する必要がある他のベクトルデータベースプラットフォームから移行するチームに最適です。

**スケーリングの最適化**  
ベクトルデータセットが数千から数百万のベクトルに増加するにつれて、最初にうまく機能したパラメータは最適ではない可能性があります。自動最適化では、パフォーマンスを大規模に維持するための調整が推奨されます。

**コスト削減**  
ベクトルインデックスは、特に高次元埋め込みでは、大量のコンピューティングリソースとストレージリソースを消費する可能性があります。自動最適化は、より少ないリソースを使用しながら必要なパフォーマンスレベルを維持する、より効率的なパラメータ設定を見つけることで、コストを削減する機会を特定します。

たとえば、自動最適化では、現在の`m`値 (グラフの接続性) が精度要件に必要な値よりも高いことが検出され、検索品質に影響を与えることなくインデックス作成時間とストレージを削減できます。

**パフォーマンスのトラブルシューティング**  
ベクトル検索オペレーションでクエリパフォーマンスが遅い、またはレイテンシーが高い場合、自動最適化はデータセットを分析し、より最適な設定を特定できます。このサービスは、グラフ接続や検索パラメータの調整など、パフォーマンスのボトルネックに対処するための特定の推奨事項を提供します。

## 制限事項
<a name="auto-optimize-limitations"></a>
+ **リージョンの可用性** - 自動最適化は、次の 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) でのみサポートされています。
+ **エンジンのサポート**  
**デプロイタイプ別のエンジンサポート**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/opensearch-service/latest/developerguide/serverless-auto-optimize.html)
+ **アルゴリズムのサポート** - 自動最適化は、HNSW ベースのベクトルインデックスのみをサポートします。
+ **同時ジョブ** - リージョンごとにアカウントごとに最大 10 個の同時最適化ジョブを実行できます。制限に達した場合、新しいジョブを受け入れることはできません。
+ **ジョブの期間** - 最適化ジョブは、データセットのサイズ、ディメンション、および必要なパフォーマンスメトリクスに応じて、15 分から数時間かかる場合があります。
+ **推奨事項** - 自動最適化は、最大 3 つの推奨事項のみを提案します。
+ **データセット**
  + サポートされている形式: Parquet、JSONL
  + データストア: Amazon S3

## 請求とコスト
<a name="auto-optimize-billing"></a>

自動最適化は、データセットのサイズと最適化設定に関係なく、成功した最適化ジョブごとに料金を支払うジョブごとの料金モデルを使用します。失敗したジョブやキャンセルされたジョブに対しては課金されません。さらに、自動最適化はマネージド型またはサーバーレスの OpenSearch クラスターとは異なるインフラストラクチャで実行されるため、既存のクラスターのリソース使用率には影響しません。

**料金モデル**  
自動最適化コストは、標準の OpenSearch Serverless または OpenSearch Managed ドメインのコンピューティングおよびストレージコストとは別に請求されます。

料金の詳細については、[「Amazon OpenSearch Service の料金](https://aws.amazon.com/opensearch-service/pricing/)」を参照してください。

## サポートされているデータ形式
<a name="auto-optimize-data-formats"></a>

自動最適化は、Amazon S3 に保存されているベクトルデータセットに対して次のデータ形式をサポートします。

### Parquet 形式
<a name="auto-optimize-parquet-format"></a>

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 形式
<a name="auto-optimize-jsonl-format"></a>

JSONL (JSON Lines) は、各行が有効な 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]}
```

### 形式間の変換
<a name="auto-optimize-convert-formats"></a>

データが別の形式である場合は、次の Python スクリプトを使用してデータを変換できます。

**JSON または JSONL を Parquet に変換する**  


```
#!/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)
```

## 関連機能
<a name="auto-optimize-related-features"></a>

自動最適化は、他の Amazon OpenSearch Service 機能と連携して、ベクトル検索アプリケーションの構築と最適化に役立ちます。
+ [ベクトルインデックス作成の GPU アクセラレーション](gpu-acceleration-vector-index.md) - GPU アクセラレーションを使用してベクトルインデックスの構築を加速し、インデックス作成の時間とコストを削減します。
+ [ベクトル取り込み](serverless-vector-ingestion.md) - Amazon S3 からドメインまたはコレクションにベクトルデータをすばやく取り込み、インデックスを作成します。