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では平文ではなくHumanMessageSystemMessageなどを介してテキストを送ります。そのため言語モデルごとの書き方をあまり意識せず書くことができました。

    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の方が出力のシンプルさなどがありますので、使い分けについては引き続き深掘りしていきたいと思います。

    参考記事

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark