Amazon BedrockのAPIをPythonアプリから呼んでみよう。LangChainにも挑戦！

昨晩時点では未対応だったPython用のAWS SDK（boto3）もようやくBedrockに対応したようです！

https://github.com/boto/boto3/blob/develop/CHANGELOG.rst


※宇宙最速でAPIを叩いたQiita記事は @moritalous さんでした!?

https://qiita.com/moritalous/items/213aab518bb5f1de1d3f


# AWSのPython SDK（boto3）から叩いてみる

まずBedrockでAPIを利用したい基盤モデルへのアクセスを許可しておきます。こちらの記事を参照。

https://qiita.com/minorun365/items/79c2fc1d2afe82aad2af

そして当該AWSアカウントへのCLIアクセスができるよう、あなたのPCにAWSプロファイルの認証情報を設定しておきます。こちらを参照。

https://qiita.com/minorun365/items/7ee8bb1478bfbceb1d1b

そして適当な作業用ディレクトリを作り、`test.py` 的なファイルを作ってコードを書く準備をします。
![スクリーン ショット 2023-09-29 に 00.23.53 午前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/9ae9400c-155a-d406-0525-56db12c075c9.png)

また、Python用のAWS SDK（boto3）を最新バージョンに更新しておきましょう。

https://github.com/boto/boto3

```zsh:ターミナル
pip install --upgrade boto3
```

まずはClaude v2をPythonから呼んでみましょう。以下の公式ドキュメントのサンプルを参考。

https://docs.aws.amazon.com/bedrock/latest/userguide/api-methods-run-inference.html

```py:test.py
import boto3
import json
bedrock = boto3.client(service_name='bedrock-runtime')

body = json.dumps({
    "prompt": "\n\nHuman:KDDIアジャイル開発センターってどんな会社？\n\nAssistant:",
    "max_tokens_to_sample": 300,
    "temperature": 0.1,
    "top_p": 0.9,
})

modelId = 'anthropic.claude-v2'
accept = 'application/json'
contentType = 'application/json'

response = bedrock.invoke_model(body=body, modelId=modelId, accept=accept, contentType=contentType)
response_body = json.loads(response.get('body').read())

# text
print(response_body.get('completion'))
```

するとエラーになりました。リージョンの指定が必要のようです。

```
botocore.exceptions.NoRegionError: You must specify a region.
```

AWS CLI用の認証情報ファイルにリージョンを記載しているのですが、うまく効いていないようだったので以下を参考に強制指定してみました。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-files.html#cli-configure-files-methods

```zsh:ターミナル
aws configure set region us-east-1 --profile <プロファイル名>
```

すると無事にBedrockのAPIから応答を得ることが出来ました！

```
 KDDIアジャイル開発センターは、KDDI株式会社のグループ会社です。

主な事業内容は以下の通りです。

- KDDIの新規事業やサービス開発のためのアジャイル開発
- KDDIグループ各社のシステム開発
- クラウド関連事業
- RPA(Robotic Process Automation)による業務自動化

KDDIグループの中でアジャイル開発を中心としたシステム開発を担う会社です。開発手法としてアジャイル開発を取り入れ、スピーディなサービス開発を行っています。

新規事業開発だけでなく、KDDIグループ各社のシステム開発も手がけているため、グループ全体のIT戦略立案・推進にも関与していると言えます。
```

※回答は微妙に嘘も混じっているので、正確な情報は弊社ホームページをご参照ください。笑

https://kddi-agile.com/


# そしてLangChainから呼んでみるも…

LangChainの基本的な使い方は以下を参照。

https://qiita.com/minorun365/items/081fc560e08f0197a7a8

まずはLangChainをインストールします。

```zsh:ターミナル
pip install langchain
```

LangChainのLLMsとしてBedrockを呼び出すためのドキュメントが既にありました！
`test2.py` という新規ファイルを作って試してみます。サンプルをClaude用に書き換えてみました。

https://python.langchain.com/docs/integrations/llms/bedrock

```py:test2.py
from langchain.llms import Bedrock

llm = Bedrock(
    credentials_profile_name="AWSプロファイル名",
    model_id="anthropic.claude-v2"
)

output = llm.predict("日本の総理大臣は？")
print(output)
```

するとエラーになりました。Bedrockから「invoke_modelなんて属性ないよ」と怒られているようです。明示的に指定した覚えはないので、LangChainの内部動作がおかしい？

```
ValueError: Error raised by bedrock service: 'Bedrock' object has no attribute 'invoke_model'
```

Bedrockのユーザーガイドを見ていると、`invoke_model` しているサービス名は `bedrock` ではなく `bedrock-runtime` の方なのでLangChainの不具合かも知れませんね。OSSコントリビューターの有志によりすぐに修正されるでしょう…。

https://docs.aws.amazon.com/bedrock/latest/userguide/api-methods-run-inference.html

なお、LangChain標準のBedrock用LLMラッパーではなく、自分で好きな基盤モデルを設定して使える「Custom LLM」を使えば現時点でもBedrockをLangChain LLM化出来るかも知れません。

https://python.langchain.com/docs/modules/model_io/models/llms/custom_llm


# マネコン派の方はこちらもどうぞ

https://qiita.com/minorun365/items/79c2fc1d2afe82aad2af