LangChainって何ができるの?Pythonでの使い方とGPT-4との連携方法!

サムネイル

「LLMを使い分けたい」
「会話履歴を参照したい」

そんなときに便利なのがLangChainです。

今回はChatGPTをはじめとする大規模言語モデル(LLM)の機能を拡張し、効率的に実装するためのライブラリ「LangChain」を解説します。

LangChainとは?概要を紹介!

LangChainは、GPT-3などの大規模言語モデル(LLM)を活用したサービス開発を支援するオープンソースライブラリです。従来、LLMを活用するには、個々のモデルに合わせたコードを書く必要がありました。LangChainは、複数のLLMを共通のインターフェースで扱えるように抽象化することで、開発者の負担を軽減し、効率的なサービス開発を実現します。

LangChainでできる6つのこと

LangChainは、大規模言語モデル(LLM)を活用したアプリケーション開発に必要な機能を幅広く提供しています。以下では、LangChainでできる6つの主要な機能について詳しく説明します。

Model I/O

LangChainのModel I/Oは、さまざまなサービスやモデルを切り替えたり組み合わせたり、Promptを管理したり、出力形式を指定したりできる機能です。

Promptは、テンプレートや教師データから作成できます。Language Modelsは、OpenAIのGPT-3.5やChatGPTなど、さまざまなサービスやモデルをサポートしています。Output Parsersは、出力データをさまざまな形式でフォーマットできます。

Model I/Oは、統一されたインターフェースを提供することで、さまざまな言語モデルでの作業を簡素化します。

Retrieval

Retrievalは、PDFやCSVなどの外部データソースを使用してチャットボットをトレーニングするためのツールです。ドキュメントローダー、ドキュメントトランスフォーマー、テキスト埋め込みモデル、ベクトルストア、リトリーバー、インデックスなどのさまざまなサブ機能を備えています。

このツールを使用すると、テキスト、コード、画像などのさまざまな形式のデータをチャットボットにトレーニングさせることができます。これにより、チャットボットは、ユーザーの質問や要求に応じて、より正確で有益な回答を生成できるようになります。

Retrievalは、さまざまなアプリケーションで使用されています。たとえば、カスタマーサービス、教育、ヘルスケアなどの分野で使用されています。

Agents

Agentsは、言語モデルにツールを与えて、モデル自身が自律的にタスクを実行する機能です。まるでAIが道具を使って作業しているようなイメージです。

主な機能は以下の4つ。

  1. Tools: 言語モデルに渡すツールを定義
  2. Agents: ツールを使ってタスクを実行するエージェントを定義
  3. Toolkits: よく使うツールやエージェントのセット
  4. Agent Executor: エージェントを実行する環境

Agentsを使うことで、以下のことが可能になります。

  • 言語モデルが学習していない最新情報や社内データに基づいて回答を生成
  • 言語モデルに専門知識を与えることで、より高度なタスクを実行
  • 言語モデルの創造性を刺激し、新しいコンテンツを生み出す

例:

  • 最新のニュース記事に基づいて、要約や分析記事を自動生成
  • 社内データに基づいて、顧客への提案資料を自動作成
  • 専門知識を記述したツールを使って、コードを自動生成

Agentsは、言語モデルの可能性を大きく広げる革新的な機能です。

Chains

Chainsは、複数のPrompt入力を連続して実行できる機能です。複雑な問題を小さなステップに分解するのに役立ちます。例えば、ドキュメントの要約を取得してから、その要約について質問するために使用できます。

Chainsは、Simple Chains、Sequential Chains、Custom Chainsの3つの基本的な種類で構成されています。Simple Chainsは、Chainsの基本要素であり、単一のモデルとPromptを実行するように指定できます。Sequential Chainsは、複数のSimple Chainsを連鎖して、最初のChainの出力を2番目のChainの入力に入力できるようにします。Custom Chainsは、Chainsの接続方法をカスタマイズできます。

Memory

LangchainのMemoryは、チャット内の会話履歴を管理するツールです。以前の会話から情報を記憶するために使用できます。これにより、チャットボットの構築や、AIとのより自然な会話の作成などのタスクに役立ちます。

Callbacks

LangChainのCallbacksは、LangChainアプリケーション内で特定のイベントが発生したときに自動的に呼び出される関数またはメソッドです。これらのイベントには、LLM(大規模言語モデル)、チャットモデル、チェーン、エージェント、ツールなどのさまざまなLangChainコンポーネントの開始と終了が含まれます。Callbacksは、生成プロセス中の特定のイベントによってもトリガーできます。

Callbacksは、LangChainアプリケーションの動作をカスタマイズし、その実行を監視する方法を提供します。ログ記録、データのストリーミング、トークンカウントなど、さまざまな目的に使用できます。

具体的には次のことができます。

  • LLMが生成したテキストを検査する
  • チャットボットの会話履歴を記録する
  • チェーンの実行時間を測定する
  • ツールの使用状況を分析する

以上が、LangChainでできる6つの主要な機能です。これらの機能を組み合わせることで、LLMを活用した高度なアプリケーションを効率的に開発できます。LangChainは、LLM開発に必要な機能を網羅的に提供しており、開発者の負担を大幅に軽減してくれるでしょう。

LangChainは無料で利用可能?料金体系を解説

LangChainを使用してアプリケーション開発を行う際、気になるのが料金体系です。ここでは、LangChainの利用料金について詳しく解説します。

LangChainは無料で利用可能

LangChainは、オープンソースPythonライブラリであり、無料で利用できます。つまり、LangChain自体の使用に料金は発生しません。開発者は、LangChainを自由にダウンロードし、自身のプロジェクトに組み込むことができます。これにより、LLMを活用したアプリケーション開発のコストを大幅に抑えることが可能になります。ただし、LangChainを使用する際には、LLMサービスプロバイダーの料金体系を理解しておく必要があります。

OpenAIの料金

LangChainは、OpenAIが提供するGPT-3やGPT-4などのLLMと連携することができます。OpenAIのLLMを使用する場合、OpenAIの料金体系に基づいて料金が発生します。OpenAIの料金は、使用するモデルのサイズとリクエスト数に応じて異なります。例えば、GPT-4を使用する場合、インプットでは $10.00 / 1M tokens、アウトプットでは $30.00 / 1M tokensの料金がかかります(2024年4月現在)。また、DavinciやAdaなど、他のモデルを使用する場合も、それぞれ異なる料金体系が適用されます。開発者は、自身のアプリケーションのニーズに合わせて、適切なモデルを選択する必要があります。

LangChainを使用することで、LLMを活用したアプリケーション開発のコストを抑えることができます。LangChain自体は無料で利用できるため、開発者はOpenAIなどのLLMサービスプロバイダーの料金のみを考慮すれば良いでしょう。ただし、アプリケーションの規模や要件によっては、料金が高額になる可能性もあります。開発者は、予算と要件のバランスを考慮し、適切なモデルを選択する必要があります。

LangChainをPythonで使ってみた

機能や料金が分かったところで実際にコードを書いて実行していきましょう。

まずは、シンプルなコードから実行していきます。

コピペで簡単に実行できるチャットボット

GPT-4を使って会話ができるBotを作成してみます。

必要なライブラリをインストールします。

pip install langchain openai

下記のコードを実行します。

from langchain.chat_models import ChatOpenAI
from langchain.schema import (
    HumanMessage,
    SystemMessage
)

openai_api_key = "xxxxxxxxxxxxxxxxxxxxxxxxx"  # ここにあなたのOpenAI APIキーを入力してください

chat = ChatOpenAI(model_name="gpt-4", openai_api_key=openai_api_key)

system_message = SystemMessage(content="あなたは親切なアシスタントです。")
human_message = HumanMessage(content="こんにちは!")
ai_message = chat([system_message, human_message])

print(ai_message.content)

while True:
    user_input = input("User: ")
    if user_input.lower() in ["exit", "quit", "bye"]:
        print("Assistant: さようなら!")
        break

    human_message = HumanMessage(content=user_input)
    ai_message = chat([system_message, human_message])
    
    print(f"Assistant: {ai_message.content}")

これで簡単にチャットBotを作成することができました。

独自プロンプトで会話履歴を参照出来るチャットボットを作ってみた

次にもう少し複雑なものを作ってみます。

要件を箇条書きで簡単にまとめると

  • 会話履歴を今の会話も過去の会話も覚えていてほしい

  • user_idごとに会話履歴を保存したい

  • 独自のプロンプトを指定したい

以上の条件を踏まえたコードは下記のとおりです。同ディレクトリの、「chat_histories」にuser_idごとの会話履歴が保存されます。 このコードを使えば、独自のチャットボットを簡単に開発することが可能になります。

import os
import json
import langchain
from langchain.memory import ConversationBufferMemory
from langchain.schema import ChatMessage
from langchain.memory import ChatMessageHistory
from langchain.chains import ConversationChain
from langchain_openai import ChatOpenAI
from langchain.prompts import (
    ChatPromptTemplate,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
    MessagesPlaceholder,
)

# langchainのデバッグを有効化
langchain.debug = True

# OpenAIのAPIキーを定義
OPENAI_API_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

# GPT-4モデルを使用するConversationChainを初期化
llm = ChatOpenAI(
    openai_api_key=OPENAI_API_KEY,
    model='gpt-4-1106-preview'
)

# chat_historiesフォルダを作成(存在しない場合)
os.makedirs("chat_histories", exist_ok=True)

def load_conversation_memory(user_id):
    try:
        with open(f"chat_histories/{user_id}.json", "r", encoding="utf-8") as f:
            print("file found")
            data = f.read()
            messages = json.loads(data)
            chat_memory = ConversationBufferMemory(
                chat_memory=ChatMessageHistory(
                    messages=[
                        ChatMessage(
                            content=msg['content'], 
                            role=msg['role'].lower()
                        )
                        for msg in messages
                    ]
                ), 
                return_messages=True
            )
            return chat_memory
    except FileNotFoundError:
        print("file not found")
        return ConversationBufferMemory(return_messages=True)

def save_conversation_memory(user_id, conversation_memory):
    with open(f"chat_histories/{user_id}.json", "w", encoding="utf-8") as f:
        messages = [
            {
                "role": "user" if msg.type == "human" else "assistant" if msg.type == "ai" else msg.type,
                "content": msg.content
            }
            for msg in conversation_memory.chat_memory.messages
        ]
        f.write(json.dumps(messages, ensure_ascii=False))


def chat(user_input):
    assistant_response = conversation.predict(input=user_input)
    return assistant_response


# 過去の会話履歴を読み込む
user_id = "test_user_id"
conversation_memory = load_conversation_memory(user_id)

# ConversationChainを初期化
template="あなたは親切で万能なアシスタントです。ユーザーの質問に丁寧な口調で答えてください。"
chat_prompt = ChatPromptTemplate.from_messages([
    SystemMessagePromptTemplate.from_template(template),
    MessagesPlaceholder(variable_name="history"),
    HumanMessagePromptTemplate.from_template("{input}")
])

conversation = ConversationChain(
    prompt=chat_prompt,
    llm=llm,
    memory=conversation_memory,
)

# チャットアプリのメインループ
while True:
    print(f"User ID: {user_id}")

    # ユーザーの入力を受け取る
    user_input = input("User: ")

    # 終了条件をチェック
    if user_input.lower() == "exit":
        # 会話履歴を保存
        save_conversation_memory(user_id, conversation.memory)
        break

    # チャット関数を呼び出してGPT-4からの応答を取得
    assistant_response = chat(user_input)
    print(f"Assistant: {assistant_response}")

LangChainは、大規模言語モデルを活用したアプリケーション開発を支援するPythonフレームワークです。Model I/O、Retrieval、Agents、Chains、Memory、Callbacksなどの機能を提供し、様々なタスクを自動化できます。LangChain自体は無料ですが、サービスプロバイダーの料金は別途かかります。LLMを活用したアプリケーション開発に興味がある方は、ぜひLangChainを試してみてください。