この記事は、以下のように構成されているシリーズの1番目の記事になります。合わせてご参考ください。
- 今さら聞けない、Amazon Bedrock と LangChain を使った簡単テキスト生成 AI 入門 (Python)
- 今さら聞けない、Amazon Bedrock と LangChain を使った簡単 RAG 入門 (Python)
Amazon Bedrock とは?
生成 AI の実習として OpenAI などを利用する場合、別途アカウントおよび支払方法の登録が必要になりますが、AWS アカウントをお持ちであれば、別途登録の過程を省略できすぐに試すことが可能です。利用料金についてもローカル環境からの練習で利用する量ですと気になる金額にはなりにくいので、比較的安心して試すことができます。
Amazon Bedrock は、生成 AI モデル(製品)に対して、AWS のコンソールまたは API からアクセスでき、利用料金も AWS の料金として支払われるサービスになります。個別の生成 AI モデルごとにアカウント登録せずとも、AWS SDK などを通じて生成 AI モデルに質問を入力し、回答を返信してもらうことが可能です。Amazon Bedrock で利用できる生成 AI モデルは、テキストのみならず画像生成のモデルも含まれています。
Amazon Bedrock の料金についてはこちら(https://aws.amazon.com/jp/bedrock/pricing/)で確認できますが、利用するモデルごとに単位や金額感が様々ですので、取り急ぎ、広く一般的に使われていて性能も良いことから好評の、Anthropic 社の「Claude」 シリーズがおすすめです。この記事でも利用する「Claude 3.5 Sonnet」の場合、入・出力トークン 1000 個当たり $0.003, $0.015 となっており、従量課金ですので、練習目的で少し利用する程度であればほぼ有意味な金額にはなりません。
1000 個のトークンがどれぐらいの量なのかについては、こちら(https://huggingface.co/spaces/Xenova/the-tokenizer-playground)でドロップダウンメニューから「Claude」を選択し、想定している質問・回答の内容を日本語で入力してみてください。このトークン消費量は使い方やプロンプト(AI に出す指示内容)、処理内容によって変動しますが、練習では 1トークンあたり 1-2 文字 程度の感覚とみていただければよろしいかと思います。実務では、消費したトークン数をログに出したり、集計してモニタリングすることも行われています。
LangChain とは?
現在、様々な種類の生成 AI モデルが出ており、さまざまな周辺ソフトウェアと連動したテクニックが登場してきています。また、各生成 AI モデルが持つ特性や得意・不得意といった性質もあることから、生成 AI をめぐる周辺環境は日々複雑化していることが現状です。
これらの使い方を一つ一つ個別に覚えていくのはかなり大変ですので、主要なテクニックや機能をお手軽に実装できるよう、高い抽象度合いでインターフェースを提供してくれるフレームワークが LangChain です。非常に少ないコードで、例えば以下のような機能を比較的お手軽に実現できるイメージになります。
- 生成 AI モデルを切り替えながら複数の回答を生成する
- 予め用意した資料の内容を基に回答を生成する(一般的に RAG と言われる、検索拡張生成)
- 予め用意した資料から回答が生成できない、もしくは答えが分からない場合、AI自らウェブ検索して補足情報を見つけて回答を生成する
- チャットのような対話形式の実装テンプレートが提供され、メッセージ履歴が反映された生成を行う
- おすすめのプロンプトテンプレートを提供
- その他、回答を生成するために外部資料や WebAPI を呼び出すなど、必要に応じて回答を生成するためのアクションを行う
このように、LangChain の使い方をどれほど理解しているかによって、実装力やできることがかなり変わってきますので、生成 AI を直接扱うより LangChain を経由して利用する方法がおすすめです。本記事では、まずは入門される方向けに、最も基本的な使い方を紹介いたします。
LangChain は Python または JavaScript/TypeScript で書くことができますが、この記事では Python を使って説明します。
作りたいこと
とてもシンプルな形の、以下のような受け答えを再現します。生成 AI モデルは「質問」の入力内容に対して、「回答」を自動生成します。
質問:東京スカイツリーの高さは何メートルですか?
回答:東京スカイツリーの高さは634メートルです。
プロジェクト環境のセットアップ
それでは、ローカル環境を作って試していきます。まずは以下 3点が揃っているか確認して、できていない部分があれば対応しておきます。
確認事項① python / pip のバージョン
# 3.11 以上を推奨します。
$ python --version
Python 3.11.4
$ pip --version
pip 24.0 from /home/ec2-user/.pyenv/versions/3.11.4/lib/python3.11/site-packages/pip (python 3.11)
確認事項② AWS を利用するための環境設定
認証情報がちゃんとセットされているかどうかを確認するために AWS CLI v2 を利用しますので、合わせて確認しておきます。
$ aws --version
aws-cli/2.15.53 Python/3.11.8 ...
# 現在セットされている AWS 認証情報を把握できます。見つからない場合やエラーの際は、認証情報がちゃんとセットされているかどうかを確認してください。
$ aws get-caller-identity
{
"UserId": "...",
"Account": "111122223333",
"Arn": "arn:aws:sts::111122223333:role/sample_role_name"
}
# Missing credentials など未設定によるエラーが発生する合、以下を参考に AWS 認証情報をセットしてください。
# https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-envvars.html
#
# AWS CLI のインストールはこちらをご参考ください。
# https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html
環境確認③ Bedrock で利用するモデルのアクセス申請を行う
Bedrock で利用する生成 AI モデルは事前に有効化しておく必要があります。AWS マネジメントコンソールにログインし、Bedrock 画面メニュー左下の「Model Access」から、以下のように「Claude 3.5 Sonnet」が有効化状態であることを確認します。東京リージョン(ap-northeast-1)、N. Virginia リージョン(us-east-1)、Oregon リージョン(us-west-2)で利用可能です。
もし、「Available to request」状態の場合、「Modify model access」ボタンを押して以下のように有効化します。
この記事の投稿時点では、ほぼ待つことなくすぐに利用できるようになります。ちなみに、「Claude 3.5 Sonnet」および「Claude 3 Sonnet」は、生成速度と回答の質のバランスが取れた性能を持っています。一方、Oregon リージョン(us-west-2)のみ利用可能な 「Claude 3 Opus」は最も回答の質がよく優秀ですが、生成時間は長い方です。「Claude 3 Haiku」の場合、他より生成速度が速いため、回答の表現力よりも速度重視の場合おすすめです。
それぞれ用途に合わせて使い分けるのも生成 AI を活用した開発のポイントになってきます。
簡単な Q&A プログラムを実装してみる
では、実際に作っていきます。VSCode などエディターとターミナルを開き、進めていきます。まずは、venv を使ってプロジェクト内のスコープで依存モジュールを管理できるようにします。venv ではなく poetry などを使っていただいても問題ありません。
# モジュールを管理する仮想環境ディレクトリを作成
python -m venv .venv
# Linux, Mac
source .venv/bin/activate
# Windows
.\.venv\Scripts\activate
その後、基本的に必要となる AWS, Bedrock, LangChain 関連のライブラリーをインストールします。
(.venv) $ pip install boto3 langchain langchain_aws langchain_community
インストールできたら、 index.py
ファイルを作成し、以下のようにコードを書きます。
from langchain_aws import ChatBedrock
from langchain_community.callbacks.manager import get_bedrock_anthropic_callback
# llm: LLM (Large Language Models) 、つまり、「大規模言語モデル」を指します。
# langchain_aws から提供されている ChatBedrock を利用します。
llm = ChatBedrock(
# Bedrock を利用するリージョンを指定します
region_name="ap-northeast-1",
# モデルIDの一覧はこちらで確認することができます。
# https://docs.aws.amazon.com/bedrock/latest/userguide/model-ids.html#model-ids-arns
model_id="anthropic.claude-3-5-sonnet-20240620-v1:0",
# LLM に与えるパラメータ情報をセットします。指定できる項目や最小値・最大値など詳細については、以下のリンクで確認できます。
# https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-anthropic-claude-messages.html#model-parameters-anthropic-claude-messages-request-response
model_kwargs={
# 利用する最大トークン数を指定します。
"max_tokens": 1000,
# 回答のランダム性を指定します。最小値は0, 最大値は1です。値が大きいほど多様な回答が返されます。
"temperature": 0.1
},
)
# 実行時に消費したトークン数と費用感を確認するため、langchain_community から提供されているコールバック(実行後に呼び出される関数)を利用します。
with get_bedrock_anthropic_callback() as callback:
question = '東京スカイツリーの高さは何メートルですか?'
print('\n 質問: ', question)
# これで質問を投げます
result = llm.invoke(question)
# 「AIMessage」という形で返されるため、見やすくするために content 項目を print します。
# https://api.python.langchain.com/en/latest/messages/langchain_core.messages.ai.AIMessage.html
print('\n 回答: ', result.content)
# 最後に、消費したトークン数と費用を出力します。
print('\n レポート:', callback)
コードの準備ができたら実行してみます。以下のように出力されれば成功です。
(.venv) $ python index.py
質問: 東京スカイツリーの高さは何メートルですか?
回答: 東京スカイツリーの高さは634メートルです。
...(中略)...
レポート: Tokens Used: 320
Prompt Tokens: 27
Completion Tokens: 293
Successful Requests: 1
Total Cost (USD): $0.004476
エラーが出た場合
よく遭遇するエラーとして、いくつかパターンを挙げてみました。もし該当してしまった場合は対応方法などご参考ください。
AWS 認証情報が正しく設定されていなかったり、権限が不足している場合
以下のようなエラーが発生した場合、AWS 認証情報を正しく設定する必要があります。本記事の確認事項①に戻り、AWS アクセスキーを環境変数にセットするか、AWS CLI で aws configure
コマンドを使って認証情報を登録してください。
ValueError: Error raised by bedrock service: Unable to locate credentials
Bedrock を使うための AWS のリージョン指定を間違っている場合
Error raised by bedrock service: Did not find region_name, please add an environment variable `AWS_DEFAULT_REGION` which contains it, or pass `region_name` as a named parameter.
リージョン指定がなかったり、間違っている場合は、以下のように正しく指定し直します。
llm = ChatBedrock(
# Bedrock を利用するリージョンを指定します
region_name="ap-northeast-1",
モデルが有効になっていない場合
本記事の前項のスクリーンショットを参考に、利用するモデル(この記事では「Claude 3.5 Sonnet」を使用)へのアクセスを有効にしてください。
ValueError: Error raised by bedrock service: An error occurred (AccessDeniedException) when calling the InvokeModel operation: You don't have access to the model with the specified model ID.
簡単な Q&A の実装例ではありますが、その概念や用語が慣れないうちはどのように実装に取り掛かれば良いか迷うこともあるかと思います。本記事および本記事の後続編をご参考いただき、チャレンジしてみていただければと思います。
この記事に関する内容を含め、AWSと生成 AI 開発全般において気になる点やサポートが必要な場合は、お気軽にお問い合わせください。