Amazon Bedrockを利用する事で、生成AI機能を利用してイメージやテキストベースの処理を行う事が可能です。
Amazon Bedrock は、単一の API を介して、AI21 Labs、Anthropic、Cohere、Meta、Mistral AI、Stability AI、Amazon などの大手 AI 企業が提供する、高性能な基盤モデル (FM) を幅広く提供するフルマネージドサービスです。強力なプライバシーとセキュリティ、そして責任ある AI を備えた生成 AI アプリケーションを構築するために必要な幅広い一連の機能も備えています。Amazon Bedrock を使用すると、ユースケースに最適な FM を簡単に試して評価したり、微調整や検索拡張生成 (RAG) などの手法を使用してデータに合わせてカスタマイズしたり、エンタープライズシステムとデータソースを使用してタスクを実行するエージェントを構築したりできます。Amazon Bedrock はサーバーレスであるため、インフラストラクチャを管理する必要がありません。また、使い慣れた AWS サービスを使用して、生成 AI 機能をアプリケーションに安全に統合してデプロイできます。
https://aws.amazon.com/jp/bedrock/
レシートの解析
以下のレシートは、先日出張に行った時にランチタイムに食べた食事のレシートです
このレシートをAmazon Bedrockにてanthropic claude3をmodelとして用いて解析してみます。
以下は、画像を取り込んでAmazon Bedrockに問い合わせするスクリプトの例です
import time
import boto3
import base64
import streamlit as st
from langchain_aws.chat_models import ChatBedrock
from langchain_core.messages import HumanMessage
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
st.title("Amazon Bedrock Image Analyzer")
# Bedrock Configuration
bedrock_runtime = boto3.client(
service_name="bedrock-runtime",
region_name="us-east-1",
)
# Bedrock Options
@st.cache_resource
def load_chat():
chat = ChatBedrock(
client=bedrock_runtime,
model_id="anthropic.claude-3-sonnet-20240229-v1:0",
streaming=True,
callbacks=[StreamingStdOutCallbackHandler()],
model_kwargs = {"temperature": 0.0}
)
return chat
st.write('Please upload image for analyzing contents.')
chat = load_chat()
uploaded_file = st.file_uploader("Image", type="jpg")
if "messages" not in st.session_state:
st.session_state.messages = []
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
if prompt := st.chat_input("Please tell me what kind of information should I check?"):
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("user"):
st.markdown(prompt)
with st.chat_message("assistant"):
message_placeholder = st.empty()
full_response = ""
content = []
if uploaded_file:
image_data = base64.b64encode(uploaded_file.read()).decode('utf-8')
content.append(
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/jpeg",
"data": image_data
}
}
)
content.append(
{
"type": "text",
"text": prompt
}
)
messages = [
HumanMessage(
content=content
)
]
# prompt = prompt_fixer(prompt)
result = chat.invoke(messages)
# Simulate stream of response with milliseconds delay
for chunk in result.content.split(' '):
full_response += chunk + ' '
if chunk.endswith('\n'):
full_response += ' '
time.sleep(0.05)
# Add a blinking cursor to simulate typing
message_placeholder.markdown(full_response + "▌")
message_placeholder.markdown(full_response)
st.session_state.messages.append({"role": "assistant", "content": full_response})
上記のスクリプトに対して、環境変数に認証情報を設定してからstreamlit を起動します
環境変数を通して無いので、この例では長くなってしまっていますが必要に応じてstreamlitに環境変数を通しておくと良いと思います。
streamlitで起動した画面にて、上記のレシートをアップロードして解析
質問内容によって回答は様々なので、イメージしているアウトプットに合う質問を問いかける様に固定しておくのも良いかと思います。temperature: 0でtopPはDefaultの1に設定してあるので、レスポンスも安定しているかと思います。
飲料の解析
オフィスで購入したDr PepperをAmazon Bedrockで解析してみます
スクリプトは先程と同じで、アップロードする画像を変更し質問を以下の様に変更してみます
Amazon Bedrockを利用する事で、自動的に解析からレイアウトの設定迄行ってくれる事が上記の例から確認する事が出来ます。その他、chatなどでtextを送る事で、色々な質問や依頼内容にも回答してくれます。こういった、生成AI機能は、これからますます色々な状況で活用される事がイメージ出来ます。便利な世の中になりましたね。