63K Views
May 31, 24
スライド概要
2024年5月31日に開催した「AWSで生成AI入門! LLMの概要からRAG、エージェントまで」セッションの資料です。
生成AIに使われるLLMの基本を説明し、AWSが提供している生成AIサービスであるAmazon Bedrockの使い方を説明します。
APIの使い方に始まり、チャット、ベクトル検索、RAGと段階的に説明し、最終的に「はにわロボット」工場のエージェントを作成する内容になっています。
SFとコンピュータが好き
AWSで生成AI入門! LLMの基本からRAG、Agentまで 2024-05-31 山崎 拓也
自己紹介 • 名前: 山崎 拓也 • 所属: SIer • 仕事: システム開発、インフラ構築、運用など • 好き: 低レイヤ、SF、AWS • その他: 2022, 2023 Japan AWS All Certifications Engineer
アジェンダ • LLMの基本 • RAG、エージェント • Amazon Bedrock • プレイグラウンド、API利用、マルチモーダル • チャット • 似ている文章をベクトル検索で探す • Bedrockを使用したRAG • Knowledge bases for Amazon Bedrock • Agents for Amazon Bedrock • おすすめ学習リソースの紹介
LLMの基本
猫も杓子も生成AI OpenAI GPT https://openai.com/ https://docs.anthropic.com/ja/docs/intro-to-claude https://deepmind.google/technologies/gemini/ Anthropic Claude Google Gemini
中心となっているのがLLMという技術 • LLM • Large Language Modelの略 • 日本語だと、大規模言語モデル
そもそも言語モデルとは • 次に来る言葉を予測するモデルのこと 例 公園 言語モデル で 公園 で 言語モデル 犬 公園 で 犬 言語モデル と 公園 で 犬 と 言語モデル 遊ぶ
LLM(大規模言語モデル)とは • ニューラルネットワークを使った大規模な言語モデル • 何が大規模なのか明確な定義はない 大規模な パラメータ数 大規模な 訓練データ数 大規模な 計算量
(補足)LLMの主流となっているのはTransformerベース • 2017年にGoogleが提案した機械学習モデル • 複雑な文章理解と、並列処理が可能 • 現在のLLMのほとんどがTransformerをベースとしている • GPT(Generative Pre-trained Transformer)
(補足)Transformerの3つの構成 出力 デ コ ー ダ 出力 (ベクトル) 出力 エ ン コ ー ダ デ コ ー ダ 入力 入力 • 要約や翻訳など、 入力に強く関係 する出力を生成 するタスク向き • 文章分類や感情 分析、埋め込み ベクトルの取得 など • 後続するテキス トの生成など • モデル例: T5 • モデル例: BERT エ ン コ ー ダ 入力 (デコーダ の出力) 入力 • モデル例: GPT
大規模化によりモデルの性能が向上する • 一定の規模を越えた際に「創発的能力」を獲得する Emergent Abilities of Large Language Models(https://arxiv.org/pdf/2206.07682) Figure 2
文脈内学習 • LLMへの入力に例を含めることで回答の質を高める • 例: モデルIDを取得する 2253-UA299 モデルID 入力に例を含める 間違い (ハルシネーション) 正解! ハイフンの後ろがモデルIDだと 文脈から学習している
(補足)Chain-of-Thought • LLMへの入力にタスク解決への考え方を示すことで回答の質を 高める 似たような例で 考え方を教える 間違い 6-2+3 = 9? 正解! 6-2+3 = 7
(補足)前ページの補足 • 前ページの例で使っているClaude 3 Haikuは性能が良い(Claude3シリー ズ内では最も低性能だが)ので、システムプロンプトで「1行で答えるこ と」と制限しない場合はChain-of-Thoughtしなくとも正解できる システムプロンプトなし
(補足)プロンプトエンジニアリング • 文脈内学習やChain-of-Thought のようにLLMはプロンプトを 工夫することにより、より複雑なタスクを解けるようになる • 適切なプロンプトはモデルにより異なる(モデルによりトレー ニングのされ方が異なるため) • モデル作成元や、Bedrockがプロンプトエンジニアリングにつ いてのドキュメントを公開している • AWS Bedrock「Prompt engineering guidelines」 https://docs.aws.amazon.com/bedrock/latest/userguide/prompt-engineeringguidelines.html • Anthropic「Prompt engineering」 https://docs.anthropic.com/en/docs/prompt-engineering • Anthropic 「Prompt Library」タスク別プロンプト例を沢山紹介してる https://docs.anthropic.com/ja/prompt-library/library
(補足)大規模な訓練データをどう準備するのか • 大規模な訓練データには、従来の教師あり学習のようなラベル 付けが困難 • 自己教師あり学習 • 訓練データから問題と正解を自分で作って学習する • 例: 訓練データを部分的に隠し、隠した部分を推測する 訓練データ: 「公園で犬と遊ぶ」 公園 ■ 犬と遊ぶ LLM 公園 で 犬と遊ぶ 公園で犬と■■ LLM 公園で犬と 遊ぶ
LLMは文字列をそのまま扱ってるわけではない 1. トークン単位に分割 2. トークンを埋め込みに変換 例 公園で犬と遊ぶ トークン トークン埋め込み 公園で 0.03349, -0.004615, -0.048374, 0.008157, … 犬と -0.012523, -0.008050, 0.009231, 0.010734, … 遊ぶ 0.049233, 0.024759, -0.007907, -0.032917, … LLM
トークン分割の方法 • モデル毎のトークナイザによって異なる • バイト対符号化などの方法がある • GPTのTokenizerでの例 トークン分割 https://platform.openai.com/tokenizer 英語はだいたい単語ごと
埋め込み(embedding) • コンピュータ向けに意味のある数値に変えたもの • LLMの文脈ではだいたいベクトル • 埋め込みによっては距離を類似度として扱える 例 埋め込み 犬 犬 -0.00805057, 0.009231321, 0.010734093, … 猫 猫 -0.03134355, -0.021038823, 0.021754429, … 冷蔵庫 0.006404675, -0.00805057, -0.045512553, … 庫蔵冷
文埋め込み • 文章自体から埋め込みを作成 • 埋め込み作成用の「埋め込みモデル」がある • Amazon Titan Text Embeddings • Cohere Embed 例 公園で犬と遊ぶ [-0.054807376, -0.001945111, 0.034289036, -0.00750503, 0.011980507, -0.026577447, -0.00438941, -0.018865855, -0.023272479, 0.034289036, -0.051226992, -0.0110854115, -0.031534895, 0.029882412, -0.033325087, 0.012737895, -0.03497757, 0.00877882, 0.021482287, -0.0026508593, 0.019003563, 0.035803813, -0.020380633, 0.016937958, -0.060315654, -0.019278977, 0.061968137, 0.059764825, 0.07766673, -0.048472855, 0.00602468, 0.014941206, -0.028367637, -0.043790817, 0.042964574, 0.102453984, 0.041587505, -0.0058181197, 0.040761266, 0.002220525, 0.07876839, 0.018728148, -0.003614808, 0.014046111, 0.0013942831, -0.049849924, 0.041036677, 0.046544958, 0.03139719, 0.019967511, 0.022997065, 0.04048585, -0.00084775855, 0.061968137, -0.0055427058, 0.07876839, 0.020242926, 0.037456296, -0.015698595, -0.040210437, -0.02272165, -0.016249422, -0.045167886, 0.0025475791, 0.004957451, -0.036905468, 0.007883724, 0.008021431, -0.0096394885, 0.007918151, -0.03002012, -0.024374135, 0.015698595, 0.017488785, 0.01363299, 0.032911967, 0.048472855, 0.01321987, -0.039935023, 0.042964574, -0.0065410812, -0.0034598878, 0.0012393628, 0.00034211576, 0.038557954, -0.031534895, 0.02588891, 0.06334521, 0.020518338, -0.0056804125, -0.01680025, 0.0057148393, -0.00055513124, 0.034289036, 0.04874827, -0.08152253, -0.016249422, -0.04819744, -0.049023684, 0.015285474, 0.0022377383, 0.018039614, 0.028505344, -0.045718715, 0.022033116, 0.042138334, 0.0454433, -4.545406e-05, 0.01955439, 0.022859357, 0.009777195, 0.01363299, -0.015698595, -0.041587505, 0.023685599, -0.023961013, 0.037180882, 0.024374135, 0.010878851, -0.028092222, -0.087030806, -0.030570948, -0.033325087, 0.100801505, -0.031534895, -0.039384194, 0.055358205, 0.028780757, -0.022859357, -0.03002012, -0.030984068, -0.0042861295, 0.0005809513, 0.03910878, -0.016524836, 0.02643974, 0.028505344, 0.033875916, 0.03828254, 0.033049673, 0.0454433, -0.0012737896, 0.038557954, 0.025200376, -0.013701844, 0.0078492975, 0.053154893, 0.036905468, -0.019829804, 0.0454433, -0.005198438, 0.018590441, 0.01501006, 0.0177642, 0.032085724, …
LLMへの入力をもう一度見てみる 公園で犬と遊ぶ トークン トークン埋め込み 公園で 0.03349, -0.004615, -0.048374, 0.008157, … 犬と -0.012523, -0.008050, 0.009231, 0.010734, … 遊ぶ 0.049233, 0.024759, -0.007907, -0.032917, … LLM
RAG、エージェント
RAG(Retrieval-Augmented Generation) • LLMが持たない知識を答えさせる • データソースから追加情報を取得し、LLMへの入力に含める 例 入力 1 自社製品Aの材料って何? 2 プログラム 出力 4 製品Aの材料 • 鉄 5kg • ネジ 5本 製品Aの材料は 鉄5kgとネジ5本です。 3 LLM
エージェント • 必要な動作を自分で考えて実行する • APIを叩く、情報を検索する、不足情報を人間に聞き返す、など 入力 昨日っていつ 昨日ミーティングで話して た製品について教えて 出力 昨日ミーティングで出た製 品は〇×です。 それはこんな製品です。 … エージェント LLM 〇月〇日のミー ティングの議事録 昨日っていつ? 製品の説明文は 議事録の中に出て る製品は? どんな製品? API
今回最終的に作るもの
例えば、私は「はにわロボット」工場に入社した 私 はにわロボット
先輩から仕事を頼まれた • 「はにわロボットの材料の在庫はどれくらいある?」 • 資料の場所と、材料の在庫の調べ方だけ教わった はにわロボットの材料の 在庫はどれくらいある? はにわロボット って何? 資料はここにあるから 材料の在庫は材料名で 調べられるから 先輩 私
手順を考えて在庫を調べる • 簡単なタスクでも沢山のことを考えてる 「はにわロボット」の資料はここにある 資料を読んで材料を特定する 在庫を調べるにはこれを使う 材料ごとに在庫を調べる 結果をまとめて先輩に報告する 私
今回はこれと同じことができるエージェントをBedrockで作る 「はにわロボット」の資料はここにある 資料を読んで材料を特定する 在庫を調べるにはこれを使う 材料ごとに在庫を調べる 結果をまとめて先輩に報告する エージェント
作成するエージェントの入出力
Amazon Bedrock
Amazon Bedrockとは • AWSの提供しているフルマネージドな生成AIサービス • 単一のAPIから様々な基盤モデルを使用可能 • Amazon Titan • Anthropic Claude • Cohere Command & Embed • AI21 Labs Jurassic • Meta Llama • Mistral AI Mistral • Stability AI SDXL • 様々な機能を提供 • RAG • エージェント • ガードレール • モデル評価 https://aws.amazon.com/jp/bedrock/
簡単に試してみる前に… • 準備としてBedrockで使用するモデルの有効化が必要
簡単に試してみる • Bedrockのプレイグラウンド機能からモデルを簡単に試せる
プレイグラウンド • チャットでモデルを試せる
(補足)比較モード • 「比較モード」を使うと複数のモデルの比較が行える
(補足)比較モード
(補足)比較モード • スクロールするとレイテンシーやトークン数も比較できる
APIから利用する • 単一のAPIから様々な基盤モデルが使用できる • InvokeModel APIでBedrockのモデルを呼び出せる 最低限必要な引数は2つだけ
モデルIDはBedrockのドキュメントに記載 この値がmodel_id https://docs.aws.amazon.com/bedrock/latest/userguide/model-ids.html
bodyの書き方と例もBedrockのドキュメントに記載 • Anthropic Claudeの例 bodyはこの形で渡す https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-anthropic-claude-messages.html
InvokeModel APIを呼び出してみる • モデルはClaude3 haiku • プロンプトは「はにわについて教えて」 model_id body API呼び出し
モデルからの出力結果 • 入力は「はにわについて教えて」
(補足)Claude3はシステムプロンプトで目的や役割を設定可能 • 「自身満々に答える。語尾は「なのだ」にすること。敬語は絶 対に使わない。ですますは使わない。」 bodyのsystemにシステムプロンプト を設定する
(補足)システムプロンプトを使った際の出力 • 「なのだ」口調で回答してくれている 「教えるなのだ」ではなく 「教えるのだ」となっている
マルチモーダル • Claude3は画像を含む入力にも対応 • 同じようにInvokeModel APIから呼び出せる • 画像はBase64エンコードして渡す プロンプトと一緒に 画像も渡してあげる 書籍の後ろの画像
マルチモーダルな入力に対する出力結果 • 入力は「画像には何が映っていますか?」 • 書籍の情報であることを理解しており、価格やISBNコードを正 確に読み取っている
Amazon Bedrockでチャット
動作イメージ • 質問すると答えてくれる 1回目の やり取り
動作イメージ • 前のやり取りを踏まえた会話ができる 1回目の やり取り 2回目の やり取り
動作イメージ 1回目の やり取り 2回目の やり取り 3回目の やり取り
会話の履歴と役割を毎回モデルに渡す 会話の履歴を渡してあげる (Claude3の例) 役割 発言 https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-anthropic-claude-messages.html
3回目のAPI呼び出しでは、2回目までの会話を全て渡す 入力 1回目の会話 2回目の会話 出力
過去20回分の会話を毎回渡す例 会話履歴を持つ変数 userからの入力を履歴に加える 履歴を入力としてモデルを 呼び出す (ここでは過去20履歴分) モデルからの出力も assistantとして履歴に加える
会話履歴を外に持たせるならDynamoDBに持たせる
似ている文章をベクトル検索で探す
埋め込みの作成にはBedrockの埋め込みモデルを使う 人が白い犬を散歩させている -0.026173, 0.0091941, 0.013757, …
Bedrockでの埋め込みの作成 • InvokeModel APIで呼び出せる model_id body API呼び出し 出力 [-0.028052228, 0.024159813, 0.029662883, -0.01020081, 0.036776606, -0.029662883, -0.016173653, -0.008791488, 0.023488708, 0.019193629, -0.0024998696, 0.027918007, -0.038655702, -0.0031709755, -0.03623972, …, 0.0012331571, 0.02375715, -0.018522523, 0.018925186, 0.0075163865, -7.9693826e-05, 0.053420033, 0.02818645, 0.028052228, 0.03395796, -0.00785194, 0.014831441, 0.05207782, 0.0056037344, -0.053688474]
ベクトルDBとは • ベクトルを保存しておけるデータベース • 類似したベクトルを検索できる • AWSでベクトルDBとして使えるサービス • Amazon OpenSearch Service 2 犬 -0.00805057, 0.009231321, … 3 40% クエリ 応答 猫 10% 冷蔵庫 -0.03134355, -0.021038823, … 0.006404675, -0.00805057, … 1 猫 -0.03134355, -0.021038823, … 冷蔵庫 0.006404675, -0.00805057, …
類似した文章を検索する 1 検索したい文字列 犬を連れた人が歩いている。白い犬だ。 2 類似度61% 3 埋め込みベクトル -0.015502, -0.006543, … クエリ 結果
(補足)OpenSearchへの検索 • OpenSearchのライブラリを使う クライアント作成 検索 上位5件を取得 スコア0.2以上のみ https://opensearch.org/docs/latest/clients/python-low-level/ https://opensearch.org/docs/latest/api-reference/search/ https://opensearch.org/docs/latest/search-plugins/knn/approximate-knn/
Amazon Bedrockを使用したRAG
LLMが絶対に持っていない情報を用意「はにわロボット.txt」 「はにわロボット」ドキュメント # 概要 はにわロボットはあらゆる家事をこなす。 掃除、洗濯、料理、買い出し、雑談など。 # 材料 - 粘土 1kg - ニューロチップ 1個 # 製造方法 1. 粘土ではにわを作る 2. ニューロチップを後頭部に埋め込む 3. 完成 # 注意事項 - 製造には「人工はにわ製造免許」が必要 - 製造したはにわロボットは国に登録する必要がある はにわロボット
RAGではない場合 • 当然LLMは「はにわロボット」の作り方を知らない 粘土もニューロチップもない 作り方も間違ってる …
RAGの場合 • 「はにわロボット.txt」の内容を踏まえた回答をしてくれる 材料も作り方も正しい 他の情報まで教えてくれる
モデル呼び出し前に情報を検索し、プロンプトに含める 1 入力 はにわロボットの作り方を教えて 3 2 RAG プログラム 出力 6 5 4
ユーザーの入力のままでは余計な情報も多く検索精度が落ちる ベクトル検索の精度が上がるような クエリにする必要がある 入力 はにわロボットの作り方を教えて 3 2 RAG プログラム 出力 6 1 5 4
ベクトル検索のクエリ文字列をLLMで生成する クエリ用文字列を生成 「はにわロボット 作り方」 1 入力 はにわロボットの作り方を教えて 2 3 はにわロボット 4 RAG プログラム 出力 7 6 作り方 5
モデル「Command R+」は検索用の文字列が生成可能 • search_queries_onlyオプションをTrueにする 入力 はにわロボットの作り方を教えて 出力 はにわロボット 作り方 検索精度が上がりそうな テキストを生成 model_id body API呼び出し https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-cohere-command-r-plus.html
流れをもう一度見てみる 1 入力 はにわロボットの作り方を教えて 2 4 3 RAG プログラム 出力 7 5 6 ここの入力はどうなるの?
赤文字がプログラム追加部分 「はにわロボット.txt」の内容を そのまま含んでいる 最終的なモデルへの入力 はにわロボットの作り方を教えて 回答には以下のdocumentを参考に して 1 <document> 入力 はにわロボットの作り方を教えて 2 4 3 RAG プログラム 出力 7 6 「はにわロボット」ドキュメント # 概要 はにわロボットはあらゆる家事をこなす。 掃除、洗濯、料理、買い出し、雑談など。 # 材料 - 粘土 1kg 5 - ニューロチップ 1個 # 製造方法 1. 粘土ではにわを作る 2. ニューロチップを後頭部に埋め込む 3. 完成 # 注意事項 - 製造には「人工はにわ製造免許」が必要 - 製造したはにわロボットは国に登録する必要が ある </document>
Knowledge bases for Amazon Bedrock
Knowledge bases for Amazon Bedrockとは • RAGを簡単に構築できるBedrockの機能 https://aws.amazon.com/jp/bedrock/knowledge-bases/
ナレッジをS3へアップロード • 様々なファイルに対応している はにわロボット.txtをアップロード https://docs.aws.amazon.com/bedrock/latest/userguide/knowledge-base-ds.html
ナレッジベースを作成
データソースを設定 はにわロボット.txtのある場所を指定
埋め込みモデルとベクトルDBを選択して完成
完成したらデータソースを同期
ナレッジベースをテスト はにわロボットのことを正しく教えてくれる
(補足)ナレッジベースIDを使ってAPIからも呼び出せる Bedrock-agent-runtimeに変更 retrieve_and_generate()を使う
Agents for Amazon Bedrock
Agents for Amazon Bedrockとは • エージェントを簡単に構築できるBedrockの機能 https://aws.amazon.com/jp/bedrock/agents/
今回作成するエージェント • 以下のことをあらかじめ教える • 「はにわロボット」の情報はナレッジベースから探すこと • 材料の在庫は get_material_stock 関数で取得できること 入力 ナレッジ ベース はにわロボットの材料の在庫はどれ くらいある? 出力 粘土の在庫は5kg、ニューロチップ の在庫は10個あります。 エージェント get_material_stock(材料名) -> 在庫数 材料名を渡すと在庫数を返す関数
エージェントを作る
モデルを選択
どんなエージェントなのかを教える
アクショングループを追加
アクションの作成 Lambda関数を自動作成してくれる
アクションについて教える 何をする関数なのかなど、 エージェントに伝わるように書く 関数の引数 Descriptionで、どんな値を渡すための引数なの かをエージェントに伝わるように書く
アクションで作られたLambda関数を編集する 今回は返り値をハードコード 粘土の場合は5kg、 ニューロチップの場合は10個
ナレッジベースを追加
ナレッジベースの使い方を教えて完成! 今回はRAGのところで作ったナレッジベースを選択 ナレッジベースがどんな情報を含んでいるのかなど をエージェントに伝わるように書く
その場ですぐにテストができる
トレースからエージェントがどう考えたのか確認 • 今回は5ステップで回答を出してる
ステップ1 • 関数呼び出しが必要なこと、それには材料を調べる必要があること を考えてる
ステップ2 • はにわロボットに関する情報を取得してる
ステップ3 • 必要な材料と、次に必要なアクションを整理してる
ステップ4 • 在庫確認アクションを材料ごとに呼び出す
ステップ5
(補足)APIからも呼び出せる • エージェントのエイリアスの作成が必要
まとめ • Amazon Bedrockなら手軽に様々な生成AIが使える • RAGやエージェントも簡単に構築できる • 生成AIをどう活用するか、アイデアが最も重要
おすすめ学習リソースの紹介
ニューラルネットワークと深層学習 • 深層学習(ディープラーニング)の仕組みを丁寧に解説している • 無料で読める https://nnadl-ja.github.io/nnadl_site_ja/index.html
ゼロから作るDeep Learning • ディープラーニングの仕組みを手を動かしながら学べる https://www.oreilly.co.jp/books/9784873117584/
大規模言語モデル入門 • Transformerの仕組みから、LLMの使い方まで詳しく解説され ている • 様々なタスクにおけるモデルのファインチューニングについて も手を動かしながら詳しく学べる https://gihyo.jp/book/2023/978-4-297-13633-8
AWS AI Week For Developers(動画アーカイブ) • AWSが2023年10月に開催したAIイベント • 基本や事例、応用的な内容まで全12のセッション https://youtube.com/playlist?list=PLzWGOASvSx6GpTyGBB6rLapnY9N_xrBKW
F-1 大規模言語モデル (LLM) の進化: GPT 以降の最新動向 • AWS Dev Day 2023 Tokyoのセッション • LLMの進化について過程を丁寧に分かりやすく解説している https://youtu.be/uyTwkZYLqMM
Generative AI Use Cases JP (略称:GenU) • AWS Japanが作成した生成 AI を安全に業務活用するための、 ビジネスユースケース集を備えたアプリケーション実装 • アプリを触りながら実装方法が学べる https://github.com/aws-samples/generative-ai-use-cases-jp
ご清聴ありがとうございました。