この AWS ソリューションには、生成 AI のデモンストレーション、具体的には、Amazon RDS for PostgreSQL データベースに質問するための自然言語クエリ (NLQ) の使用が含まれています。このソリューションは、基盤モデルに 3 つのアーキテクチャ オプションを提供します。1. Amazon SageMaker JumpStart、2. Amazon Bedrock、3. OpenAI API。デモのウェブベースのアプリケーションは、AWS Fargate 上の Amazon ECS 上で実行され、LangChain、Streamlit、Chroma、および HuggingFace SentenceTransformers の組み合わせを使用します。アプリケーションはエンドユーザーからの自然言語の質問を受け入れ、関連する SQL クエリおよび Pandas DataFrame 互換の結果セットとともに自然言語の回答を返します。
自然言語クエリ (NLQ) の基盤モデル (FM) の選択は、自然言語の質問を自然言語の回答に正確に変換するアプリケーションの能力において重要な役割を果たします。すべての FM が NLQ を実行できるわけではありません。モデルの選択に加えて、NLQ の精度は、プロンプトの品質、プロンプト テンプレート、コンテキスト内学習 (別名、少数ショット プロンプト) に使用されるラベル付きサンプル クエリ、データベース スキーマに使用される命名規則などの要素にも大きく依存します。 、テーブルと列の両方。
NLQ アプリケーションは、さまざまなオープンソースおよび商用 FM でテストされました。ベースラインとして、OpenAI の Generative Pretrained Transformer GPT-3 および GPT-4 シリーズ モデル ( gpt-3.5-turbo
およびgpt-4
を含む) はすべて、平均値を使用して、単純なものから複雑なものまで幅広い自然言語クエリに対して正確な応答を提供します。コンテキスト内の学習量と最小限の迅速なエンジニアリング。
Amazon Titan Text G1 - Express、 amazon.titan-text-express-v1
Amazon Bedrock から入手可能) もテストされました。このモデルは、モデル固有のプロンプト最適化を使用して、基本的な自然言語クエリに対して正確な応答を提供しました。ただし、このモデルは、より複雑なクエリには応答できませんでした。さらに迅速な最適化により、モデルの精度が向上する可能性があります。
google/flan-t5-xxl
やgoogle/flan-t5-xxl-fp16
(完全モデルの半精度浮動小数点形式 (FP16) バージョン) などのオープンソース モデルは、Amazon SageMaker JumpStart から入手できます。 google/flan-t5
シリーズのモデルは、生成 AI アプリケーションを構築するための一般的な選択肢ですが、NLQ の機能は、新しいオープンソース モデルや商用モデルと比較して制限されています。デモのgoogle/flan-t5-xxl-fp16
は、十分なコンテキスト内学習により、基本的な自然言語クエリに答えることができます。ただし、テスト中に回答を返したり、正しい回答を提供したりすることが失敗することが多く、中程度から複雑なクエリに直面した場合、リソースの枯渇により SageMaker モデルのエンドポイントのタイムアウトが頻繁に発生しました。
このソリューションは、GitHub で入手可能なオープンソース データベース、ニューヨーク近代美術館 (MoMA) コレクションの NLQ に最適化されたコピーを使用します。 MoMA データベースには、121,000 点を超える芸術作品と 15,000 人のアーティストが含まれています。このプロジェクト リポジトリには、Amazon RDS for PostgreSQL データベース インスタンスに簡単にインポートできるパイプ区切りのテキスト ファイルが含まれています。
MoMA データセットを使用すると、さまざまなレベルの複雑さで自然言語の質問をすることができます。
繰り返しになりますが、NLQ アプリケーションが応答を返し、正確な応答を返す能力は、主にモデルの選択に依存します。すべてのモデルが NLQ に対応しているわけではなく、正確な応答を返さないモデルもあります。特定のモデルに対して上記のプロンプトを最適化すると、精度を向上させることができます。
google/flan-t5-xxl-fp16
のml.g5.24xlarge
。 google/flan-t5-xxl-fp16
モデル)。インスタンス タイプの選択については、モデルのドキュメントを参照してください。NlqMainStack
CloudFormation テンプレートをデプロイします。アカウントで Amazon ECS を少なくとも 1 つ使用している必要があることに注意してください。使用しないと、 AWSServiceRoleForECS
サービスにリンクされたロールがまだ存在せず、スタックが失敗します。 NlqMainStack
スタックをデプロイする前に、 AWSServiceRoleForECS
サービスにリンクされたロールを確認してください。このロールは、アカウントに初めて ECS クラスターを作成するときに自動作成されます。nlq-genai:2.0.0-sm
Docker イメージをビルドして新しい Amazon ECR リポジトリにプッシュします。あるいは、オプション 2: Amazon Bedrock またはオプション 3: OpenAI API で使用するnlq-genai:2.0.0-bedrock
またはnlq-genai:2.0.0-oai
Docker イメージをビルドしてプッシュします。nlqapp
ユーザーを MoMA データベースに追加します。NlqSageMakerEndpointStack
CloudFormation テンプレートをデプロイします。NlqEcsSageMakerStack
CloudFormation テンプレートをデプロイします。あるいは、オプション 2: Amazon Bedrock で使用するNlqEcsBedrockStack
CloudFormation テンプレート、またはオプション 3: OpenAI API で使用するNlqEcsOpenAIStack
テンプレートをデプロイします。オプション 1: Amazon SageMaker JumpStart の場合、Amazon SageMaker JumpStart エンドポイント推論に必要な EC2 インスタンスがあることを確認するか、AWS マネジメントコンソールのサービスクォータを使用してリクエストします (例: google/flan-t5-xxl-fp16
のml.g5.24xlarge
)。 google/flan-t5-xxl-fp16
モデル)。インスタンス タイプの選択については、モデルのドキュメントを参照してください。
続行する前に、以下のシークレット値を必ず更新してください。この手順では、NLQ アプリケーションの資格情報のシークレットを作成します。 NLQ アプリケーションのデータベースへのアクセスは読み取り専用に制限されています。オプション 3: OpenAI API の場合、このステップでは OpenAI API キーを保存するためのシークレットを作成します。 Amazon RDS インスタンスのマスターユーザー認証情報は自動的に設定され、 NlqMainStack
CloudFormation テンプレート展開の一部として AWS Secret Manager に保存されます。これらの値は AWS Secret Manager で確認できます。
aws secretsmanager create-secret
--name /nlq/NLQAppUsername
--description " NLQ Application username for MoMA database. "
--secret-string " <your_nlqapp_username> "
aws secretsmanager create-secret
--name /nlq/NLQAppUserPassword
--description " NLQ Application password for MoMA database. "
--secret-string " <your_nlqapp_password> "
# Only for Option 2: OpenAI API/model
aws secretsmanager create-secret
--name /nlq/OpenAIAPIKey
--description " OpenAI API key. "
--secret-string " <your_openai_api_key "
ALB および RDS へのアクセスは、外部から現在の IP アドレスに制限されます。導入後に IP アドレスが変更された場合は、更新する必要があります。
cd cloudformation/
aws cloudformation create-stack
--stack-name NlqMainStack
--template-body file://NlqMainStack.yaml
--capabilities CAPABILITY_NAMED_IAM
--parameters ParameterKey= " MyIpAddress " ,ParameterValue= $( curl -s http://checkip.amazonaws.com/ ) /32
選択したモデル オプションに基づいて、NLQ アプリケーションの Docker イメージを構築します。 Docker イメージは、SageMaker Notebook 環境または AWS Cloud9 を使用して、CI/CD パイプラインでローカルに構築できます。アプリケーションの開発とテスト、および Docker イメージの構築には AWS Cloud9 を好みます。
cd docker/
# Located in the output from the NlqMlStack CloudFormation template
# e.g. 111222333444.dkr.ecr.us-east-1.amazonaws.com/nlq-genai
ECS_REPOSITORY= " <you_ecr_repository> "
aws ecr get-login-password --region us-east-1 |
docker login --username AWS --password-stdin $ECS_REPOSITORY
オプション 1: Amazon SageMaker JumpStart
TAG= " 2.0.0-sm "
docker build -f Dockerfile_SageMaker -t $ECS_REPOSITORY : $TAG .
docker push $ECS_REPOSITORY : $TAG
オプション 2: Amazon Bedrock
TAG= " 2.0.0-bedrock "
docker build -f Dockerfile_Bedrock -t $ECS_REPOSITORY : $TAG .
docker push $ECS_REPOSITORY : $TAG
オプション 3: OpenAI API
TAG= " 2.0.0-oai "
docker build -f Dockerfile_OpenAI -t $ECS_REPOSITORY : $TAG .
docker push $ECS_REPOSITORY : $TAG
5a.好みの PostgreSQL ツールを使用してmoma
データベースに接続します。データベースへの接続方法に応じて、RDS インスタンスのPublic access
一時的に有効にする必要があります。
5b. 2 つの MoMA コレクション テーブルをmoma
データベースに作成します。
CREATE TABLE public .artists
(
artist_id integer NOT NULL ,
full_name character varying ( 200 ),
nationality character varying ( 50 ),
gender character varying ( 25 ),
birth_year integer ,
death_year integer ,
CONSTRAINT artists_pk PRIMARY KEY (artist_id)
)
CREATE TABLE public .artworks
(
artwork_id integer NOT NULL ,
title character varying ( 500 ),
artist_id integer NOT NULL ,
date integer ,
medium character varying ( 250 ),
dimensions text ,
acquisition_date text ,
credit text ,
catalogue character varying ( 250 ),
department character varying ( 250 ),
classification character varying ( 250 ),
object_number text ,
diameter_cm text ,
circumference_cm text ,
height_cm text ,
length_cm text ,
width_cm text ,
depth_cm text ,
weight_kg text ,
durations integer ,
CONSTRAINT artworks_pk PRIMARY KEY (artwork_id)
)
5c. /data
サブディレクトリ内のテキスト ファイルを使用して、2 つのデータ ファイルを解凍し、 moma
データベースにインポートします。どちらのファイルにもヘッダー行とパイプ区切り ('|') が含まれています。
# examples commands from pgAdmin4
--command " "\copy public.artists (artist_id, full_name, nationality, gender, birth_year, death_year) FROM 'moma_public_artists.txt' DELIMITER '|' CSV HEADER QUOTE '"' ESCAPE '''';""
--command " "\copy public.artworks (artwork_id, title, artist_id, date, medium, dimensions, acquisition_date, credit, catalogue, department, classification, object_number, diameter_cm, circumference_cm, height_cm, length_cm, width_cm, depth_cm, weight_kg, durations) FROM 'moma_public_artworks.txt' DELIMITER '|' CSV HEADER QUOTE '"' ESCAPE '''';""
読み取り専用の NLQ アプリケーション データベース ユーザー アカウントを作成します。 SQL スクリプト内の 3 か所のユーザー名とパスワードの値を、上記の手順 2 で構成したシークレットを使用して更新します。
CREATE ROLE < your_nlqapp_username > WITH
LOGIN
NOSUPERUSER
NOCREATEDB
NOCREATEROLE
INHERIT
NOREPLICATION
CONNECTION LIMIT - 1
PASSWORD ' <your_nlqapp_password> ' ;
GRANT
pg_read_all_data
TO
< your_nlqapp_username > ;
オプション 1: Amazon SageMaker JumpStart
cd cloudformation/
aws cloudformation create-stack
--stack-name NlqSageMakerEndpointStack
--template-body file://NlqSageMakerEndpointStack.yaml
--capabilities CAPABILITY_NAMED_IAM
オプション 1: Amazon SageMaker JumpStart
aws cloudformation create-stack
--stack-name NlqEcsSageMakerStack
--template-body file://NlqEcsSageMakerStack.yaml
--capabilities CAPABILITY_NAMED_IAM
オプション 2: Amazon Bedrock
aws cloudformation create-stack
--stack-name NlqEcsBedrockStack
--template-body file://NlqEcsBedrockStack.yaml
--capabilities CAPABILITY_NAMED_IAM
オプション 3: OpenAI API
aws cloudformation create-stack
--stack-name NlqEcsOpenAIStack
--template-body file://NlqEcsOpenAIStack.yaml
--capabilities CAPABILITY_NAMED_IAM
NlqSageMakerEndpointStack.yaml
CloudFormation テンプレート ファイルを使用してデプロイされた、デフォルトのgoogle/flan-t5-xxl-fp16
JumpStart Foundation Model を置き換えることができます。まず、 NlqSageMakerEndpointStack.yaml
ファイル内のモデルパラメータを変更し、デプロイされた CloudFormation スタックNlqSageMakerEndpointStack
を更新する必要があります。さらに、NLQ アプリケーションapp_sagemaker.py
を調整し、選択したモデルの応答ペイロードに一致するようにContentHandler
クラスを変更する必要があります。次に、 Dockerfile_SageMaker
Dockerfile を使用して Amazon ECR Docker イメージを再構築し、バージョンをインクリメントして (例: nlq-genai-2.0.1-sm
、Amazon ECR リポジトリにプッシュします。最後に、 NlqEcsSageMakerStack
CloudFormation スタックの一部である、デプロイされた ECS タスクとサービスを更新する必要があります。
ソリューションのデフォルトの Amazon Titan Text G1 - Express ( amazon.titan-text-express-v1
) 基盤モデルから切り替えるには、 NlqEcsBedrockStack.yaml
CloudFormation テンプレート ファイルを変更して再デプロイする必要があります。さらに、NLQ アプリケーションapp_bedrock.py
を変更する必要があります。次に、 Dockerfile_Bedrock
Dockerfile を使用して Amazon ECR Docker イメージを再構築し、結果のイメージ (例: nlq-genai-2.0.1-bedrock
を Amazon ECR リポジトリにプッシュします。 。最後に、 NlqEcsBedrockStack
CloudFormation スタックの一部である、デプロイされた ECS タスクとサービスを更新する必要があります。
ソリューションのデフォルトの OpenAI API から、Cohere や Anthropic などの別のサードパーティ モデル プロバイダーの API への切り替えも同様に簡単です。 OpenAI のモデルを利用するには、まず OpenAI アカウントを作成し、独自の個人 API キーを取得する必要があります。次に、 Dockerfile_OpenAI
Dockerfile を使用して Amazon ECR Docker イメージを変更および再構築し、結果のイメージ (例: nlq-genai-2.0.1-oai
を Amazon ECR リポジトリにプッシュします。最後に、 NlqEcsOpenAIStack.yaml
CloudFormation テンプレート ファイルを変更して再デプロイします。
詳細については、「貢献」を参照してください。
このライブラリは、MIT-0 ライセンスに基づいてライセンスされています。 LICENSE ファイルを参照してください。