翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
自然言語を OpenSearch と Elasticsearch のクエリ向けにクエリ DSL に変換する
Amazon Web Services、Tabby Ward、Nicholas Switzer、Breanne Warner
概要
このパターンでは、大規模言語モデル (LLM) を使用して自然言語クエリをクエリドメイン固有言語 (クエリ DSL) に変換する方法を説明します。この方法を使用することで、ユーザーはクエリ言語に関する広範な知識がなくても OpenSearch や Elasticsearch などの検索サービスと容易にやり取りできるようになります。このリソースは、自然言語クエリ機能で検索ベースのアプリケーションを強化し、最終的にユーザーエクスペリエンスと検索機能を向上させたい開発者やデータサイエンティストにとって特に有益です。
このパターンでは、プロンプトエンジニアリング、反復的な改良、専門知識の組み込みといった手法を示します。これらはすべて合成データ生成に不可欠です。このアプローチは主にクエリ変換に焦点を当てていますが、データ拡張とスケーラブルな合成データ生成の可能性を暗黙的に示しています。この基盤は、より包括的な合成データ生成タスクに拡張可能であり、構造化されていない自然言語入力と構造化されたアプリケーション固有の出力をブリッジする LLM の能力を明確に示すことができます。
このソリューションには、従来の意味での移行ツールやデプロイツールは含まれていません。代わりに、LLM を使用して自然言語クエリをクエリ DSL に変換する概念実証 (PoC) の説明に焦点を当てています。
このパターンでは、環境を設定し、テキストからクエリへの変換を実装するためのステップバイステップガイドとして Jupyter Notebook を使用します。
Amazon Bedrock を使用して LLM にアクセスします。これは自然言語を解釈し、適切なクエリを生成するために不可欠です。
このソリューションは、Amazon OpenSearch Service と連携するように設計されています。Elasticsearch でも同様のプロセスに従うことが可能で、生成されたクエリを同様の検索エンジンに適用できる可能性があります。
クエリ DSL
このパターンでは、テキストからクエリへの DSL 変換に、フューショットプロンプト、システムプロンプト、構造化出力、プロンプトチェイニング、コンテキストのプロビジョニング、タスク固有のプロンプトなどの手法を使用します。これらの手法の定義と例については、「追加情報」セクションを参照してください。
前提条件と制限
前提条件
Jupyter Notebook を効果的に使用して自然言語クエリをクエリ DSL のクエリに変換するには、以下が必要です。
Jupyter Notebook への精通。Jupyter Notebook 環境でコードを移動および実行する方法の基本的な理解。
Python 環境。必要なライブラリがインストールされた、動作中の Python 環境 (Python 3.x を推奨)。
Elasticsearch または OpenSearch の知識。アーキテクチャやクエリの実行方法など、Elasticsearch または OpenSearch の基本的な知識。
AWS アカウント。 Amazon Bedrock およびその他の関連サービスにアクセス AWS アカウント するためのアクティブな 。
ライブラリと依存関係。 AWS インタラクション
boto3や LLM 統合に必要なその他の依存関係など、ノートブックに記載されている特定のライブラリのインストール。Amazon Bedrock のモデルアクセス。このパターンでは、Anthropic の Claude LLM を 3 つ使用します。Amazon Bedrock コンソール
を開き、[モデルアクセス]を選択します。次の画面で、[特定のモデルを有効にする]を選択し、次の 3 つのモデルを選択します。 Claude 3 Sonnet
Claude 3.5 Sonnet
Claude 3 Haiku
適切な IAM ポリシーと IAM ロール。でノートブックを実行するには AWS アカウント、 AWS Identity and Access Management (IAM) ロールに
SagemakerFullAccessポリシーと、「追加情報」セクションで提供されているポリシーが必要です。このポリシーには、 という名前を付けることができますAPGtext2querydslpolicy。このポリシーには、リストされている 3 つの Claude モデルへのサブスクライブが含まれています。
これらの前提条件を設定することで、ノートブックの操作やテキストからクエリへの変換機能の実装をスムーズに行うことができます。
制限事項
概念実証のステータス。このプロジェクトは主に概念実証 (PoC) を目的としています。これは、LLM を使用して自然言語クエリをクエリ DSL に変換する潜在能力を示すものですが、完全に最適化されておらず、本番環境には対応していない可能性があります。
モデルの制限:
コンテキストウィンドウの制約。Amazon Bedrock で利用可能な LLM を使用する場合は、コンテキストウィンドウの制限に注意してください。
Claude モデル (2024 年 9 月現在):
Claude 3 Opus: 200,000 トークン
Claude 3 Sonnet: 200,000 トークン
Claude 3 Haiku: 200,000 トークン
Amazon Bedrock のその他のモデルでは、コンテキストウィンドウのサイズが異なる場合があります。最新情報については、最新のドキュメントを参照してください。
モデルの可用性。Amazon Bedrock における特定のモデルの可用性は異なる場合があります。このソリューションを実装する前に、必要なモデルにアクセスできることを確認してください。
その他の制限事項
クエリの複雑さ。自然言語からクエリ DSL への変換の有効性は、入力クエリの複雑さによって異なる場合があります。
バージョン互換性。生成されたクエリ DSL は、使用する Elasticsearch または OpenSearch の特定のバージョンに応じて調整が必要になる場合があります。
パフォーマンス。このパターンで提供するのは PoC 実装であるため、大規模な本番環境で使用する場合はクエリ生成の速度と精度が最適でない可能性があります。
料金。Amazon Bedrock で LLM を使用すると、コストが発生します。選択したモデルの料金体系に注意してください。詳細については、「Amazon Bedrock の料金」を参照してください。
メンテナンス。LLM テクノロジーの進歩やクエリ DSL 構文の変更に対応するために、プロンプトとモデルの選択を定期的に更新する必要が生じる場合があります。
製品バージョン
このソリューションは Amazon OpenSearch Service でテストされています。Elasticsearch を使用する場合、このパターンの機能を正確にレプリケートするためにいくつかの変更が必要になる場合があります。
OpenSearch バージョンの互換性。OpenSearch は、メジャーバージョン内で下位互換性を維持します。例えば、次のようになります。
OpenSearch 1.x クライアントは、通常、OpenSearch 1.x クラスターと互換性があります。
OpenSearch 2.x クライアントは、通常、OpenSearch 2.x クラスターと互換性があります。
ただし、可能な限り、クライアントとクラスターの両方で同じマイナーバージョンを使用することをお勧めします。
OpenSearch API の互換性。OpenSearch は、ほとんどのオペレーションで Elasticsearch OSS 7.10.2 との API 互換性を維持しています。ただし、特に新しいバージョンでは、いくつかの相違点が存在します。
OpenSearch のアップグレードに関する考慮事項:
直接ダウングレードはサポートされていません。必要に応じて、スナップショットを使用してロールバックします。
アップグレードする際は、重大な変更がないか互換性マトリックスとリリースノートを確認してください。
Elasticsearch に関する考慮事項
Elasticsearch のバージョン。クエリ構文や機能はメジャーバージョン間で変更される可能性があるため、使用している Elasticsearch のメジャーバージョンが重要です。現在、最新の安定バージョンは Elasticsearch 8.x です。クエリが特定の Elasticsearch バージョンと互換性があることを確認してください。
Elasticsearch クエリ DSL ライブラリのバージョン。Elasticsearch の Python 用クエリ DSL ライブラリを使用している場合は、そのバージョンが Elasticsearch のバージョンと一致していることを確認してください。例えば、次のようになります。
Elasticsearch 8.x の場合は、8.0.0 以降 9.0.0 より前の
elasticsearch-dslバージョンを使用します。Elasticsearch 7.x の場合は、7.0.0 以降 8.0.0 より前の
elasticsearch-dslバージョンを使用します。
クライアントライブラリのバージョン。公式の Elasticsearch クライアントを使用する場合も言語固有のクライアントを使用する場合も、Elasticsearch バージョンと互換性があることを確認してください。
クエリ DSL のバージョン。クエリ DSL は Elasticsearch バージョンとともに進化します。一部のクエリタイプまたはパラメータは、バージョンによって廃止されたり、導入されたりする可能性があります。
マッピングのバージョン。インデックスのマッピングを定義する方法やバージョン間で変更する方法です。特定の Elasticsearch バージョンのマッピングに関するドキュメントを必ず確認してください。
分析ツールのバージョン。アナライザー、トークナイザ、またはその他のテキスト分析ツールを使用している場合、バージョンによって動作や可用性が変わる可能性があります。
アーキテクチャ
ターゲットアーキテクチャ
このパターンのアーキテクチャを以下に図で示します。

各パラメータの意味は次のとおりです。
フューショットプロンプトの例を含むユーザー入力とシステムプロンプト。このプロセスは、自然言語クエリまたはスキーマ生成のリクエストを提供するユーザーから始まります。
Amazon Bedrock 入力は Amazon Bedrock に送信されます。Amazon Bedrock は Claude LLM にアクセスするためのインターフェイスとして機能します。
Claude 3 Sonnet LLM。Amazon Bedrock は、Claude 3 ファミリーの Claude 3 Sonnet LLM を使用して入力を処理します。入力を解釈して、適切な Elasticsearch または OpenSearch クエリ DSL を生成します。スキーマリクエストの場合、Elasticsearch または OpenSearch の合成マッピングを生成します。
クエリ DSL の生成。自然言語クエリの場合、アプリケーションは LLM の出力を受け取り、有効な Elasticsearch または OpenSearch Service のクエリ DSL にフォーマットします。
合成データ生成。また、アプリケーションはスキーマを受け取り、Elasticsearch または OpenSearch の合成データを作成して、テスト用に OpenSearch Serverless コレクションにロードします。
OpenSearch または Elasticsearch。生成されたクエリ DSL は、すべてのインデックスの OpenSearch Serverless コレクションに対してクエリされます。JSON 出力には、OpenSearch Serverless コレクションに存在するデータからの関連データとヒット数が含まれます。
自動化とスケール
このパターンで提供されるコードは、PoC のみを目的として構築されています。次のリストに、ソリューションの自動化とスケーリングをさらに進め、コードを本番環境に移行するための提案を示します。これらの機能拡張は、このパターンの範囲には含まれません。
コンテナ化:
アプリケーションを Docker 化して、さまざまな環境での一貫性を確保します。
Amazon Elastic Container Service (Amazon ECS) や Kubernetes などのコンテナオーケストレーションプラットフォームを使用して、スケーラブルなデプロイを実現します。
サーバーレスアーキテクチャ:
コア機能を AWS Lambda 関数に変換します。
Amazon API Gateway を使用して、自然言語クエリ入力用の RESTful エンドポイントを作成します。
非同期処理:
Amazon Simple Queue Service (Amazon SQS) を実装して、受信クエリをキューに入れます。
を使用して AWS Step Functions 、クエリを処理し、クエリ DSL を生成するワークフローを調整します。
キャッシュ:
プロンプトをキャッシュするメカニズムを実装します。
モニタリングとログ記録:
モニタリングとアラートに Amazon CloudWatch を使用します。
ログ分析に Amazon CloudWatch Logs または Amazon OpenSearch Service を使用して一元的なログ記録を実装します。
セキュリティ強化:
IAM ロールを実装してきめ細かなアクセスコントロールを実現します。
を使用して AWS Secrets Manager 、API キーと認証情報を安全に保存および管理します。
マルチリージョンデプロイ:
レイテンシーとディザスタリカバリを改善する AWS リージョン ために、ソリューションを複数の にデプロイすることを検討してください。
インテリジェントなリクエストルーティングに Amazon Route 53 を使用します。
これらの提案を実装することで、この PoC を堅牢かつスケーラブルで本番環境に対応したソリューションに変換できます。完全なデプロイの前に、各コンポーネントとシステム全体を徹底的にテストすることをお勧めします。
ツール
ツール
Amazon SageMaker AI ノートブック
は、機械学習開発用のフルマネージド型 Jupyter Notebook です。このパターンでは、Amazon SageMaker AI のデータ探索、モデル開発、実験のためのインタラクティブな環境としてノートブックを使用します。ノートブックは、他の SageMaker AI 機能や とシームレスに統合できます AWS のサービス。 「Python
」は汎用のコンピュータプログラミング言語です。このパターンでは、Python をコア言語として使用してソリューションを実装します。 Amazon Bedrock
は、主要な AI スタートアップや Amazon が提供する高パフォーマンスな基盤モデル (FM) を、統合 API を通じて利用できるようにするフルマネージド型サービスです。Amazon Bedrock は、自然言語処理用の LLM へのアクセスを提供します。このパターンでは、Anthropic Claude 3 モデルを使用します。 AWS SDK for Python (Boto3)
は、Amazon Bedrock AWS のサービスを含む Python アプリケーション、ライブラリ、またはスクリプトを と統合するのに役立つソフトウェア開発キットです。 「Amazon OpenSearch Service」は、AWS クラウドにおける OpenSearch クラスターのデプロイ、オペレーション、スケーリングを支援するマネージドサービスです。このパターンでは、クエリ DSL を生成するためのターゲットシステムとして OpenSearch Service を使用します。
コードリポジトリ
このパターンのコードは、GitHub の「Prompt Engineering Text-to-QueryDSL Using Claude 3 Models
ベストプラクティス
このソリューションを使用する場合は、次の点を考慮してください。
Amazon Bedrock にアクセスするための適切な AWS 認証情報とアクセス許可の必要性
AWS のサービス および LLMs の使用に関連する潜在的なコスト
クエリ DSL を理解して、生成されたクエリを検証し、必要に応じて変更することが重要です。
エピック
| タスク | 説明 | 必要なスキル |
|---|---|---|
開発環境を設定します。 | 注記この詳細な手順とコード、およびこのパターンのその他の手順については、GitHub リポジトリ
| Python、pip、AWS SDK |
AWS アクセスを設定します。 | Amazon Bedrock クライアントと SageMaker AI セッションを設定します。後で OpenSearch Serverless コレクションの作成時に使用するために、SageMaker AI 実行ロールの Amazon リソースネーム (ARN) を取得します。 | IAM、AWS CLI、Amazon Bedrock、Amazon SageMaker |
ヘルスアプリのスキーマをロードします。 | 事前定義されたファイルからヘルス投稿とユーザープロファイル用の JSON スキーマを読み取り、解析します。後でプロンプトで使用するためにスキーマを文字列に変換します。 | DevOps エンジニア、AWS 全般、Python、JSON |
| タスク | 説明 | 必要なスキル |
|---|---|---|
LLM ベースのデータジェネレーターを作成します。 | generate_data() 関数を実装して、Claude 3 モデルで Amazon Bedrock Converse API を呼び出します。Sonnet、Sonnet 3.5、および Haiku のモデル ID を設定します。
| Python、Amazon Bedrock API、LLM プロンプト |
合成ヘルス投稿を作成します。 | 特定のメッセージプロンプトとともに generate_data() 関数を使用し、指定されたスキーマに基づいて合成ヘルス投稿エントリを作成します。関数呼び出しは次のようになります。
| Python、JSON |
合成ユーザープロファイルを作成します。 | 特定のメッセージプロンプトとともに generate_data() 関数を使用し、指定されたスキーマに基づいて合成ユーザープロファイルエントリを作成します。これはヘルス投稿の生成に似ていますが、別のプロンプトを使用します。 | Python、JSON |
| タスク | 説明 | 必要なスキル |
|---|---|---|
OpenSearch Serverless コレクションを設定します。 | Boto3 を使用し、適切な暗号化、ネットワーク、アクセスポリシーを指定して OpenSearch Serverless コレクションを作成します。コレクションの作成は次のようになります。
OpenSearch Serverless の詳細については、AWS ドキュメントを参照してください。 | OpenSearch Serverless、IAM |
OpenSearch インデックスを定義します。 | 事前定義されたスキーママッピングに基づいて OpenSearch クライアントを使用して、ヘルス投稿とユーザープロファイルのインデックスを作成します。インデックスの作成は次のようになります。
| OpenSearch、JSON |
OpenSearch にデータをロードします。 | ingest_data() 関数を実行して、合成ヘルス投稿とユーザープロファイルをそれぞれの OpenSearch インデックスに一括挿入します。関数は、
| Python、OpenSearch API、データ一括操作 |
| タスク | 説明 | 必要なスキル |
|---|---|---|
フューショットプロンプトの例を設計します。 | Claude 3 モデルを使用してクエリ生成のフューショットの例を提供し、クエリの例と対応する自然言語の質問を生成します。システムプロンプトには、次の例が含まれます。
| LLM プロンプト、クエリ DSL |
テキストからクエリ DSL へのコンバーターを作成します。 | クエリ生成用のスキーマ、データ、フューショットの例を含むシステムプロンプトを実装します。システムプロンプトを使用して、自然言語クエリをクエリ DSL に変換します。関数呼び出しは次のようになります。
| Python、Amazon Bedrock API、LLM プロンプト |
OpenSearch でクエリ DSL をテストします。 | query_oss() 関数を実行し、生成されたクエリ DSL を OpenSearch Serverless コレクションに対して実行し、結果を返します。関数は OpenSearch クライアントの検索方法を使用します。
| Python、OpenSearch API、クエリ DSL |
| タスク | 説明 | 必要なスキル |
|---|---|---|
テストクエリセットを作成します。 | Claude 3 を使用し、合成データとスキーマに基づいてさまざまなテスト用の質問を生成します。
| LLM プロンプト |
クエリ DSL 変換の精度を評価します。 | OpenSearch に対してクエリを実行し、返された結果の関連性と精度を分析して、生成されたクエリ DSL をテストします。これには、クエリの実行とヒットの検査が含まれます。
| Python、データ分析、クエリ DSL |
Claude 3 モデルをベンチマークします。 | 精度とレイテンシーの観点から、クエリ生成についてさまざまな Claude 3 モデル (Haiku、Sonnet、Sonnet 3.5) のパフォーマンスを比較します。比較するには、generate_data() を呼び出す際に | Python、パフォーマンスベンチマーク |
| タスク | 説明 | 必要なスキル |
|---|---|---|
クリーンアッププロセスを開発します。 | 使用後に OpenSearch Serverless コレクションからすべてのインデックスを削除します。 | Python、AWS SDK、OpenSearch API |
関連リソース
追加情報
IAM ポリシー
このパターンで使用される IAM ロールの APGtext2querydslpolicy ポリシーは次のとおりです。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "bedrock:InvokeModel", "bedrock:InvokeModelWithResponseStream" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::sagemaker-*", "arn:aws:s3:::sagemaker-*/*" ] }, { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:log-group:/aws/sagemaker/*" }, { "Effect": "Allow", "Action": [ "ec2:CreateNetworkInterface", "ec2:DescribeNetworkInterfaces", "ec2:DeleteNetworkInterface" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "aoss:*" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "iam:PassRole", "sagemaker:*" ], "Resource": [ "arn:aws:iam::*:role/*", "*" ], "Condition": { "StringEquals": { "iam:PassedToService": "sagemaker.amazonaws.com" } } }, { "Effect": "Allow", "Action": [ "codecommit:GetBranch", "codecommit:GetCommit", "codecommit:GetRepository", "codecommit:ListBranches", "codecommit:ListRepositories" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "aws-marketplace:Subscribe" ], "Resource": "*", "Condition": { "ForAnyValue:StringEquals": { "aws-marketplace:ProductId": [ "prod-6dw3qvchef7zy", "prod-m5ilt4siql27k", "prod-ozonys2hmmpeu" ] } } }, { "Effect": "Allow", "Action": [ "aws-marketplace:Unsubscribe", "aws-marketplace:ViewSubscriptions" ], "Resource": "*" }, { "Effect": "Allow", "Action": "iam:*", "Resource": "*" } ] }
Anthropic Claude 3 モデルを使用したプロンプト手法
このパターンでは、Claude 3 モデルを使用したテキストからクエリ DSL への変換に関する次のプロンプト手法を説明します。
フューショットプロンプト: フューショットプロンプトは、Amazon Bedrock での Claude 3 モデルのパフォーマンスを向上させる強力な手法です。このアプローチでは、モデルに同様のタスクの実行を求める前に、小数の例を提供して望ましい入出力動作を示します。Amazon Bedrock で Claude 3 モデルを使用すると、特定のフォーマット、推論パターン、またはドメイン知識を必要とするタスクにおいて、フューショットプロンプトが特に効果的になります。この手法を実装するには、通常、サンプルセクションと実際のクエリの 2 つの主要コンポーネントでプロンプトを構成します。セクションの例にはタスクを説明する 1 つ以上の入出力ペアが含まれており、クエリセクションにはレスポンスが必要な新しい入力が表示されます。この方法は、Claude 3 がコンテキストと期待される出力形式を理解するのに役立ちます。多くの場合、より正確で一貫性のあるレスポンスが得られるようになります。
例:
"query": { "bool": { "must": [ {"match": {"post_type": "recipe"}}, {"range": {"likes_count": {"gte": 100}}}, {"exists": {"field": "media_urls"}} ] } } Question: Find all recipe posts that have at least 100 likes and include media URLs.
システムプロンプト: Amazon Bedrock の Claude 3 モデルは、フューショットプロンプトに加えてシステムプロンプトの使用もサポートしています。システムプロンプトでは、特定のユーザー入力を提示する前に、モデルに対して全体的なコンテキスト、指示、またはガイドラインを示すことができます。トーンの設定、モデルのロールの定義、会話全体における制約事項を確立する場合に特に役立ちます。Amazon Bedrock で Claude 3 とともにシステムプロンプトを使用するには、API リクエストの
systemパラメータに含めます。これはユーザーメッセージとは別のものであり、インタラクション全体に適用されます。詳細なシステムプロンプトは、コンテキストの設定やモデルのガイドラインの提供に使用されます。例:
You are an expert query dsl generator. Your task is to take an input question and generate a query dsl to answer the question. Use the schemas and data below to generate the query. Schemas: [schema details] Data: [sample data] Guidelines: - Ensure the generated query adheres to DSL query syntax - Do not create new mappings or other items that aren't included in the provided schemas.構造化された出力: JSON や XML タグ内など、特定の形式で出力を提供するようモデルに指示できます。
例:
Put the query in json tagsプロンプトチェイニング: ノートブックは、生成された合成データを使用して質問の例を作成するなど、ある LLM 呼び出しの出力を別の LLM 呼び出しの入力として使用します。
コンテキストプロビジョニング: スキーマやサンプルデータなどの関連コンテキストがプロンプトに表示されます。
例:
Schemas: [schema details] Data: [sample data]タスク固有のプロンプト: 合成データの生成、質問の例の作成、自然言語クエリからクエリ DSL への変換など、特定のタスクに対して異なるプロンプトが作成されます。
テスト問題生成の例:
Your task is to generate 5 example questions users can ask the health app based on provided schemas and data. Only include the questions generated in the response.