お知らせ
過去にQiitaに投稿した内容のアーカイブです。
Amazon BedrockのEmbeddingsを試しました。
環境
- Ubuntu 22.04 (.devcontainer)
- Python 3.10
- VSCode + Python拡張 + Jupyter拡張
ライブラリーのインストール
%pip install -q -U \
boto3==1.28.57 \
langchain==0.0.303 \
unstructured \
qdrant-client
Embeddingsしてベクトルデータベースを作成
EC2のFAQを取得
%%bash
wget https://aws.amazon.com/jp/ec2/faqs/ -O ec2_faq.htmlHTMLを読み込む
from langchain.document_loaders import UnstructuredHTMLLoader
loader = UnstructuredHTMLLoader(file_path='ec2_faq.html', mode='single')
data = loader.load()チャンクに分割する
Titan Embeddings
モデルで渡せるサイズに収まるようにチャンク分割します。from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=(512*0.6), chunk_overlap=512*0.1)
splited_data = text_splitter.split_documents(data)一つのdataはこんな感じ
Document(page_content='ページの内容\n\n全般\n\nインスタンスタイプ\n\nストレージ\n\nネットワークとセキュリティ\n\nマネジメント\n\n請求と購入のオプション\n\nプラットフォーム\n\nワークロード\n\n前世代向けの Nitro System サポート\n\n全般\n\n概要 |\xa0EC2 オンデマンドインスタンス制限 |\xa0EC2 SMTP エンドポイントポリシーへの変更 |\xa0サービスレベルアグリーメント (SLA)\n\n概要\n\nQ: Amazon Elastic Compute Cloud (Amazon EC2) とは何ですか?', metadata={'source': 'ec2_faq.html'})
Bedrock Embeddingsを作成。使用するモデルはAmazon Titan Embeddings
import boto3
from langchain.embeddings import BedrockEmbeddings
embeddings = BedrockEmbeddings(
client=boto3.client('bedrock-runtime'),
model_id='amazon.titan-embed-text-v1'
)Embeddingsの実行。Qdrantというベクトルデータベースを使用します。
from langchain.vectorstores import Qdrant
db = Qdrant.from_documents(
documents=splited_data,
embedding=embeddings,
path='./local_qdrant',
collection_name='ec2',
distance_func='Dot')./local_qdrant
にベクトルデータが格納されます。%%bash
tree ./local_qdrant./local_qdrant
├── collection
│ └── ec2
│ └── storage.sqlite
└── meta.json
2 directories, 2 files実態はSQLiteのようです。
ベクトルデータベースを使用してFAQ検索
プロンプトテンプレートを作成。Claudeの求める形式のテンプレートにします。(Human:とAssistant:のところ)
from langchain.prompts import PromptTemplate
prompt_template = '''Human:
Text: {context}
Question: {question}
Answer the question based on the text provided. If the text doesn't contain the answer, reply that the answer is not available.
Assistant:
'''
PROMPT = PromptTemplate(
template=prompt_template, input_variables=['context', 'question']
)Claude InstantのLLMを作成。
from langchain.llms import Bedrock
llm = Bedrock(
client=boto3.client('bedrock-runtime'),
model_id="anthropic.claude-instant-v1",
verbose=True
)RetrievalQAを作成。
from langchain.chains import RetrievalQA
chain_type_kwargs = {"prompt": PROMPT}
qa = RetrievalQA.from_chain_type(llm=llm,
chain_type="stuff",
retriever=db.as_retriever(),
chain_type_kwargs=chain_type_kwargs,
return_source_documents=True)質問する。
answer = qa('EC2とはなんですか?')
{'query': 'EC2とはなんですか?',
'result': ' Amazon Elastic Compute Cloud(Amazon EC2)とは、Amazonが提供するクラウドコンピューティングサービスの一つです。EC2を使うとオンデマンドで必要な数の仮想サーバ(インスタンスといいます)を利用できます。ストレージ、ネットワーク、セキュリティなどのインフラ資源を管理する必要はなく、安価にスケーラブルな計算能力をサービスとして利用できます。',
'source_documents': [Document(page_content='ページの内容\n\n全般\n\nインスタンスタイプ\n\nストレージ\n\nネットワークとセキュリティ\n\nマネジメント\n\n請求と購入のオプション\n\nプラットフォーム\n\nワークロード\n\n前世代向けの Nitro System サポート\n\n全般\n\n概要 |\xa0EC2 オンデマンドインスタンス制限 |\xa0EC2 SMTP エンドポイントポリシーへの変更 |\xa0サービスレベルアグリーメント (SLA)\n\n概要\n\nQ: Amazon Elastic Compute Cloud (Amazon EC2) とは何ですか?', metadata={'source': 'ec2_faq.html'}),
Document(page_content='ページの内容\n\n全般\n\nインスタンスタイプ\n\nストレージ\n\nネットワークとセキュリティ\n\nマネジメント\n\n請求と購入のオプション\n\nプラットフォーム\n\nワークロード\n\n前世代向けの Nitro System サポート\n\n全般\n\n概要 |\xa0EC2 オンデマンドインスタンス制限 |\xa0EC2 SMTP エンドポイントポリシーへの変更 |\xa0サービスレベルアグリーメント (SLA)\n\n概要\n\nQ: Amazon Elastic Compute Cloud (Amazon EC2) とは何ですか?', metadata={'source': 'ec2_faq.html'})]}Amazon Elastic Compute Cloud(Amazon EC2)とは、Amazonが提供するクラウドコンピューティングサービスの一つです。EC2を使うとオンデマンドで必要な数の仮想サーバ(インスタンスといいます)を利用できます。ストレージ、ネットワーク、セキュリティなどのインフラ資源を管理する必要はなく、安価にスケーラブルな計算能力をサービスとして利用できます。
回答返ってきました!良さげです!
注記
claude-instant-v1でも違和感ないですね。コストも考慮すると使い所ありそうです