AWSで生成AI入門!LLMの基本からRAG、Agentまで

70.6K Views

May 31, 24

スライド概要

2024年5月31日に開催した「AWSで生成AI入門! LLMの概要からRAG、エージェントまで」セッションの資料です。

生成AIに使われるLLMの基本を説明し、AWSが提供している生成AIサービスであるAmazon Bedrockの使い方を説明します。
APIの使い方に始まり、チャット、ベクトル検索、RAGと段階的に説明し、最終的に「はにわロボット」工場のエージェントを作成する内容になっています。

profile-image

SFとコンピュータが好き

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

AWSで生成AI入門! LLMの基本からRAG、Agentまで 2024-05-31 山崎 拓也

2.

自己紹介 • 名前: 山崎 拓也 • 所属: SIer • 仕事: システム開発、インフラ構築、運用など • 好き: 低レイヤ、SF、AWS • その他: 2022, 2023 Japan AWS All Certifications Engineer

3.

アジェンダ • LLMの基本 • RAG、エージェント • Amazon Bedrock • プレイグラウンド、API利用、マルチモーダル • チャット • 似ている文章をベクトル検索で探す • Bedrockを使用したRAG • Knowledge bases for Amazon Bedrock • Agents for Amazon Bedrock • おすすめ学習リソースの紹介

4.

LLMの基本

5.

猫も杓子も生成AI OpenAI GPT https://openai.com/ https://docs.anthropic.com/ja/docs/intro-to-claude https://deepmind.google/technologies/gemini/ Anthropic Claude Google Gemini

6.

中心となっているのがLLMという技術 • LLM • Large Language Modelの略 • 日本語だと、大規模言語モデル

7.

そもそも言語モデルとは • 次に来る言葉を予測するモデルのこと 例 公園 言語モデル で 公園 で 言語モデル 犬 公園 で 犬 言語モデル と 公園 で 犬 と 言語モデル 遊ぶ

8.

LLM(大規模言語モデル)とは • ニューラルネットワークを使った大規模な言語モデル • 何が大規模なのか明確な定義はない 大規模な パラメータ数 大規模な 訓練データ数 大規模な 計算量

9.

(補足)LLMの主流となっているのはTransformerベース • 2017年にGoogleが提案した機械学習モデル • 複雑な文章理解と、並列処理が可能 • 現在のLLMのほとんどがTransformerをベースとしている • GPT(Generative Pre-trained Transformer)

10.

(補足)Transformerの3つの構成 出力 デ コ ー ダ 出力 (ベクトル) 出力 エ ン コ ー ダ デ コ ー ダ 入力 入力 • 要約や翻訳など、 入力に強く関係 する出力を生成 するタスク向き • 文章分類や感情 分析、埋め込み ベクトルの取得 など • 後続するテキス トの生成など • モデル例: T5 • モデル例: BERT エ ン コ ー ダ 入力 (デコーダ の出力) 入力 • モデル例: GPT

11.

大規模化によりモデルの性能が向上する • 一定の規模を越えた際に「創発的能力」を獲得する Emergent Abilities of Large Language Models(https://arxiv.org/pdf/2206.07682) Figure 2

12.

文脈内学習 • LLMへの入力に例を含めることで回答の質を高める • 例: モデルIDを取得する 2253-UA299 モデルID 入力に例を含める 間違い (ハルシネーション) 正解! ハイフンの後ろがモデルIDだと 文脈から学習している

13.

(補足)Chain-of-Thought • LLMへの入力にタスク解決への考え方を示すことで回答の質を 高める 似たような例で 考え方を教える 間違い 6-2+3 = 9? 正解! 6-2+3 = 7

14.

(補足)前ページの補足 • 前ページの例で使っているClaude 3 Haikuは性能が良い(Claude3シリー ズ内では最も低性能だが)ので、システムプロンプトで「1行で答えるこ と」と制限しない場合はChain-of-Thoughtしなくとも正解できる システムプロンプトなし

15.

(補足)プロンプトエンジニアリング • 文脈内学習や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

16.

(補足)大規模な訓練データをどう準備するのか • 大規模な訓練データには、従来の教師あり学習のようなラベル 付けが困難 • 自己教師あり学習 • 訓練データから問題と正解を自分で作って学習する • 例: 訓練データを部分的に隠し、隠した部分を推測する 訓練データ: 「公園で犬と遊ぶ」 公園 ■ 犬と遊ぶ LLM 公園 で 犬と遊ぶ 公園で犬と■■ LLM 公園で犬と 遊ぶ

17.

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

18.

トークン分割の方法 • モデル毎のトークナイザによって異なる • バイト対符号化などの方法がある • GPTのTokenizerでの例 トークン分割 https://platform.openai.com/tokenizer 英語はだいたい単語ごと

19.

埋め込み(embedding) • コンピュータ向けに意味のある数値に変えたもの • LLMの文脈ではだいたいベクトル • 埋め込みによっては距離を類似度として扱える 例 埋め込み 犬 犬 -0.00805057, 0.009231321, 0.010734093, … 猫 猫 -0.03134355, -0.021038823, 0.021754429, … 冷蔵庫 0.006404675, -0.00805057, -0.045512553, … 庫蔵冷

20.

文埋め込み • 文章自体から埋め込みを作成 • 埋め込み作成用の「埋め込みモデル」がある • 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, …

21.

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

22.

RAG、エージェント

23.

RAG(Retrieval-Augmented Generation) • LLMが持たない知識を答えさせる • データソースから追加情報を取得し、LLMへの入力に含める 例 入力 1 自社製品Aの材料って何? 2 プログラム 出力 4 製品Aの材料 • 鉄 5kg • ネジ 5本 製品Aの材料は 鉄5kgとネジ5本です。 3 LLM

24.

エージェント • 必要な動作を自分で考えて実行する • APIを叩く、情報を検索する、不足情報を人間に聞き返す、など 入力 昨日っていつ 昨日ミーティングで話して た製品について教えて 出力 昨日ミーティングで出た製 品は〇×です。 それはこんな製品です。 … エージェント LLM 〇月〇日のミー ティングの議事録 昨日っていつ? 製品の説明文は 議事録の中に出て る製品は? どんな製品? API

25.

今回最終的に作るもの

26.

例えば、私は「はにわロボット」工場に入社した 私 はにわロボット

27.

先輩から仕事を頼まれた • 「はにわロボットの材料の在庫はどれくらいある?」 • 資料の場所と、材料の在庫の調べ方だけ教わった はにわロボットの材料の 在庫はどれくらいある? はにわロボット って何? 資料はここにあるから 材料の在庫は材料名で 調べられるから 先輩 私

28.

手順を考えて在庫を調べる • 簡単なタスクでも沢山のことを考えてる 「はにわロボット」の資料はここにある 資料を読んで材料を特定する 在庫を調べるにはこれを使う 材料ごとに在庫を調べる 結果をまとめて先輩に報告する 私

29.

今回はこれと同じことができるエージェントをBedrockで作る 「はにわロボット」の資料はここにある 資料を読んで材料を特定する 在庫を調べるにはこれを使う 材料ごとに在庫を調べる 結果をまとめて先輩に報告する エージェント

30.

作成するエージェントの入出力

31.

Amazon Bedrock

32.

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/

33.

簡単に試してみる前に… • 準備としてBedrockで使用するモデルの有効化が必要

34.

簡単に試してみる • Bedrockのプレイグラウンド機能からモデルを簡単に試せる

35.

プレイグラウンド • チャットでモデルを試せる

36.

(補足)比較モード • 「比較モード」を使うと複数のモデルの比較が行える

37.

(補足)比較モード

38.

(補足)比較モード • スクロールするとレイテンシーやトークン数も比較できる

39.

APIから利用する • 単一のAPIから様々な基盤モデルが使用できる • InvokeModel APIでBedrockのモデルを呼び出せる 最低限必要な引数は2つだけ

40.

モデルIDはBedrockのドキュメントに記載 この値がmodel_id https://docs.aws.amazon.com/bedrock/latest/userguide/model-ids.html

41.

bodyの書き方と例もBedrockのドキュメントに記載 • Anthropic Claudeの例 bodyはこの形で渡す https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-anthropic-claude-messages.html

42.

InvokeModel APIを呼び出してみる • モデルはClaude3 haiku • プロンプトは「はにわについて教えて」 model_id body API呼び出し

43.

モデルからの出力結果 • 入力は「はにわについて教えて」

44.

(補足)Claude3はシステムプロンプトで目的や役割を設定可能 • 「自身満々に答える。語尾は「なのだ」にすること。敬語は絶 対に使わない。ですますは使わない。」 bodyのsystemにシステムプロンプト を設定する

45.

(補足)システムプロンプトを使った際の出力 • 「なのだ」口調で回答してくれている 「教えるなのだ」ではなく 「教えるのだ」となっている

46.

マルチモーダル • Claude3は画像を含む入力にも対応 • 同じようにInvokeModel APIから呼び出せる • 画像はBase64エンコードして渡す プロンプトと一緒に 画像も渡してあげる 書籍の後ろの画像

47.

マルチモーダルな入力に対する出力結果 • 入力は「画像には何が映っていますか?」 • 書籍の情報であることを理解しており、価格やISBNコードを正 確に読み取っている

48.

Amazon Bedrockでチャット

49.

動作イメージ • 質問すると答えてくれる 1回目の やり取り

50.

動作イメージ • 前のやり取りを踏まえた会話ができる 1回目の やり取り 2回目の やり取り

51.

動作イメージ 1回目の やり取り 2回目の やり取り 3回目の やり取り

52.

会話の履歴と役割を毎回モデルに渡す 会話の履歴を渡してあげる (Claude3の例) 役割 発言 https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-anthropic-claude-messages.html

53.

3回目のAPI呼び出しでは、2回目までの会話を全て渡す 入力 1回目の会話 2回目の会話 出力

54.

過去20回分の会話を毎回渡す例 会話履歴を持つ変数 userからの入力を履歴に加える 履歴を入力としてモデルを 呼び出す (ここでは過去20履歴分) モデルからの出力も assistantとして履歴に加える

55.

会話履歴を外に持たせるならDynamoDBに持たせる

56.

似ている文章をベクトル検索で探す

57.

埋め込みの作成にはBedrockの埋め込みモデルを使う 人が白い犬を散歩させている -0.026173, 0.0091941, 0.013757, …

58.

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]

59.

ベクトル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, …

60.

類似した文章を検索する 1 検索したい文字列 犬を連れた人が歩いている。白い犬だ。 2 類似度61% 3 埋め込みベクトル -0.015502, -0.006543, … クエリ 結果

61.

(補足)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/

62.

Amazon Bedrockを使用したRAG

63.

LLMが絶対に持っていない情報を用意「はにわロボット.txt」 「はにわロボット」ドキュメント # 概要 はにわロボットはあらゆる家事をこなす。 掃除、洗濯、料理、買い出し、雑談など。 # 材料 - 粘土 1kg - ニューロチップ 1個 # 製造方法 1. 粘土ではにわを作る 2. ニューロチップを後頭部に埋め込む 3. 完成 # 注意事項 - 製造には「人工はにわ製造免許」が必要 - 製造したはにわロボットは国に登録する必要がある はにわロボット

64.

RAGではない場合 • 当然LLMは「はにわロボット」の作り方を知らない 粘土もニューロチップもない 作り方も間違ってる …

65.

RAGの場合 • 「はにわロボット.txt」の内容を踏まえた回答をしてくれる 材料も作り方も正しい 他の情報まで教えてくれる

66.

モデル呼び出し前に情報を検索し、プロンプトに含める 1 入力 はにわロボットの作り方を教えて 3 2 RAG プログラム 出力 6 5 4

67.

ユーザーの入力のままでは余計な情報も多く検索精度が落ちる ベクトル検索の精度が上がるような クエリにする必要がある 入力 はにわロボットの作り方を教えて 3 2 RAG プログラム 出力 6 1 5 4

68.

ベクトル検索のクエリ文字列をLLMで生成する クエリ用文字列を生成 「はにわロボット 作り方」 1 入力 はにわロボットの作り方を教えて 2 3 はにわロボット 4 RAG プログラム 出力 7 6 作り方 5

69.

モデル「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

70.

流れをもう一度見てみる 1 入力 はにわロボットの作り方を教えて 2 4 3 RAG プログラム 出力 7 5 6 ここの入力はどうなるの?

71.

赤文字がプログラム追加部分 「はにわロボット.txt」の内容を そのまま含んでいる 最終的なモデルへの入力 はにわロボットの作り方を教えて 回答には以下のdocumentを参考に して 1 <document> 入力 はにわロボットの作り方を教えて 2 4 3 RAG プログラム 出力 7 6 「はにわロボット」ドキュメント # 概要 はにわロボットはあらゆる家事をこなす。 掃除、洗濯、料理、買い出し、雑談など。 # 材料 - 粘土 1kg 5 - ニューロチップ 1個 # 製造方法 1. 粘土ではにわを作る 2. ニューロチップを後頭部に埋め込む 3. 完成 # 注意事項 - 製造には「人工はにわ製造免許」が必要 - 製造したはにわロボットは国に登録する必要が ある </document>

72.

Knowledge bases for Amazon Bedrock

73.

Knowledge bases for Amazon Bedrockとは • RAGを簡単に構築できるBedrockの機能 https://aws.amazon.com/jp/bedrock/knowledge-bases/

74.

ナレッジをS3へアップロード • 様々なファイルに対応している はにわロボット.txtをアップロード https://docs.aws.amazon.com/bedrock/latest/userguide/knowledge-base-ds.html

75.

ナレッジベースを作成

76.

データソースを設定 はにわロボット.txtのある場所を指定

77.

埋め込みモデルとベクトルDBを選択して完成

78.

完成したらデータソースを同期

79.

ナレッジベースをテスト はにわロボットのことを正しく教えてくれる

80.

(補足)ナレッジベースIDを使ってAPIからも呼び出せる Bedrock-agent-runtimeに変更 retrieve_and_generate()を使う

81.

Agents for Amazon Bedrock

82.

Agents for Amazon Bedrockとは • エージェントを簡単に構築できるBedrockの機能 https://aws.amazon.com/jp/bedrock/agents/

83.

今回作成するエージェント • 以下のことをあらかじめ教える • 「はにわロボット」の情報はナレッジベースから探すこと • 材料の在庫は get_material_stock 関数で取得できること 入力 ナレッジ ベース はにわロボットの材料の在庫はどれ くらいある? 出力 粘土の在庫は5kg、ニューロチップ の在庫は10個あります。 エージェント get_material_stock(材料名) -> 在庫数 材料名を渡すと在庫数を返す関数

84.

エージェントを作る

85.

モデルを選択

86.

どんなエージェントなのかを教える

87.

アクショングループを追加

88.

アクションの作成 Lambda関数を自動作成してくれる

89.

アクションについて教える 何をする関数なのかなど、 エージェントに伝わるように書く 関数の引数 Descriptionで、どんな値を渡すための引数なの かをエージェントに伝わるように書く

90.

アクションで作られたLambda関数を編集する 今回は返り値をハードコード 粘土の場合は5kg、 ニューロチップの場合は10個

91.

ナレッジベースを追加

92.

ナレッジベースの使い方を教えて完成! 今回はRAGのところで作ったナレッジベースを選択 ナレッジベースがどんな情報を含んでいるのかなど をエージェントに伝わるように書く

93.

その場ですぐにテストができる

94.

トレースからエージェントがどう考えたのか確認 • 今回は5ステップで回答を出してる

95.

ステップ1 • 関数呼び出しが必要なこと、それには材料を調べる必要があること を考えてる

96.

ステップ2 • はにわロボットに関する情報を取得してる

97.

ステップ3 • 必要な材料と、次に必要なアクションを整理してる

98.

ステップ4 • 在庫確認アクションを材料ごとに呼び出す

99.

ステップ5

100.

(補足)APIからも呼び出せる • エージェントのエイリアスの作成が必要

101.

まとめ • Amazon Bedrockなら手軽に様々な生成AIが使える • RAGやエージェントも簡単に構築できる • 生成AIをどう活用するか、アイデアが最も重要

102.

おすすめ学習リソースの紹介

103.

ニューラルネットワークと深層学習 • 深層学習(ディープラーニング)の仕組みを丁寧に解説している • 無料で読める https://nnadl-ja.github.io/nnadl_site_ja/index.html

104.

ゼロから作るDeep Learning • ディープラーニングの仕組みを手を動かしながら学べる https://www.oreilly.co.jp/books/9784873117584/

105.

大規模言語モデル入門 • Transformerの仕組みから、LLMの使い方まで詳しく解説され ている • 様々なタスクにおけるモデルのファインチューニングについて も手を動かしながら詳しく学べる https://gihyo.jp/book/2023/978-4-297-13633-8

106.

AWS AI Week For Developers(動画アーカイブ) • AWSが2023年10月に開催したAIイベント • 基本や事例、応用的な内容まで全12のセッション https://youtube.com/playlist?list=PLzWGOASvSx6GpTyGBB6rLapnY9N_xrBKW

107.

F-1 大規模言語モデル (LLM) の進化: GPT 以降の最新動向 • AWS Dev Day 2023 Tokyoのセッション • LLMの進化について過程を丁寧に分かりやすく解説している https://youtu.be/uyTwkZYLqMM

108.

Generative AI Use Cases JP (略称:GenU) • AWS Japanが作成した生成 AI を安全に業務活用するための、 ビジネスユースケース集を備えたアプリケーション実装 • アプリを触りながら実装方法が学べる https://github.com/aws-samples/generative-ai-use-cases-jp

109.

ご清聴ありがとうございました。