はじめに
こんにちは!CBcloudのRyoです
私の所属するCBcloudでは、物流ラストワンマイルの配送プラットフォーム「ピックゴー」を運用しており、荷物を送りたい方、荷物を届けてくれる方を24時間365日、サービスを通してつなげています!
今回は前回投稿したこちらの記事の続きとなります
前記事では少しGASをお見せしただけですが、GASはLambdaを使ってAIからレスポンスを受け取っています
今回はそのLambda編に入る前に、Amazon Bedrcokをどのように使ってAIとやりとりしているかを先に解説していきます
前回のおさらい
前回の記事では機械学習をするAIではなく、使うデータを限定して作るAIをスプレッドシートで使えるようにしたという内容でした
今回は、実際にAIと対話できるサービスを作成し、AIがデータを検索してその情報を基に応答を生成する手法であるRAG(Retrieval-Augmented Generation)を活用しながら、Amazon Bedrockを使う方法について解説します
各用語の説明
RAGについて
RAGについてざっくり説明します
詳しい説明についてはRAGの元となる論文を日本語訳して解説してくれている記事があったので載せておきます
RAGとは質問から関連する外部のデータを引っ張ってきて、それを元にAIが回答を出力するという大規模言語モデル(LLM)を使う手法のことです
RAGを使うことで文章を生成する前に取ってきた情報の中から生成させたりすることで、精度を担保し生成過程も明確になるといった流行の手法です
Amazon Bedrcok
大手AI企業からの高性能な基盤モデルを借りて生成AIアプリケーションを構築ができるフルマネージドサービスです
今回はオンデマンドでモデルをお借りしているので使った分だけ料金がかかる形態になってます
Amazon Bedrock for Knowledge base
前述したRAGをBedrcokを使えるようにする機能です
何ができるの?というのは実装部分で詳しく説明していきます
事前準備
今回使うのは以下になります
- AWS
- Amazon Bedrock及びナレッジベース
- Lambda(別記事で解説)
- S3
- 他IAMやSecretManagerなど
- Vector DBのPinecone
- Google Apps Script(別記事で解説)
AWS
Aamazon S3
先に準備として今回AIに使ってもらう知識ベースを作成してS3に保存しておく必要があります
今回使うデータはtxtファイルのQ&A方式でデータを使用します
{
"document": {
"topic": "ピックゴーについて",
"sections": [
{
"question": ピックゴーとは何ですか?",
"answer": "PickGo(ピックゴー)はCBcloud株式会社が提供する配送プラットフォームです。"
}
]
}
}
上記のような形でテキストファイルと専用のバケットを作成し、ファイルをあげ、S3 URIをメモしておいてください
Aamazon Bedrcok
①使うモデルの申請
Aamazon Bedrcokはリージョンによって使えるモデルが限定されています
今回使うモデルはClaude 3 Sonnetを使用するのでリージョンは米国東部(バージニア北部)のus-east-1で設定を行います
まず初めに使うモデルのリクエスト申請を行います 前述した通りClaude 3 Sonnetを使います
リクエスト申請をしてもモデルに質問しない限り料金は発生しないので心配ありません
他のモデルを使う場合は料金も合わせて確認してください
そして今回はナレッジベースを使用するのでメインの応答して使うAIモデルとは別にEmbeddings用のモデルも同時に申請しておく必要があります
今回はデフォルトの無難Titan Embeddings G1 - Textを使います
2つを選択してリクエストを行ってください
もっと安く使いたい!取り敢えず低予算で試したい!とかであれば料金表を確認しつつ選定してください(ただしモデルによっては日本語全然喋ってくれないなどあるかも)
基本的に申請はClaude 3なら4~5分も掛からず許可されます
②チャットプレイグラウンドで確認してみる
モデルが使えるようになったらサイドバーのチャットからモデルを選んで応答を確認してみます
モデルを選択で先ほどリクエストしたClaude 3 Sonnetを選択します
早速これからAIに命令(プロンプト)していくのですが、その前に設定の長さ(最大長、用は出力文字数)を2000から100ぐらいに設定しておきます
出力の文字が多ければ多いほどお金がかかってしまうので、念の為設定しておくといいでしょう
では試しにプロンプトを入力して実行してみます
無事出力が帰ってきたら成功です
これからナレッジベースの設定を行い、知識をアップデートさせていきます
比較用に今の段階でPickGoについて聞いてみましょう
入力した質問にそれっぽく答えてしまうハルシネーション(幻覚)が発生していますね
100文字制限なので途中で文字が止まってますが、おそらくPick&Goと認識していることからPickとGoで持って移動すると捉えたのでしょう
③ナレッジベースの設定を行う
次にナレッジベースの設定を行います
サイドバーのナレッジベースを選択し、ナレッジベースを作成していきます
作成を始めるとまず初めに名前とロールの設定を行います
ロール関連について後述するので一旦新規で作成しそのまま進めていきます
次にデータソースを指定します ここでは事前準備で作成したS3のURIを入れてください
事前準備で作成したtxtファイル以外にも情報が使えますが、使える拡張機能を予め確認しておくと良いでしょう(最初にtxtではなくjsonを入れて一度失敗しました)
次に埋め込みモデルとベクトルサーバーを設定します
埋め込みモデルというのは、先ほどS3に設定した追加情報データをEmbeddingする為のものです
埋め込みモデルについて説明する前にEmbeddingについて解説します
Embeddingとは私たち認識できる文章(Text)をベクトルに変換することを指します
https://aws.amazon.com/jp/blogs/machine-learning/getting-started-with-amazon-titan-text-embeddings/
なぜベクトルに変換するかというと、わたしたちが普段会話している言語(自然言語)の場合、数値情報ではないためコンピュータにとって扱いが難しいデータです 自然言語をベクトルに変換することで、AIが迅速にデータを見つけられるようになるんですね
例えば大規模なデータセットがある情報やリアルタイムな検索が必要になるシナリオにおいて予め追加情報データをベクトル化しておくことでAIが迅速に必要情報を見つけることができるようになります
そして自然言語(追加情報データ)をベクトル化したデータは、ベクトルサーバーと呼ばれるところに保存します
ベクトルサーバー自体はBedrockとは別で用意しなければならないので、この画面ではベクトル化する為に必要なAIとベクトル化されたデータを保存するDBの2つを設定する必要があるんですね
では文章のベクトル化に使うモデル(通称埋め込みモデル)を選んでいきましょう
①のモデルの申請で行った通りTitan Embeddings G1 - Text v1.2を使います
比較的通常のモデルより安いのはありがたいですね
そしてこのベクトルの次元の1536は覚えておきましょう
あとでベクトルサーバーを設定する際に必要になります
この次元数はそのまんまの意味で、配列の長さになります ベクトル化する際にどれくらいの長さで変換するかは埋め込みモデルによって異なるので注意しましょう
続いてベクトルサーバーを設定します
ここでは作成したベクトルストアを選択にし、Pineconeを選択します
ここで必要な情報を設定する必要があるので、Pineconeの設定をしにいきましょう
Pineconeの設定を行う
Pineconeは前述したベクトルサーバーを貸してくれるサービスで、無料枠として1インデックスまでなら無料で使用できます
必要情報を登録しておきましょう
あとはわかりやすい参考資料があったのでこちらで設定を行い、ベクトル次元数を合わせてインデックスを作成してください
登録と設定が終われば、元のAWSの画面に戻り エンドポイントURL,認証情報シークレットARNを設定しましょう
またメタデータフィールドマッピングのテキストフィールドは、前述したQ&Aが入ります
ここにはそのままtextと入れ、Bedrockマネージドメタデータフィールドもmetadataと入れます
これなんだろう?と私も思ったので調べたんですがどうやらここでメタデータのフィルタリングなるものができるとかどうとか
これについて解説してくれている資料があったので載せておきます(おそらく次のフェーズで触るかも)
項目を入れてそのまま作成を押します
Pineconeに同期する
ナレッジベースを作成しただけだとまだAIはドキュメントを参照することはできません
ナレッジベースの作成ができたら、データソースより最初に作られたデータソースを選択して同期してください
(画像はデータソース5となっていますが気にしないでください)
同期を押して最終同期時間が更新され、無事同期できたら準備完了です
実際にナレッジベースAIを使ってみる
では実際に今追加したナレッジベースを持つAIにPickGoについて聞いてみましょう
画面右サイドバーにナレッジベースのテストが存在しているので、ここで質問を行うことで同期されているかテストできます
質問をすると、無事同期できていたので取り込んだ通りに答えてくれました
ナレッジベースから回答を得た場合、情報のソースが得られるので文面最後の[1]をクリックしてみましょう
取り込んだtxtデータが表示されていたら成功です
終わりに
以上がナレッジベースを使ったAI作成の流れとなります
ナレッジベースを使うことでAIが知らない情報を取り込ませ、ハルシネーションを防ぐことができるので非常に有用な機能ですね
しかし、知らない情報を取り込ませるだけではAIチャット機能としてはまだ足りません
わからない問題を「わからないので有人対応に切り替えますか」と言ったり「もしかしてこちらのことですか」とより人間との対話に近い形で実装していくにはナレッジベースだけでは足りないです
次はこういった返答やAIの役割を設定できる Agents for Amazon Bedrock や、実際にコードで制御を行う LangChain を使ってよりAIをパワーアップさせていきましょう
今回は以上となりますのでそちらの記事も上がり次第合わせてご確認ください!