データアナリティクス事業本部 機械学習チームの鈴木です。
この記事はAnthropic Claude Advent Calendar 2023の17日目の記事です。
Amazon Bedrockを対象としたLlamaIndexによる生成されるテキストのカスタマイズについて、特にAnthropic Claudeをモデルに使いたい場合の例を試してみました。
はじめに
Amazon BedrockではAnthropic Claudeのモデルを利用可能です。
特に先日のre:Invent 2023では、Amazon Bedrockで最新モデルのClaude 2.1が利用可能になったことも発表されました。
LlamaIndexを使うと、RAGにより生成系AIが生成するテキストをカスタマイズすることが可能です。
LlamaIndexはAmazon Bedrockにも対応しており、Amazon BedrockによるClaudeの利用を行うことが出来ます。一方でまだあまりAmazon Bedrockを使う例が見つからなかったため、自分でも試してみたのでご紹介します。
ベースとなる部分は『LlamaIndex 🦙 Q&A over your data 📂using Amazon Bedrock and Streamlit | Medium』で紹介されている内容を参考にしつつ、LlamaIndexのAmazon BedrockのためのAPIに使用するインターフェースを揃え、どこをみると実装上のパラメータが分かるかなど補足します。
検証環境の説明
実行環境
- macOS Ventura バージョン13.6(Apple M1チップ)
- Python 3.10.13
環境構築
今回は、ローカルのPCにvenvで仮想環境を構築し、Jupyter環境を作って検証を行いました。
まず、自分のローカル環境ではpyenvを使ってPythonのバージョン指定をできるようにしていたので、以下のようにしてバージョン指定をしました。
pyenv local 3.10.13
python --version
# Python 3.10.13
pip -V
# pip 23.0.1 from ローカルのパス/pip (python 3.10)
以下のように仮想環境を作成しました。
# 検証用のディレクトリの作成
mkdir bedrock-claude
cd bedrock-claude
# 仮想環境の作成と有効化
python -m venv bedrock-claude
source bedrock-claude/bin/activate
# 必要なPythonライブラリのインストール
pip install -r requirements.txt
インストール対象としたパッケージは以下になります。特に再現のためバージョンを固定しておきたいものは、バージョンを明記しました。
requirements.txt
llama-index==0.9.15.post2
langchain==0.0.350
boto3==1.34.2
notebook==7.0.6
python-dotenv
html2text
numpy
jupyter notebook
でJupyterノートブックを起動しました。
Bedrockのモデルアクセス
Amazon Bedrockのコンソールより、Model access
でAmazonとAnthropicのモデルを使えるように申請しておきました。
特に、今回埋め込みベクトルはTitan Embeddings G1 - Text
を使いました。
プロファイル設定
AWSのAPIへアクセスするため、ローカルにプロファイルを設定しておきました。
今回、LlamaIndexおよびLangChainからAmazon Bedrockへはプロファイル情報をもとにアクセスするよう実装しました。特に今回使用したバージョンのLlamaIndexでは、リージョンとしてプロファイルに記載のものを利用するようになっていたので注意が必要でした。リージョンもLlamaIndexのAPIで指定できましたが、プロファイルと併記すると、プロファイル記載のものを優先するようでした。
なお、一般的な話として、設定ファイルでのプロファイル設定については以下のガイドも参考にしてください。
実装例
では、カスタマイズのための実装例をご紹介します。以下はJupyterノートブックで実行していきました。
ライブラリの読み込み・変数定義
まず、以下のようにライブラリの読み込みと使用するプロファイル名を変数化しました。
import boto3
from langchain.embeddings import BedrockEmbeddings
from llama_index.llms import Bedrock
from llama_index import Document
from llama_index.embeddings.langchain import LangchainEmbedding
from llama_index import ServiceContext
from llama_index import set_global_service_context
from llama_index import VectorStoreIndex
from llama_index.readers.web import SimpleWebPageReader
profile_name = "ローカルに設定したプロファイル名"
モデルの設定
続いて、LlamaIndexから使用するテキスト生成および埋め込みベクトル作成用のモデルを設定しました。テキスト生成にはAnthropicのClaude 2.1
、埋め込みベクトル作成用にはTitan Embeddings G1 - Text
を指定しました。
# テキスト生成用のモデルの定義
model_id = "anthropic.claude-v2:1"
llm = Bedrock(
model=model_id,
profile_name=profile_name
)
# 埋め込み生成用のモデルの定義
embed_model_id = "amazon.titan-embed-text-v1"
bedrock_embedding = BedrockEmbeddings(
model_id=embed_model_id,
credentials_profile_name=profile_name
)
embed_model = LangchainEmbedding(bedrock_embedding)
モデルIDは以下のガイドから確認が出来ました。
モデルの指定には、上記ガイドのモデルIDを使えば良いことは、例えばLlamaIndexの実装を見れば分かりますが、以下のページで紹介されているサンプルを見ても判断が出来ます。
モデルやプロファイルの指定は、LlamaIndexとLangChainで微妙にインターフェースが異なることに注意が必要です。LangChainは以下のガイドが参考になりました。どうしても分からない場合はライブラリの実装を確認して判断しました。
Service Contextの上書き
Amazon Bedrockを使って埋め込みベクトル作成およびテキスト生成をするようにService Contextを設定しました。
# Service Contextの作成
service_context = ServiceContext.from_defaults(
llm=llm,
embed_model=embed_model
)
# index作成と解答生成の両方に適用したいので、今回はset_global_service_contextを使用
set_global_service_context(service_context)
インデックスの作成
いつものごとくですが、機械学習チームで提供しているサービスの紹介ページを読み込み、生成されるテキストのカスタマイズに使いました。
AWSの機械学習サービスを活用したシステムの導入支援のページになります。
documents = SimpleWebPageReader(html_to_text=True).load_data([
"https://classmethod.jp/services/machine-learning/"
])
index = VectorStoreIndex.from_documents(documents)
テキストの生成
ここまででClaudeにテキストを生成してもらう準備ができたので、実際に作成してみました。
query_engine = index.as_query_engine()
response = query_engine.query("機械学習モデル活用サービスについて3行で教えてください。")
生成されたテキストを表示すると以下のようになりました。
機械学習モデルの活用支援サービスです。
AWSのSageMakerなどを利用し、レコメンドシステムや画像解析、テキストマイニングなどの構築を支援します。
豊富な導入実績と専門知識を持つ当社が機械学習の課題解決を支援します。
期待した通りの結果になっていると思います!
終わりに
LlamaIndexにより、Amazon BedrockでAnthropicのClaude2.1のテキスト生成を利用し、その内容をカスタマイズしてみました。
参考になりましたら幸いです。