LangChainを使ってChatGPTをより賢くしよう!

LangChainとは

LangChainは、ChatGPTのようなLLMを使ったアプリケーション開発を簡単に行うためのフレームワークです。LLMと他のデータソースを接続することで、外部データ等利用したアプリケーションを作成することができます。

LangChainを使用することで、例えばSerpAPIと組み合わせることで「最新の検索結果の内容も考慮したAIへの回答」を短いコードで実現することができます。LangChainはこのようなLLMを使ったサービス開発に便利な機能を提供しています。

実際に使いながら何ができるのか理解していってください。

セットアップと簡単な例

今回はGoogleColaboratoryを使いました。

!pip install --quiet langchain openai
! export OPENAI_API_KEY="..."

まずはアプリケーションを構築します。LangChainには、アプリケーションを構築するために使用できる多くのモジュールが用意されています。モジュールは単体で簡単なアプリケーションに使用することもでき、複雑なユースケースには組み合わせることもできます。

LLMsモジュールはLangChainの基本的な構成要素であり、テキストを受け取り、より多くのテキストを生成します。

まずは最もシンプルにモデルを呼び出してプロンプトを投げてみましょう。

from langchain.llms import OpenAI

llm = OpenAI(temperature=0.8)

text = "将来のキャリアについてアドバイスをください。私は高校生で、興味があるのはプログラミングとデザインです。"

prediction = llm.predict(text)
print(prediction.strip())

LangChainのLLMクラスを使用して、将来のキャリアアドバイスを聞いてみます。

ChatModel

次にChatModelを使ってみます。

Chat modelsは、LLMを内部で使用していますが、インターフェースは少し異なります。通常のLLMが「テキストの入力とテキストの出力」を提供するのに対し、Chat modelsは「チャットメッセージ」を入力と出力として扱います。

Chat modelsでは、1つまたは複数のメッセージをモデルに渡すことでチャットの応答を取得できます。応答もメッセージの形式で返されます。LangChainでは、AIMessage、HumanMessage、SystemMessage、ChatMessageというメッセージの種類がサポートされています。ChatMessageはロールパラメータを持ち、他の種類のメッセージと同様に扱うことができますが、一般的にはHumanMessageやAIMessage、SystemMessageを使用することが多いです。 以下は、Chat modelsについての解説セクションの例です。

from langchain.chat_models import ChatOpenAI
from langchain.schema import AIMessage, HumanMessage

# ChatOpenAIクラスのインスタンス化
chat = ChatOpenAI(temperature=0.7)

# ユーザーからのメッセージ
user_message = HumanMessage(content="自己紹介して")

# メッセージをChat modelに送信して予測を取得
response = chat.predict_messages([user_message])

# Chat modelからの返信を表示
print(response[0].content.strip())

この例では、LangChainのChatOpenAIクラスを使用してChat modelを初期化し、ユーザーからのメッセージをChat modelに送信して予測を取得します。入力としては、「自己紹介して」という質問を投げかけています。

プロンプトテンプレート

LLMを使用した会社のキャッチコピー生成サービスを考えてみましょう。このサービスでは、ユーザーから会社に関する説明文を受け取り、それを基に会社のキャッチコピーを生成します。

いくつもの会社のキャッチコピーを生成する場合、会社名や事業内容といった基本的な情報というのは生成する場合ごとに異なってきますが、この会社は。。という会社です。といったようなフレーズ部分に関しては共通するケースが多いです。したがってそのような部分は毎回入力をしなくてもテンプレート化して再利用できるようにしているのがこのプロンプトテンプレートの役割になります。

実際にコードの例を見てみましょう。

from langchain.llms import OpenAI

llm = OpenAI(temperature=0.8)

prompt = "私たちの会社は{industry}業界のリーディングカンパニーです。{feature}を提供し、お客様の{need}を解決します。"
industry = "IT"
feature = "革新的なソリューション"
need = "ビジネスの効率化"

input_prompt = prompt.format(industry=industry, feature=feature, need=need)

output = llm.predict(input_prompt)
print(output)

この例では、プロンプトに「{industry}業界のリーディングカンパニーです。{feature}を提供し、お客様の{need}を解決します。」というテンプレートを作成し、それぞれの要素を指定しています。例として、業界は「IT」、特徴は「革新的なソリューション」、ニーズは「ビジネスの効率化」として設定しています。

このプロンプトを言語モデルに渡すと、会社のキャッチコピーが生成されます。

Chain

次にChainについて学習していきます。 Chianはモデルとプロンプトをつなぎ合わせるものです。 ユーザーの入力した内容に応じてプロンプトを作成して、その内容をモデルに投げて予測結果を返してもらう。という一連の流れを成立させるために用いる機能です。

from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain

# LLM ラッパーを初期化
llm = OpenAI(temperature=0.7)

# プロンプトテンプレートの作成
prompt = PromptTemplate(
    input_variables=["industry", "feature", "need"],
    template="私たちの会社は{industry}業界のリーディングカンパニーです。{feature}を提供し、お客様の{need}を解決します。",
)

# 入力をプロンプトに反映させる
input_prompt = prompt.render(industry="IT", feature="革新的なソリューション", need="ビジネスの効率化")

# LLM チェーンを作成(LLM ラッパーとプロンプトテンプレートから構成する)
chain = LLMChain(llm=llm, prompt=prompt)

# LLM チェーンを実行
prediction = chain.run(input_prompt)
print(prediction.strip())

この例では、IT業界に関連したキャッチコピーを生成するために、プロンプトテンプレートとLLMチェーンを使用します。

プロンプトテンプレートでは、"industry"、"feature"、"need"という入力変数を使用し、それぞれの値をテンプレートに反映させます。

LLMチェーンでは、LLMラッパーとプロンプトテンプレートを組み合わせてチェーンを構築し、キャッチコピーの生成を行います。

最後に、LLMチェーンを実行して生成されたキャッチコピーを出力します。

このように、プロンプトテンプレートとLLMチェーンを組み合わせることで、特定の業界やビジネスのニーズに合わせた魅力的なキャッチコピーを生成することができます。

簡単な使い方としては以上になります。この段階ではまだまだLangChainの実力を引き出せていないので次回以降よりChatGPTを始めとするLLMモデルを強化する方法を紹介していきたいと思います

そのほかの機能としてAgentとMemoryがありますが、この2つは重要かつできることが多いので、次回以降にしっかりと扱っていきたいと思います。