LoginSignup
1
2

Amazon Kendra + SageMaker JumpStartで生成AI / RAGをとりあえず動かす

Last updated at Posted at 2023-07-23

概要

  • 企業データをベースに、自然文でQAしてくれる検索拡張生成(RAG)のソリューション
  • ChatGPTなど一般的な生成AIの場合、それっぽいけど正しいかわからない、または誤った情報が返されるハルシネーションリスクへの対策例としても注目されている
  • 特に、企業データをベースとした回答生成をより効率的かつコスパ良く実現するために、すべてLLM頼りにせず、セマンティック検索の専用サービス(Amazon Kendra)を組み合わせている

元ネタ

高精度な生成系 AI アプリケーションを Amazon Kendra、LangChain、大規模言語モデルを使って作る

ソリューション概要

Chat形式で質問を投げると、回答と参照文献のリンクを提示してくれるWebアプリ

image.png

構成概要

image.png

  • 主な構成要素
    • Webアプリ : Chat形式のQAインターフェース機能を提供する。Python Webアプリケーション作成用のOSSフレームワークStreamlitで実装。
    • Amazon Kendra : ユーザーからの質問内容をもとにセマンティック検索で、事前に指定した対象ドキュメントをベースにドキュメント抜粋を含む検索結果を返す
    • LLM : Kendraが抽出した回答ドラフトをもとに、生成AIで要約して自然な回答文を作る。LLMの部分はOpenAI APIなど3rd Partyでも良いし、Amazon SageMakerで任意の要約系LLMをデプロイしても良いし、Amazon Bedrock(未GA)でも良い。

とりあえず試す

各構成要素の素材

[1] 環境準備

Cloud9を利用しても良いし、ローカル環境でも良い。
下記はLocal MACの場合。

※注意 : Python 3.9 以降がインストールされていること

必要なものをインストール

# AWS SDK for Python
pip install boto3

# Python Webアプリケーション作成用のOSSフレームワーク
pip install streamlit

# LLMを使用したアプリケーション開発用のOSSフレームワーク
pip install langchain

# OpenAI APIを使うなら(SageMaker JumpStartなら不要)
pip install openai

[2] CFnでKendra環境設定

基本は以下CFnテンプレートを利用して実行するだけ
https://github.com/aws-samples/amazon-kendra-langchain-extensions/blob/main/kendra_retriever_samples/kendra-docs-index.yaml

  • スタックの起動には約 30 分かかり、その後同期してインデックスにデータを取り込むのに約 15 分かかる
  • 検索用のデータソースとしては、lex、kendra、sagemakerの公式ドキュメント(html)をクローリングする

CFnテンプレート抜粋

  #Docs Data Source
  KendraDocsDS:
    Type: 'AWS::Kendra::DataSource'
    Properties: 
      DataSourceConfiguration: 
        WebCrawlerConfiguration:
          UrlInclusionPatterns:
            - '.*https://docs.aws.amazon.com/lex/.*'
            - '.*https://docs.aws.amazon.com/kendra/.*'
            - '.*https://docs.aws.amazon.com/sagemaker/.*'
          Urls:
             SiteMapsConfiguration:
               SiteMaps:
                 - 'https://docs.aws.amazon.com/lex/latest/dg/sitemap.xml'
                 - 'https://docs.aws.amazon.com/kendra/latest/dg/sitemap.xml'
                 - 'https://docs.aws.amazon.com/sagemaker/latest/dg/sitemap.xml'
      IndexId: !GetAtt DocsKendraIndex.Id
      Name: 'KendraDocsDS'
      RoleArn: !GetAtt KendraDSRole.Arn
      Type: 'WEBCRAWLER'

CFnが実行完了したら、出力の AWS Regionと KendraIndexIDをメモしておく。

image.png

[3] SageMaker JumpStartでLLM推論エンドポイントをデプロイ

要約のためのLLMモデルはSageMaker JumpStartで簡単にデプロイできる。

① SageMakerコンソールの JumpStartFoundation models で、今回はFlan T5 XLを検索して選択
image.png

② 次に、モデルの詳細画面で右上の「Studioでノートブックを開く」を選択
image.png

③ 次に、SageMakerStudioでノートブックが立ち上がるので、3. Retrieve Artifacts & Deploy an Endpointの最後まですべて実行(4以降はとりあえず不要)
image.png

④ 実行が完了すると、Flan T5 XLを利用した推論エンドポイントが下記の通りデプロイされる。
エンドポイント名は後で利用するのでメモする。
image.png

[4] Chat Webアプリを立ち上げと最後の仕上げ

基本は下記READMEの通り
https://github.com/aws-samples/amazon-kendra-langchain-extensions/blob/main/kendra_retriever_samples/README.md

環境設定

# Langchain と Amazon Kendra で動作するサンプルのセットをクローン
git clone https://github.com/aws-samples/amazon-kendra-langchain-extensions.git

# ディレクトリ移動
cd amazon-kendra-langchain-extensions/kendra_retriever_samples

# 必要なライブラリインストール(一部は事前準備と重複あり)
pip install -r requirements.txt

# 環境変数設定
export AWS_REGION="対象リージョン 例: us-east-1"
export KENDRA_INDEX_ID="Kendra設定時にCFnで出力されたID"
export FLAN_XL_ENDPOINT="SageMakerでデプロイしたLLMエンドポイントの名前"

StreamlitのWEBアプリ起動

streamlit run app.py flanxl --server.port 8080

こんな感じでブラウザでアプリが立ち上がる

image.png

注意事項

作成したAWSリソースは課金が発生するので、必要に応じて削除すること

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2