Bedrockをはじめてみよう1

ちょっとお仕事でLLM関連を調べる機会があり、LLMを今更ながらごそごそと。

そもそも本来的にインフラ屋なのでLLMのインフラ関係、となるとふつーはGPGPU環境のサイジングだとか、搭載メモリだとか、コンテナとのGPGPUの接続だとか、TensorFlowのドライバ回りとかそういうかなりハードウェアに寄った話になるわけで、そういった話なら前にもやったんでどうということはない(というほど楽でもない)んですが。

なぜかLangChainの話。うちはアプリ屋ではないのだが…w

LangChainはミドルウェアでもないし、ただのPythonのライブラリです。LLMのAPIを呼び出すためのラッパーフレームワークであり、まあそこにちょこちょこいろんな機能が載ってる感じ。
やりたいことを聞いていると、ほとんどBedrockで済んでしまいそう、というか学習回さないでテキスト推論の結果だけ欲しい、という感じですかね。

まあもしかしたらフロントエンドがReactとかVueで、バックエンドが何もない、とかかもしれません。それだったらなんとなくわからんでもないけど。LLM周りはめっきりPythonだしね。

さて、そんなわけでアプリ屋さんの領域にこんにちわ。Sage MakerはJupiter Notebookがよーわからん、という入口で全速力でコケたので(ただのPythonのIDEだな、というのは後で知った)、速攻見なかったことにしたんですが、BedrockはほぼノーコードでLLMアプリのバックエンド組める、というおもしろさから出た直後にちょっと遊んでました。

そして、今年のRe: Inventを経て、Sage Maker StudioはBedrockStudioになり、なんかもう全力でBedrock育成するぜ、みたいな空気感が漂います。実際、BedrockはLLMの利用、という面を大幅に引き下げていて、あまりの簡単さに正直ビビるレベルです。LLMの難解さをとんでもなくうまくラップし、ブラックボックス化しつつ、利用者の思考をプロンプトエンジニアリングに集中させる、という意味では相当に高レベルなLLMアプリケーションでしょう。

Sage Makerはアホほど機能がありますが、Bedrockはかなりシンプルに仕上がっています。

しかし、Bedrockは世に出てまだ2年、普通にデベロッパーさんに「Bedrockでいいじゃん」とかほざいても「なにそれ?」といわれるのがオチ、というか乗ってくる人はそれなりに先端走ってるメンバーですよね。

LLM、いわゆる大規模言語モデル。ChatGPT-4とかClaude 3とかStable DiffusionとかFMの名前はさかんに取り沙汰されていますが、LLMを使ったアプリ、となると難しそう、とか自分にできるんだろうか、とかなる人も多いんじゃないでしょうか。私もそうです。というかインフラ屋なのでそもそも隣の芝生でしかないため、ふーんへーほーくらいの勢いで見物してただけです。せいぜいCo-Pilotで遊ぶとかしかしてないわけです。結局それってプロンプトで遊んでるだけです。

なので、改めて調べるとなかなかに面白かったわけですねえ。

そこで、まあ「Bedrockってなんだよ」って方々のために、Bedrockを始めましょう。ローカルで遊びたい人はLM Studioでもダウンロードしておけばいいです。メモリたんまり買ってきて128GBにしたらLlama 70Bも動いたけど応答が死ぬほど遅い。笑えるw(笑ってる場合じゃねぇだろ

まあ最初に整理しておきたいのは、LLMってのはなんかのミドルウェアとかそういうものではありません。

ApacheとかみたいにOSにインストールしてーとかそういうものでもありません。

LLM、大規模言語モデル、とは「ソフトウェアのライブラリ」です。Deep Learningをもとにした、ソフトウェアライブラリです。それ単体じゃ何もできません。何かするためには、プログラムが、ライブラリをimportして、関数やクラスを呼び出すことで動作します。

なので、誰がどう見たってこれはアプリ屋さんの領分なんですね。JSがJquery呼び出すのとまったく一緒。まあFMをどうするんだとかいう話もありますが、それも含めてアプリの領域です。インフラ屋さんはたぶんなにも知りません。彼らが知っているのは、Deep Learningを高速で動かすためのGPUのCUDAドライバは何がいいのかとか、その時のバージョンだとCUDAのライブラリは何が必要なんだとか、どのコンテナイメージがいいかとかそんなんです。

これ、レイヤ的にぜんっぜんかぶってないんです。

でもまあ、ほかに頼れないんだよ!って言われると頑張っちゃうしかないじゃないですか。コード書きたくないからできればノーコード/ローコードでやれるBedrockに誘導したい。Bedrockならせいぜい書いてもLambdaですしね。

というわけでBedrockです。

まず、Bedrockってなんなんだよって話ですが、簡単に言ってしまえば、指定されたエンドポイントにAPIでプロンプト渡したら、LLMの処理した結果が返ってくるサービスです。

わぁ、簡単。

プロンプトエンジニアリングのためには、LLMにどんなプロンプト投げたらどんな答えが返ってくるか、というのも何度も繰り返す必要がありますが、そのための環境もデフォルトで用意されています。要するにチャット画面ですが。

認証とか難しいことはそもそもAWSのマネジメントコンソールの中の話なので、マネジメントコンソールにログインしてね、で終わります。余計なこと考えなくてよくて楽ですね。

ついでにAWSのサービスなので、STS経由でロールもらえばフロントエンドしかないアプリでも問題ありません。まあ、これはAWS慣れてないと難しく感じるかもですが。

なので、APIを投げる、受け取る。これが出来れば何も難しいことはありません。APIだってREST APIですし、難しければboto3でもreact sdkでも好きなのつかえばいいわけで、これ以上簡単にならないですよ。boto3難しいって言われたら正直に言って手に負えない。というかそもそもboto3の呼び出しくらいのコードだとCo-Pilotでちゃんとしたコード出てきますしね。

 

なので、まずはBedrockを使ってプロンプトを投げ込み、結果をもらいましょう。

皆様、お手元にAWSアカウントはありますね? おもむろにBedrockを開きます。ごちゃっといろいろ出てきますね。左の下~のほうにある、「モデルアクセス」を選びましょう。BedrockのFM、基礎モデルは初期状態だとほとんどがアクセスできません。Titan Embeddedは使えますが、1024次元のベクトルデータ出力されても一般人は何も楽しくありません。

Titan Text G1 – Express、というのがあるのでとりあえずこれ使いましょう。Claudeがいい人はClaudeでもいいです。ただ、AWSに登録しているクレジットカードには注意してください。信販会社が、できればVISAが安心です。このモデルの請求発生、一応AWS経由なんですが信販に請求するのがどうやらFMの提供元らしく、モデルの提供元によってはJCBとかが通らない場合があります。というか私はそうなりました。ただ、北米でやった時の話なので日本リージョンがどうなのかは知りません。

「モデルアクセスを変更」⇒「Titan Text G1 – Express」を選択、「次へ」です。

なんかうじゃうじゃ出てきますが、気にせず先に進みます。まあ先ほどの件はここに書かれている注意事項のことです。つまり、モデルの利用のためのアクセスは、AWSとの契約ではなく、モデルの提供会社との契約になるよ、というようなことが書かれています。まあ99%の一般人の人はうるせぇ黙れ。くらいしか思わないとは思いますが、大事なことなので気をつけましょう。知らないうちに変な契約を結ばされないように。

「送信」を押せばOKです。モデルの一覧画面に戻され、Titan Text G1 – Expressにアクセスが付与されました、とついていればOKです。

さて、ここからは料金が発生します。

まずこのモデルがちゃんと使えるか見ましょうか。左の列から「プレイグラウンド」へ進みます。上部のModeはChatで。このプレイグラウンド、が要するにチャットのWebアプリ、ということになります。例えばなんかの言語+Python+LangChainでインターフェース作りました、というのがこの画面、ということです。

で、「Chat」はいわゆるメモリ機能、過去の履歴も含めて会話するモード。もう一つの「Single Prompt」は単一プロンプト、ということです。

次に、その下の「モデルを選択」、というところを選択、先ほどアクセスをリクエストしたTitan Text G1 – Expressが選択できるはずです。他のはアクセスリクエストしていないので、グレーアウトのままですね。推論はオンデマンドで。

なお、東京リージョンはこのようにテキストモデルしかまだ使えませんが、北米リージョンではStable Diffusionなどもあるので、プロンプトからの画像作成などもここでテストできます。マルチモーダルなモデルのときにプレイグラウンドでどうするのかはよく知りません。

とりあえずChatなんでなんか聞いてみます。

モデルを選択すると左になんかごちゃっと出てきます。めんどくさいので、基本ほっといていいですが、とりあえず覚えておいてほしいのはTemparatureのパラメータです。温度、と評されるパラメータですが、要するにこれ、AIの回答をどの程度ばらけさせるか、というパラメータに相当します。0がもっともばらけず、1に近づくほどAIの回答は多様性を持ってきます。

とりあえずプロンプト欄になんか書きます。ちなみにTitanはそれなりにバカなので、気を付けてください(なにをだ)。

(私)ここにリンゴが三個、ミカンが二個あります。
(Titan)合計で5つありますね。
(私)リンゴを1個、ミカンを二個たべました。
(Titan)残りは、リンゴが2つ、ミカンが1つです。

はい、ちゃんとメモリ効いてますね。メモリはどんなChatでもそうですが、当然このセッションを終わらせれば終了です。

もうちょっとやってみましょう。

(私)そこに近所のおじさん(81歳)が大根を5本持ってきてくださいました。

(Titan)合計で8本になりました。
(私)最初のりんごは、近所のおばさん(41歳)からいただいたもので、みかんは私の庭でとれたものです。

(Titan)なるほど、りんごは41歳のおばさんから、みかんはあなたの庭でとれたものですね。
(私)おじさんは何歳でしたっけ?
(Titan)81歳です。
(私)庭にみかんの木はありますか?
(Titan)庭にみかんの木はありますか?

なんで最後オウム返し始めてんですかね。バカですね。

ま、もういいでしょう。要するにデータから答えるのは得意だけど、論理的思考力はありません。当たり前ですが。LLMにそんなもんあってたまるか。

さて、そんなBedrockにはいくつかのサブ機能があります。基本機能は先ほどのプレイグラウンドの通り、オンデマンドで任意のFMを用いたリアルタイム推論の実行と結果の返却を、AWS APIで行う、というものです。OpenAI APIではありませんので、OpenAI APIでやりたい人はまあLiteLLMとかを噛ませることになるかと。まあ普通にboto3使えば?と思うんですが。

左にいくつかのオーケストレーション機能が並んでいますね。他システムとの動き、はだいたいここです。ガードレールはいまはとりあえず忘れておきましょう。ざっくり説明します。

  • エージェント
    AIにプロンプトに基づいて何かをやらせたい、というときに利用するものです。AIにEC2削除して。とかほざいて、本番系のEC2をうっかり削除してもらうための機能です、たぶん。来年のやらかしたアドベントに絶対そういうのが入ってくると思います(やらねぇよ)。
    まあ単純に言ってしまえばBedrockのAIから任意にLambdaを呼び出させる仕掛け、ですね。
  • フロー
    単発タスクとかのイベント駆動ならエージェントでいいんですが、フローで処理したい場合もありますよね。というわけで、生成AIを組み込んだフローを視覚的に作れるコーナーです。エージェントとの使い分けとしては、自動で流れ込んでくるデータの仕分けとかですね。いわゆるデータパイプライン、にLLMを組み込める、ということです。左からもらったものをLLMで判断して、右に流す、というやつです。
  • ナレッジベース
    RAGですRAG。RAGってのは検索拡張生成、聞かれたことに対してなんかを検索して調べてきて回答する系のお話しですね。検索対象を用意すると、そこをインデックス化し、ベクトルデータ化して対象を読み込んでおいてくれます。都度検索しているわけじゃあかったかと。検索してほしいならプロンプトでそういえばいいのです。
  • プロンプト管理
    プロンプトエンジニアリングにおいて、最初になんか言う、ってのは結構よくありますね。例えばAIに人格や役割のロールを与えるときとか。そういったプロンプトってリクエスト毎に引き起こすわけですから、毎回アプリがコールするのも面倒です。テンプレート化していっぱい用意しておけばいいよね。というわけで、要するにアレだ、たぶんプリペアードクエリみたいな感じで使えるんじゃね?(使ってない)

こんな感じですね。とりあえず次回はAWS CLIから呼び出してみましょうか。よくお遊びで使われているのはナレッジベースとエージェントでしょう。つかいやすいですし。なんせ、片方はLambda一個書くだけ、もう一方はS3にドキュメント配置するだけです。LLMのめんどくささはどこ行ったのでしょうか。

2月にはBedrock Studioも来るので、もっと利用も楽になってくるかもしれませんので、その前になんとか。記事として一通りまとめておきたいですね。