LangChainでAmazon Bedrockを利用する方法(JavaScript編)
この記事はLangChain Advent Calendar 2023の19日目の記事で、JavaScript版のLangChainを使用する方法について説明されています。記事では、LangChainからAmazon Bedrockモデルを利用する方法や、LLMsとChatモデルの違い、クレデンシャル情報を設定する方法などが説明されています。LLMとChatモデルの使い分けについても言及されており、詳細な情報や参考記事へのリンクも提供されています。
目次
この記事は「LangChain Advent Calendar 2023」19日目の記事です。
CloudflareやNext.jsを利用する関係上、LangChainもJavaScript版を利用しています。日本語情報があまり多くないので、アドベントカレンダーを機に最近調べているものを書き出してみました。
今回はAmazon BedrockのモデルをLangChainから利用する方法です。
LLMsとChat model
LangChainでは、モデルをLLMsまたはChat modelの2種類で利用できます。「違いはこれです!」と言い切るほどの自信はないのですが、「会話形式になる場合(Historyなども使いたい)はChat、単発で文章の続きなどを生成したい場合はLLM」と現在は認識しています。
LLMとして利用する
まずはLLMとしてBedrockを利用しましょう。この場合は、langchain/llms/bedrock
からインポートします。
import { Bedrock } from "langchain/llms/bedrock";
利用するモデルの名前やリージョンを指定しましょう。
const model = new Bedrock({
model: "ai21.j2-grande-instruct", // You can also do e.g. "anthropic.claude-v2"
region: "us-east-1",
});
Access KeyとSecret Keyを使う場合
AWSの外から利用する場合などで、クレデンシャルが必要な場合は@aws-sdk/credential-provider-node
を使いましょう。
npm i @aws-sdk/credential-provider-node
こんな感じで、クレデンシャル情報を取得・設定できます。
const credential = await defaultProvider()()
const model = new Bedrock({
model: "anthropic.claude-v2",
region: "us-east-1",
credentials: {
accessKeyId: credential.accessKeyId,
secretAccessKey: credential.secretAccessKey,
},
});
あとはLangChainらしくinvoke
するだけです。
const res = await model.invoke(`
Human: Tell me a joke
Assistant:`);
console.log(res);
Claudeを利用して生成した文章が取得できます。
" Here's a silly joke: \n\nWhat do you call a dog magician? A labracadabrador!
なお、LLMの場合はClaudeなどのモデルが指定する書き方でinvoke
しないとエラーが発生します。
Error: Error 400: Invalid prompt: prompt must end with "
Assistant:"
Chat modelでBedrockを利用する
続いてChat modelを試しましょう。こちらはlangchain/chat_models/bedrock
からインポートします。
import { BedrockChat } from "langchain/chat_models/bedrock";
モデルの初期化はLLMの時とほぼ同じです。
const model = new BedrockChat({
model: "anthropic.claude-v2",
region: "us-east-1",
});
モデルを実行する際、Chat modelでは平文ではなくHumanMessage
やSystemMessage
などを介してテキストを送ります。そのため言語モデルごとの書き方をあまり意識せず書くことができました。
import { HumanMessage } from "langchain/schema";
const res = await model.invoke([
new HumanMessage({ content: "Tell me a joke" }),
]);
console.log(res)
実行結果はこのようになります。
{
"lc": 1,
"type": "constructor",
"id": [
"langchain_core",
"messages",
"AIMessage"
],
"kwargs": {
"content": " Here's a silly joke: \n\nWhat do you call a dog magician? A labracadabrador!",
"additional_kwargs": {}
}
}
出力をよりシンプルにしたい場合は、OutputParser
などを使うと良さそうです。
触ってみた感想
言語モデルに対する知識が少なくても触れる分、Chat modelの方が触りやすいかもしれません。ただしLLMの方が出力のシンプルさなどがありますので、使い分けについては引き続き深掘りしていきたいと思います。