Upgrade to Pro — share decks privately, control downloads, hide ads and more …

4行で始めるBedrock

tsuyoshi
March 13, 2025
5

 4行で始めるBedrock

Bedrockをはじめ LLMの利用者は増加している。ただし、いざ触ってみる開発者は思ったよりも少ない。
エンジンとモデルの違うこと。Bedrockはそのなかでもエンジンを提供し、さまざまな使い方をAWSのリソースやガバナンスの視点で利用できることを解説。また、なぜ推論エンジンがAIとよばれ、このさき開発エンジニアは「ビジネスとして育てる」「ツールとして利用する」について学んでもらう目的で公開しています。

実際に全社規模のカンファレンスで登壇し、実装利用する一歩目を踏み出させるための資料となりました。

tsuyoshi

March 13, 2025
Tweet

Transcript

  1. アジェンダ 目標: 今日学んで〜お母さんに自慢できるレベルに理解する。 1+1の答えが2になるとは限らない 〜ざっくり把握する技術 10単語だけおぼえよう 〜専門用語に溺れない技術 つかんどこうぜ「エンジン」と「モデル」〜違いのわかる漢になる技術 僕らの仕事は 2種類!

    〜未来を作り出す技術 わたくしBedrockつかえます。〜わからないことをわからないと言える技術 ゴールと目標 みなは、Bedrock を使えるなって思えたら おーつきは、そんなの知ってるし って思われたら ゴール:
  2. 生成系AI は、物事を考えて答えてるのではない。 • 基本: 1+1 = 2 は計算してるわけではない • Alexa

    を思い出してみよう • いい感じに 人間と対話してるっぽく「いい感じ」が出てくるしくみ • ググると出てくる 「キーワードの後ろに」 候補いちらんがでてく る おさらい 生成系AI は、「1+1 」を計算しているわけではないようだ。
  3. 生成系 AI は 物事を考えてるわけじゃない 原因は、こいつ ある 先生のせいで1+1=2にならない LLM <おさらい 〜考えてるわけではない生成系〜>

    八 先生 人という字は、ひととひととが ささえあい〜ウンタラカンタラ だから 1+1 は 100 にも 200 にもなるんだYo
  4. 生成系 AI は 物事を考えてるわけじゃない つまりは • LLM に 「1+1」の答えを教えて というと

    圧倒的に世の中にある情報として 「2」 という答えが多いのでおそらくもとめてるのは 「2」と 返した方がいいという処理を予め学習しているデータに影 響されて 「2 です」 となる。 ※計算のことわりを理解してるわけではなく。 「2」という結果を提示しただけ。 ところどころまとめ。質問ある方は 手を挙げて 八 先生
  5. 生成系 AI は 物事を考えてるわけじゃない つまりは • だがたまに前後間の会話プロンプトから 「あ、こいつなんか教育の話とかしてる」 「つまり、教育者の鏡 ある

    八先生すきだろうな」と いう関連付けをおこない 「100 である」 として返答しとくか〜 的なロジックも働く。 (期待と異なるし。何が正しいかはわかってないw) ところどころまとめ。質問ある方は 手を挙げて 八 先生
  6. なんでよ、 Bedrock先生? ある 先生のせいで1+1=2にならない LLM <おさらい 〜考えてるわけではない生成系〜> 八 先生 人という字は、ひととひととが

    ささえあい〜ウンタラカンタラ だから 1+1 は 100 にも 200 にもなるんだYo ある先生 あ る先生 ある先生
  7. おおつき ECHO あれくさ! 開発環境たてて ver567で! らじゃ デプロイ中です なんすか? さんきゅー! ウェイクワード

    (スキルの選択) 発話 (アプリ起動) インテント (関数みたいなもの) [ スロット (変数みたいなもの) アクション (Lambda実行) スマートスピーカーとかAI のapplication! スキルの仕組み スマートスピーカーとかAI のapplication!
  8. 今回はGIT 上にあるデプロイアーカイブを サーバにリリースする AWS 上のLambdaが 起動して 命令を実施 Alexa Skill 言葉を解釈して

    Lambdaを呼び出す デバイスを起動 させる you can see as like as only one system on alexa. but you can manage some patients information into this feature:) SkillKit あれくさ! 開発環境たてて バージョン123で 受け付けました AWS Lambda AWS CloudFormation デプロイ中 今10%できました リリースしました。 VER20180629です 進捗状態は? なんすか? さんきゅー! 実装の流れ
  9. ところどころまとめ。質問ある方は 手を挙げて • 深層学習とか 機械学習ってので 特徴を見出して。 • DBに入れておく (※DBではないですが想像しやすいイメージとしてDBとしています) •

    その数字に近似する 値を検索して • おそらく「これ」だとおもう。 • という結果を返すのが LLM の技術が発達した凄いコト
  10. 10単語だけ覚えて帰ろう 今日はこれだけ 覚える気で 「へー」って聞いてて(後で見返せばいいから) 溺れない単語知識 No ようご おぼえかた 備考 1

    エンジン AWS の Amazon Bedrock と 某Azure OpenAPI GCPは? 2 モデル Claude, GCP Gemini, ChatGPT, stable diffusion アンソロピックは会社名 3 ナレッジ 溜め込んだデータベースみたいなもの すんごい量・範囲に期限が ある 4 パラメータ 生成AIのモデルが使う変数 デカければ処理する時にめ ちゃ処理してくれる 5 トークン 生成AIのモデルが処理する単語的な単位 デカければ処理する時にい っぱい考えてくれる 6 ハルシネーション 幻覚 っていうけど。間違った検索結果 おおつきをググると「教授 です。ヤバい人」って出て くる。 7 RAG 答えを探すときの指針 (検索エンジンとDBに置き換えた仕組みのこと検索でいえばフィルタ) 8 ガードレール 「やらないでほしい」「除外して欲しい」を定義すること。 「これ使ったらダメ!」 っていう提案。 9 プロンプト ユーザ利用者が、入力する 「質問」や「依頼」 細かく、熱意を添えるとい い感じの答え返ってくる 10 温度感 質問や依頼に対する回答を作るための「度合い」 答えの本気度や細かさが変 わるパラメータ 他 グランディング
 と グランディング:(開発の上から下まで包括できるとしたとき)文字を文字に変える。文字を画像に変える → どう活用するかと考えられるのがここ。 
 → API を呼び出せるようになると 自動的に 「成果物をつくれるようになる」未来 → 検索による・拡張できる・生成のための の略語 Retriaval・Augumented・Generation
  11. RAG 溺れそうな単語で 構成するとこうなる 〜WEBアプリケーションの仕組みっぽくみるとわかりやすい〜 もっと簡単に こういう感じの関係と構成 プロンプト エンジン ナレッジ ガードレール

    モデル トークン パラメータ ハルシネーション 生成結果 検索する 温度感と勢い 秘密にしたいこと 生成系 検索処理 検索エンジン やばい結果 息を吐くように嘘をついた結果
  12. エンジン と モデル 単語いっぱい出てくるけど 「生成」が「絵」「音楽」「文章」をつくるという処理なんだね エンジン と モデル をつかんどこうぜ ー

    生成系って生成すること 生成用途\モデル モデル 
Anthoropic製 モデル Amazon製 その他 テキスト Claude Hike Titan Text
G1 Llama 3
by Meta 絵/動画 Claude Sonnet Titan ImageGenerator Stable Diffusion
by stability.ai 音楽 — — Gemini flash
by Google 埋め込み — TitanEmbeddings G1 EmbedMultilingual by Cohere 利用 参考: https://qiita.com/enumura1/items/d7d478509833264a138d 1つのAPIで複数のモデルを扱える 画期的なサービスリソース Azure OpenAI
  13. 僕らのお仕事は 選択肢として2つ • → モデル や エンジンの精度を上げていって 生成できるもの と 精度を向上させるお仕事

    例えば 「漫画から写実物を作れるようになった」と言ってるのはこれ。 LLMのお仕事 と実装は2種類 「土台 :エンジン・モデル」 をつくる 「サービス:成果物」 をつくる • → エンジンとモデルを使って、サービスやアプリケーションを作る たとえば 受け答えのBot とか 映画作るとか プログラム生成くん 「人のお仕事を奪います」 と言ってるのはこれ。
  14. 「葬送のフリーレン」とい うキャラクタを 実写っぽい画像で 生成してださい たとえば、こういう使いかた 様々な顔のCG を覚えて ・・・ ナレッジ StableDIffusionというツールをつかって「作りたいキャラクター」の顔の特徴を指定すると

    ・・・ プロンプト 該当したパーツを集めて画像を生成できるように ・・・ モデル Amazon bedrock を使って取り出したのが こんなのです。 ・・・ エンジン ※2024年9月でもstable diffusionは画像ではなく、テキストを入力にして生成した画像をアウトプットするため。 このサンプルの動画主は漫画画像をインプットしているのではなく、作って欲しいキャラクタの特徴をテキストで入れてそう。 ところどころまとめ。質問ある方は 手を挙げて 参考: https://www.youtube.com/results?search_query=%E3%83%95%E3%83%AA%E3%83%BC%E3%83%AC%E3%83%B3%E3%80%80%E3%83%AA%E3%82%A2%E3%83%AB 解説: [フリーレンをAIで実写化] [フリーレンをAIで実写化]
  15. import json import boto3 def lambda_handler(event, context): bedrock_runtime = boto3.client(service_name='bedrock-runtime',

    region_name='us-east- 1') messages = [{ "role": "user", "content": [ {"type": "text", “text": event.get("message") } ] } ] body = json.dumps( { "anthropic_version": "bedrock-2023-05-31", "max_tokens": 1000, "system": "必ず日本語で答えてください", "messages": messages } ) response = bedrock_runtime.invoke_model(body=body, modelId='anthropic.claude-3-sonnet-20240229-v1:0') response_body = json.loads(response.get('body').read()) return { 'statusCode': 200, 'body': response_body } 頭でっかちになるなまずはさわってみれ • 4行書いたら Bedrock 動くよ Lambda で動かしてみようぜ おれはなにをしたらいいでしょうか Bedrock 呼び出しインスタンス作る やりたい依頼プロンプトと 必要パラメータをセットする モデル 呼び実行する 画面やファイルに書き出す
  16. さわってみようぜ、1分ハンズオン に挑戦だ public boolean isLoaded() { return !postalCodeMap.isEmpty(); } }

    ``` 使用例: ```java public class Main { public static void main(String[] args) { try { PostalCodeUtil postalUtil = PostalCodeUtil.getInstance(); postalUtil.loadData("path/to/your/KEN_ALL.CSV"); System.out.println(postalUtil.getAddress("100-0001")); // 東京都千代田区千代田 System.out.println(postalUtil.getAddress("1500043")); // 東京都渋谷区道玄坂 System.out.println(postalUtil.getAddress("999-9999")); // 住所が見つかりません } catch (IOException e) { e.printStackTrace(); } } } ``` このユーティリティクラスの特徴: 1. シングルトンパターンを使用しているため、アプリケーション全体で一つのインスタンスのみを使用します。 2. `loadData` メソッドで郵政省のCSVファイルを読み込みます。このメソッドは Shift-JIS エンコーディングを使用しています。 3. `getAddress` メソッドで郵便番号から住所を取得できます。ハイフン有りと無しの両方に対応しています。 4. `isLoaded` メソッドでデータが読み込まれているかどうかを確認できます。 5. スレッドセーフな実装になっています。 使用上の注意点: - CSVファイルのパスを正確に指定する必要があります。 - 大量のデータを扱うため、メモリ使用量に注意してください。必要に応じて、データベースを使用するなどの最適化を検討してください。 - CSVファイルの構造が変更された場合、`loadData` メソッドの実装を修正する必要があります。 - 初回の `loadData` 呼び出しには時間がかかる可能性があります。アプリケーションの起動時に読み込むことを推奨します。 このユーティリティクラスを使用することで、アプリケーション内で簡単に郵便番号から住所を取得できます。必要に応じて、エラーハンドリング やロギングを追加することをお勧めします。 結果 承知しました。郵政省(日本郵便)から配布されるCSVファイルを利用して、郵便番号から住所を取得するJavaのユーティリティクラスを作成しま す。以下のクラスは、シングルトンパターンを使用し、効率的なデータ読み込みと検索を行います。 ```java import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.Charset; import java.util.HashMap; import java.util.Map; public class PostalCodeUtil { private static PostalCodeUtil instance; private Map<String, String> postalCodeMap; private PostalCodeUtil() { postalCodeMap = new HashMap<>(); } public static synchronized PostalCodeUtil getInstance() { if (instance == null) { instance = new PostalCodeUtil(); } return instance; } public void loadData(String csvFilePath) throws IOException { try (BufferedReader br = new BufferedReader( new InputStreamReader(new FileInputStream(csvFilePath), Charset.forName("SJIS")))) { String line; while ((line = br.readLine()) != null) { String[] data = line.split(","); if (data.length >= 9) { String postalCode = data[2].replace("\"", ""); String prefecture = data[6].replace("\"", ""); String city = data[7].replace("\"", ""); String town = data[8].replace("\"", ""); String address = prefecture + city + town; postalCodeMap.put(postalCode, address); } } } } public String getAddress(String postalCode) { String normalizedPostalCode = postalCode.replace("-", ""); return postalCodeMap.getOrDefault(normalizedPostalCode, "住所が見つかりません"); } アプリの気持ち
  17. さわってみようぜ、1分ハンズオン に挑戦だ 結果 以下は、AWS Well-Architected Frameworkに基づいて設計された、ALBの下にECSがあり、それがマルチAZ構成のRDSにアクセスする構成の CloudFormationテンプレートです。セキュリティを考慮した設計になっています。 ```yaml AWSTemplateFormatVersion: '2010-09-09'

    Description: 'ECS cluster with ALB and Multi-AZ RDS' Parameters: VpcCIDR: Type: String Default: 10.0.0.0/16 PublicSubnet1CIDR: Type: String Default: 10.0.1.0/24 PublicSubnet2CIDR: Type: String Default: 10.0.2.0/24 PrivateSubnet1CIDR: Type: String Default: 10.0.3.0/24 PrivateSubnet2CIDR: Type: String Default: 10.0.4.0/24 DBName: Type: String Default: mydb DBUsername: Type: String DBPassword: Type: String NoEcho: true Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: !Ref VpcCIDR EnableDnsHostnames: true EnableDnsSupport: true InstanceTenancy: default Tags: - Key: Name Value: MyVPC InternetGateway: Type: AWS::EC2::InternetGateway InternetGatewayAttachment: Type: AWS::EC2::VPCGatewayAttachment Properties: InternetGatewayId: !Ref InternetGateway VpcId: !Ref VPC PublicSubnet1: Type: AWS::EC2::Subnet Properties: VpcId: !Ref VPC AvailabilityZone: !Select [ 0, !GetAZs '' ] CidrBlock: !Ref PublicSubnet1CIDR MapPublicIpOnLaunch: true Tags: - Key: Name Value: Public Subnet 1 PublicSubnet2: Type: AWS::EC2::Subnet Properties: VpcId: !Ref VPC AvailabilityZone: !Select [ 1, !GetAZs '' ] CidrBlock: !Ref PublicSubnet2CIDR MapPublicIpOnLaunch: true Tags: - Key: Name Value: Public Subnet 2 PrivateSubnet1: Type: AWS::EC2::Subnet Properties: VpcId: !Ref VPC AvailabilityZone: !Select [ 0, !GetAZs '' ] CidrBlock: !Ref PrivateSubnet1CIDR MapPublicIpOnLaunch: false Tags: - Key: Name Value: Private Subnet 1 PrivateSubnet2: Type: AWS::EC2::Subnet Properties: VpcId: !Ref VPC AvailabilityZone: !Select [ 1, !GetAZs '' ] CidrBlock: !Ref PrivateSubnet2CIDR MapPublicIpOnLaunch: false Tags: - Key: Name Value: Private Subnet 2 PublicRouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref VPC Tags: - Key: Name Value: Public Route Table DefaultPublicRoute: Type: AWS::EC2::Route DependsOn: InternetGatewayAttachment Properties: RouteTableId: !Ref PublicRouteTable DestinationCidrBlock: 0.0.0.0/0 GatewayId: !Ref InternetGateway PublicSubnet1RouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: RouteTableId: !Ref PublicRouteTable SubnetId: !Ref PublicSubnet1 PublicSubnet2RouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: RouteTableId: !Ref PublicRouteTable SubnetId: !Ref PublicSubnet2 NatGateway1EIP: Type: AWS::EC2::EIP DependsOn: InternetGatewayAttachment Properties: Domain: vpc NatGateway2EIP: Type: AWS::EC2::EIP DependsOn: InternetGatewayAttachment Properties: Domain: vpc NatGateway1: Type: AWS::EC2::NatGateway Properties: AllocationId: !GetAtt NatGateway1EIP.AllocationId SubnetId: !Ref PublicSubnet1 NatGateway2: Type: AWS::EC2::NatGateway Properties: AllocationId: !GetAtt NatGateway2EIP.AllocationId SubnetId: !Ref PublicSubnet2 PrivateRouteTable1: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref VPC Tags: - Key: Name Value: Private Route Table 1 DefaultPrivateRoute1: Type: AWS::EC2::Route Properties: RouteTableId: !Ref PrivateRouteTable1 DestinationCidrBlock: 0.0.0.0/0 NatGatewayId: !Ref NatGateway1 PrivateSubnet1RouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: RouteTableId: !Ref PrivateRouteTable1 SubnetId: !Ref PrivateSubnet1 PrivateRouteTable2: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref VPC Tags: - Key: Name Value: Private Route Table 2 DefaultPrivateRoute2: Type: AWS::EC2::Route Properties: RouteTableId: !Ref PrivateRouteTable2 DestinationCidrBlock: 0.0.0.0/0 NatGatewayId: !Ref NatGateway2 PrivateSubnet2RouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: RouteTableId: !Ref PrivateRouteTable2 SubnetId: !Ref PrivateSubnet2 ALBSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Security group for ALB VpcId: !Ref VPC SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 0.0.0.0/0 Tags: - Key: Name Value: ALB Security Group ECSSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Security group for ECS tasks VpcId: !Ref VPC SecurityGroupIngress: - IpProtocol: tcp FromPort: 0 ToPort: 65535 インフラの気持ち
  18. 入門作業の仕方は以下: さわってみようぜ、1分ハンズオン に挑戦だ 1. AWSマネージメントコンソール開く 2. Amazon Bedrockをひらく → 利用するモデルの申請をする

    3. API Gateway をつくる(ブラウザからアクセスさせるため) 4. Lambdaをひらく →普通の関数を作る (bedrock 4行で動かすよ) →Bedrock 呼び出しコード書く 5.(応用編:S3に回答の音声を配置するための S3を作成する) 6. 「俺の望みが聞こえて」 感動する & カイゼンする
  19. おすすめ、はこうやって開発してみる ところどころまとめ。質問ある方は 手を挙げて できたら ・Bedrock 呼び出す invoke model と prompt

    をいじる ・・・ そうかなるほど となって edrock あたりいじる、もしくは 戻りデータに対して フィルタの修正処理を更新するプログラム書く。 ・・・ この時間はちょっと 次に なるほど、この辺りまでは基本的にはできるのね。 でもちょっと完璧なものではないな とおもったところで ・RAG やプロンプトチューニングに 時間の工数を割り当てる(ここは コスト予算やスケジュール富合わせる) が 100%にまだならなくて、世の中のLLM研究者たちが精度を上げて離たり、Claude新しいの出たんだって!ってワクワクするポイン
  20. まとめ 目標とゴール: 今日学んで帰って欲しいこと 〜帰ってお母さんに自慢できること 〜 生成系AI の AI とか LLMは

    極端に言えば「検索・予測の賜物」から「作成し たいものを紐付けて作ることができる仕組み」 エンジン:Bedrockやモデルをつかって、僕らでも普段のAWS開発ができるレベル でシステムを構成できる 入門レベルから はじめても 擁護に溺れなければなんてことはない ただし 精度を上げる。100点の回答を求める場合は それなりに 僕らSIerは検討考慮と改善活動が必要となる。
  21. カモン!Bedrock Amazon Bedrock 生成AIアプリ開発入門 [AWS深掘りガイド] 単行本(ソフトカバー) – 2024/6/26 御田 稔

    (著), 熊田 寛 (著), 森田 和明 (著) https://aws.amazon.com/jp/bedrock/ https://skillbuilder.aws/jp ためになった参考文献とまなぶサイト