Amazon Web Services ブログ
Amazon AI サービスを使用して Veeva Vault PromoMats に保存されているアセットを分析してタグ付けする
Veeva Systems は、グローバルなライフサイエンス業界向けのクラウドベースソフトウェアのプロバイダーであり、臨床、規制、品質など、複数の領域に対応する製品を提供しています。Veeva の Vault Platform は、単一のプラットフォームでコンテンツとデータの両方を管理します。これにより、コンテンツ、データ、およびワークフローを使用してエンドツーエンドのプロセスを管理する強力なアプリケーションをデプロイできます。Vault Platform は、ビジネスアプリケーションの迅速な設定と変更によるカスタマイズのほか、他のシステムとのシームレスな統合により、Veeva Vault 機能を拡張し、データを移行し、または処理を自動化することを可能にする、オープンアーキテクチャと包括的な API を提供します。
商業空間におけるそのような製品の 1 つが Veeva Vault PromoMats です。165 を超える国の 400 を超えるライフサイエンス企業が、Veeva Vault PromoMats で商用コンテンツとデジタルアセット管理を行っています。
Veeva Vault PromoMats は、デジタルアセット管理とレビューおよび配信機能を組み合わせ、簡単なレビューと承認に加えて、チャネル全体での自動コンテンツ配信と配信停止を提供し、すべてのデジタル資産と資料の完全な可視性と制御を提供します。Veeva Vault PromoMats は、準拠コンテンツの信頼できる唯一の情報源を提供します。これにより、ローカルの製品マネージャーは、自らが必要とするものにすばやくアクセスし、検索し、見つけることができます。
典型的なデジタルマーケティングチームは、Veeva Vault PromoMats を使用して、世界中の従業員のために、マーケティングアセットを保存、検索、キュレート、レビュー、および配布します。これらのアセットは、電子メール、ウェブページ、画像、動画、オーディオファイルなど、さまざまです。再利用を促進するために、マーケティングチームは通常、グローバルに配された人のチームを使用して、これらのアセットを分析してタグ付けし、簡単に検索できるようにします。この現在のプロセスは、不正確で、一貫性がなく、非効率的なタグ付けの影響を受けやすく、人のチームが特定のアセットを見つけるために貴重な工数を費やすことにつながります。組織は通常、コンテンツを正確かつ簡単に検索できるようにレビュアーのチームを設けます。これにより、コストが増加するだけでなく、チームに付加価値を生まない膨大な作業に集中することを余儀なくさせるため、有能な人員がもたらすことのできる付加価値が減少することになります。
お客様から遡って解決法を考えるとき、これらの手動プロセスを自動化するには、次のことが可能なソリューションが必要です。
- コンテンツタイプ (電子メール、テキスト、画像、メディアファイルなど) を識別する
- コンテンツを区別し、識別されたコンテンツタイプに対応する分類に基づく値の付与を自動化する
- アセットへのタグ付けの自動化を有効にし、これらのアセットを簡単に検索するソリューションを提供する
- タグ付けのための機械学習 (ML) 値などを使用して、継続的に強化する
この投稿では、Amazon AI サービスを使用して、Veeva Vault に格納されているリッチコンテンツを迅速かつ確実に、コスト効率よく、大規模に分析する方法を紹介します。この投稿では、全体的なアーキテクチャ、ソリューションとダッシュボードをデプロイする手順、およびアセットメタデータのタグ付けのユースケースについて説明します。このユースケースの概念実証コードベースの詳細については、GitHub リポジトリをご覧ください。
ソリューションの概要
次の図は、ソリューションのアーキテクチャを示しています。
Veeva Vault API と AVAIPoller
AWS Lambda 関数を使用して、Veeva PromoMats 用に内向きのデータフローを設定します。これにより、Amazon Simple Storage Service (Amazon S3) の更新を取得できます。これらの更新は、必要に応じて、定期的、イベントドリブン、またはバッチとすることができます。AVAIPoller
関数は Veeva 認証を処理し、Amazon CloudWatch の時間ベースのトリガー (5 分ごと) を使用して定期的に Veeva Vault API を呼び出し、データを取り込みます。この頻度は、この投稿で提供されている AWS CloudFormation テンプレートを変更することで変更できます。
AVAIPoller
関数は、最初の実行のためにすべてのデータを取得することから始まります。その後は、前回の実行以降に作成または変更された Veeva Vault アセットを取得します。
この関数は、Amazon S3 に受信アセットを保存し、Amazon Simple Queue Service (Amazon SQS) キューにメッセージを挿入します。Amazon SQS を使用すると、アーキテクチャのプロデューサーセクションとプロセッサセクションが疎結合になり、受信した更新を停止せずにプロセッサセクションに変更をデプロイできます。
2 番目のポーラー関数 (AVAIQueuePoller
) は、頻繁な間隔 (1 分ごと) で SQS キューを読み取り、受信アセットを処理します。受信メッセージのタイプに応じて、ソリューションはさまざまな AWS AI サービスを使用してデータから洞察を引き出します。以下ではいくつかの例を示しています。
- テキストファイル – 関数は、Amazon Comprehend Medical の DetectEntities オペレーションを使用します。これは、ML を使用して、構造化されていないテキストから関連する医療情報を簡単に抽出できる自然言語処理 (NLP) サービスです。このオペレーションは、
Anatomy
、Medical_Condition
、Medication
、Protected_Health_Information
、Test_Treatment_Procedure
などのカテゴリのエンティティを検出します。結果の出力はProtected_Health_Information
でフィルタリングされ、残りの情報は信頼スコアとともにフラット化されて Amazon DynamoDB に挿入されます。この情報は Elasticsearch Kibana クラスターにプロットされます。実際のアプリケーションでは、Amazon Comprehend Medical ICD-10-CM または RxNorm 機能を使用して、検出された情報を医療オントロジーにリンクし、下流のヘルスケアアプリケーションでさらに分析できるようにすることもできます。 - 画像 – 関数は、Amazon Rekognition の DetectLabels メソッドを使用して、受信画像にあるラベルを検出します。これらのラベルは、画像に埋め込まれた豊富な情報を識別するタグとして機能します。Human または Person などのラベルが 80% を超える信頼スコアで検出された場合、コードは DetectFaces メソッドを使用して、目、鼻、口などの主要な顔の特徴を探し、入力画像内の顔を検出します。Amazon Rekognition は、これらすべての情報を関連する信頼スコアとともに提供します。信頼スコアは、フラット化されて DynamoDB テーブルに保存されます。
- 音声録音 – オーディオアセットの場合、コードは Amazon Transcribe の StartTranscriptionJob 非同期メソッドを使用して受信オーディオをテキストに変換し、
TranscriptionJobName
として一意の識別子を渡します。コードでは、音声言語を英語 (米国) と想定していますが、これを変更して Veeva Vault からの情報に関連付けることもできます。コードは GetTranscriptionJob メソッドを呼び出し、ジョブが完了するまで、TranscriptionJobName
と同じ一意の識別子をループで渡します。Amazon Transcribe は S3 バケットで出力ファイルを配信します。これはコードによって読み取られ、削除されます。コードはテキスト処理ワークフロー (前述) を呼び出して、書き起こされた音声からエンティティを抽出します。 - スキャンされた文書 (PDF) –ライフサイエンスアセットの大部分は PDF となっています。これらは、科学雑誌や研究論文から薬物ラベルなど、さまざまです。Amazon Textract は、スキャンされた文書からテキストとデータを自動的に抽出するサービスです。コードは StartDocumentTextDetection メソッドを使用して、非同期ジョブを開始し、文書内のテキストを検出します。コードは、応答で返された
JobId
を使用して、ジョブが完了するまで、ループで GetDocumentTextDetection を呼び出します。出力 JSON 構造には、検出されたテキストの行と単語、およびそれが識別する各要素の信頼スコアが含まれているため、結果の使用方法について十分な情報に基づいて決定できます。コードは JSON 構造を処理してテキストを再作成し、テキスト処理ワークフローを呼び出してテキストからエンティティを抽出します。
DynamoDB テーブルには、処理されたすべてのデータが格納されます。このソリューションでは、DynamoDB Streams と AWS Lambda トリガー (AVAIPopulateES
) を使用して、Elasticsearch Kibana クラスターにデータを入力します。AVAIPopulateES 関数は、DynamoDB テーブルで発生するすべての更新、挿入、削除操作に対してトリガーされ、1 つの対応するレコードを Elasticsearch インデックスに挿入します。これらのレコードは、Kibana を使用して視覚化できます。
このソリューションは、デジタルアセットを処理およびタグ付けし、包括的に検索することを可能にする、サーバーレスの従量課金制のアプローチを提供します。さらに、各管理対象コンポーネントは、複数のアベイラビリティーゾーンにまたがって自動デプロイによって組み込まれた高可用性を有しています。Amazon Elasticsearch Service (Amazon ES) では、3 AZ オプションを選択して、ドメインの可用性を向上させることができます。
前提条件
このチュートリアルには、以下の前提条件が必要です。
- CloudFormation テンプレートを起動するための適切な AWS Identity and Access Management (IAM) のアクセス許可を持つ AWS アカウント
- Veeva Vault PromoMats ドメインの適切なアクセス認証情報
- 前述の資格情報にアクセス可能な PromoMats Vault のデジタルアセット
ソリューションをデプロイする
CloudFormation スタックを利用してソリューションをデプロイします。スタックは、必要なすべてのリソースを作成します。これには、次のものが含まれます。
- 受信アセットを保存する S3 バケット。
- プロデューサー関数 (
AVAIPoller
) とポーラー関数 (AVAIQueuePoller
) の間の疎結合として機能する SQS FIFO キュー。 - Amazon AI サービスの出力を格納する DynamoDB テーブル。
- 分析されたタグを視覚化するための Amazon ES Kibana (ELK) クラスター。
- 必要な Lambda 関数:
- AVAIPoller – 5 分ごとにトリガーされます。Veeva Query Language を使用して Veeva Vault をポーリングし、AWS にアセットを取り込み、メッセージを SQS キューにプッシュするために使用されます。
- AVAIQueuePoller – 1 分ごとにトリガーされます。SQS キューのポーリング、Amazon AI サービスを使用したアセットの処理、DynamoDB テーブルへの入力に使用されます。
- AVAIPopulateES – DynamoDB テーブルで更新、挿入、または削除があるとトリガーされます。DynamoDB から変更をキャプチャし、ELK クラスターに入力するために使用されます。
-
AVAIPoller
およびAVAIQueuePoller
をトリガーする Amazon CloudWatch Events ルール。現在、これらのトリガーは DISABLED 状態です。 - スコープを絞り込んだ方法で AI サービスを操作するために必要な IAM ロールとポリシー。
開始するには、次の手順を実行します。
- IAM ユーザー名とパスワードを使用して AWS マネジメントコンソールにサインインします。
- [スタックの起動] を選択し、新しいタブで開きます。
- [スタックの作成] ページで、[次へ] を選択します。
- [スタックの詳細の指定] ページで、スタックの名前を入力します。
- パラメータの値を入力します。
- [次へ] を選択します。
- [スタックオプションの設定] ページで、すべてをデフォルトのままにして、[次へ] を選択します。
- [確認] ページの [機能と変換] セクションで、3 つのチェックボックスをオンにします。
- [スタックの作成] を選択します。
- スタックの実行が完了するのを待ってください。[イベント] でスタック作成プロセスからのさまざまなイベントを調べることができます。
- スタックの作成が完了したら、[リソース] タブで CloudFormation テンプレートが作成したすべてのリソースを確認できます。
- [出力] タブで、
ESDomainAccessPrincipal
の値をコピーします。
これは、AVAIPopulateES
関数が引き受ける IAM ロールの ARN です。後でそれを使用して、Amazon ES ドメインへのアクセスを設定します。
Amazon ES と Kibana をセットアップする
このセクションでは、Elasticsearch クラスターのセキュリティ保護と、Kibana に安全にアクセスするためのローカルプロキシのインストールについて説明します。
- Amazon ES コンソールで、この例のために作成したドメインを選択します。
- [アクション] で、[アクセスポリシーの変更] を選択します。
- [ドメインアクセスポリシー] で、[カスタムアクセスポリシー] を選択します。
- [アクセスポリシーがクリアされます] のポップアップウィンドウで、[クリアして続行] を選択します。
- 次のページで、Amazon ES ドメインへのアクセスをロックダウンするようにこれらのステートメントを設定します。
- IPv4 アドレスの許可 – 自分の IP アドレス。
- IAM ARN の許可 – 以前コピーした
ESDomainAccessPrincipal
の値。
- [送信] を選択します。これにより、
AVAIPopulateES
関数へのアクセスと、IP アドレスからの Kibana アクセスを許可するアクセスポリシーが作成されます。アクセスポリシーのスコープを絞り込むことについての詳細については、アクセスポリシーの設定を参照してください。 - ドメインのステータスが [
アクティブ
] になるまで待ちます。 - CloudWatch コンソールの [イベント] で、[ルール] を選択します。
CloudFormation テンプレートが作成した 2 つの無効なルールを確認できます。
- 各ルールを選択し、[アクション] メニューから [有効化] を選択してルールを有効にします。
5〜8 分以内にデータが流入し始め、Elasticsearch クラスターにエンティティが作成されます。これで、これらのエンティティを Kibana で視覚化できるようになりました。これを行うには、aws-es-kibana と呼ばれるオープンソースのプロキシを使用します。コンピュータにプロキシをインストールするには、次のコードを入力します。
ドメインエンドポイントは、ESDomainEndPoint
の下の CloudFormation スタックの [出力] タブにあります。次の出力が表示されます。
ビジュアライゼーションを作成して、タグ付けされたコンテンツを分析する
このステップでは、インデックスを設定してビジュアライゼーションを作成します。アセットは AI サービスによって処理されるため、その出力は DynamoDB テーブルに収集されます。テーブルの各行は、インデックス内の 1 つのドキュメントに対応し、Kibana のビジュアライゼーションの作成に使用されます。この投稿では、ESConfig.zip ファイルで再利用可能なアセットを提供しています。
たとえば、AVAI_ES_Entity_Dashboard.ndjson
のアセットを使用して、Kibana でサンプルのビジュアライゼーションを作成します。使用を開始するために、この投稿では事前に構築されたダッシュボードを提供しています。これは、マイニングされたデータのさまざまなディメンションを読みやすい形式で表示するために、さまざまなビジュアライゼーションを使用するものです。
コンピュータ上にフォルダを作成し、その中に .zip ファイルをダウンロードできます。Elasticsearch クラスターと Kibana を設定するには、ファイルを解凍し、次の手順を実行します。
- Kibana ダッシュボードを開くには、Kibana の URL をコピーして、ブラウザのウィンドウに貼り付けます。
- マネジメントコンソールで、[インデックスパターン] を選択します。
- [インデックスパターンの作成] を選択します。
- [インデックスパターン] のテキストボックスに、
avai_index
と入力します。 - [次のステップ] を選択します。
- [タイムフィルタのフィールド名] で、[タイムスタンプ] を選択します。
- [インデックスパターンの作成] を選択します。
Kibana でフィールドと属性の名前を確認でき、ここでいくつかのビジュアライゼーションを構築します。 - マネジメントコンソールで、[保存されたオブジェクト] を選択します。
- [インポート] を選択し、以前にダウンロードして抽出したアーティファクトの下の
AVAI_ES_Entity_Dashboard.ndjson
ファイルに移動します。 - [インポート] を選択します。
一部のインデックスパターンが存在しないことを示すメッセージウィンドウが表示されます。 - 新しいインデックスパターンのドロップダウンメニューから、avai-index を選択します。
- [すべての変更を確認] を選択します。
これにより、インポートされたビジュアライゼーションが新しく作成されたインデックスと関連付けられます。AVAI_Dashboard という新しいダッシュボードが表示されます。 - [ダッシュボード] を選択し、[AVAI_Dashboard] を選択します。
- 別のブラウザのウィンドウで、Veeva ドメインにログインし、いくつかのサンプルデータ (画像、PDF、オーディオファイルなど) を入力します。
抽出されたエンティティから生成されたビジュアライゼーションを含むダッシュボードが表示されます。次のビジュアライゼーションは、アセットから抽出された最も一般的な用語を示す用語クラウドです。
分析されたアセットの総計、分析されたタグの総計、人の顔が含まれるアセットの総計、平均信頼スコアなどのメトリクスを表示する他のビジュアライゼーションがあります。次のスクリーンショットは、以下の事項についてのビジュアライゼーションを示しています。
- オペレーションタイプごとの平均信頼スコア
- オペレーションの数
- 人の顔のアセットの総計
- アセットタイプの分布
- 検出されたタグのタイプごとに分類された日付ヒストグラムのタグの傾向
次のビジュアライゼーションは、顔の感情タイプごとに分類された顔の属性の傾向を示しています。
さまざまなビジュアライゼーションとオプションを試して、独自のビジュアルダッシュボードを構築できます。
クリーンアップ
今後の料金が発生しないように、使用していないリソースを削除します。
まとめ
この投稿では、Amazon AI サービスを使用して Veeva Vault PromoMats (またはその他の Veeva Vault サービス) の機能を拡張し、価値ある情報を迅速かつ簡単に抽出する方法を説明しました。完璧な ML 出力はありませんが、人の行動に非常に近づけた行動をするようにして、チームの労力のかなりの部分を削減するのに役立ちます。この追加のキャパシティーを付加価値を生み出すタスクに用いるとともに、ML ソリューションの出力を確認するために割り当てるキャパシティーを小さくすることができます。このソリューションは、コストを最適化し、タグ付けの一貫性を実現し、既存のアセットの迅速な発見を可能にするのにも役立ちます。
最後に、データの所有権を維持し、コンテンツを処理、保存、ホストできる AWS のサービスを選択できます。AWS は、お客様の同意を得ることなく、いかなる目的においても、コンテンツにアクセスしたり、コンテンツを使用したりすることはなく、マーケティングや広告のための情報を取得するためにお客様のデータを使用することもありません。詳細については、データプライバシーに関するよくある質問を参照してください。
追加の機能拡張により、このソリューションの機能をさらに拡張することもできます。たとえば、この投稿の AI/ML サービスに加えて、Amazon SageMaker を使用して構築されたカスタム ML モデルをアーキテクチャに簡単に追加できます。ループバックメカニズムを構築して、タグを更新して Veeva Vault に返し、アセットの自動タグ付けを有効にすることもできます。これにより、チームはアセットを簡単かつ迅速に検索し、見つけることができるようになります。
このコンテンツは、Veeva Systems によって確認および承認されています。Veeva Vault 関連のその他の質問については、Jade Bezuidenhout 氏 (Veeva Systems 社、プロダクトアライアンス、シニアプロダクトマネージャー) まで jade.bezuidenhout@veeva.com 宛てにお問い合わせください。
著者について
Mayank Thakkar 氏は、AWS のグローバルヘルスケアおよびライフサイエンスチームのシニアソリューションアーキテクトです。サーバーレス、人工知能、機械学習ベースのソリューションの構築を専門としています。AWS において、彼は、グローバルに展開する製薬会社と緊密に連携して、実際の業界の問題の解決に焦点を当てた最先端のソリューションを構築しています。仕事以外では、Mayank 氏は、彼の妻と一緒に、家が火災で消失したり、水浸しになったりしないように対策を講じつつ、2 人の元気でいたずら好きな男の子の Aaryan (6 歳) と Kiaan (4 歳) を育てるのに忙しくしています。