PythonでChatGPT APIを使ってみる 第3回 LangChainの簡単な使用方法
概要
前回の記事ではChatGPTとBing Search APIを連携する簡易的なプログラムを作成しました。
今回はLangChainというフレームワークの簡単な使い方について、記事にしたいと思います。
全3回の内、第3回でLangChainを利用したAPIの連携方法を記事にする予定でしたが、LangChainの簡単な使い方をまとめるだけで記事が長くなってしまったため、具体的な連携方法は第4回として記事にしようと考えています。
予定と異なってしまい、申し訳ございません。
LangChainとは
LangChainとは、大規模言語モデル(LLM)を利用したアプリケーション開発のためのフレームワークです。
今回は以下の公式ドキュメントのチュートリアルを参考に、プログラムを作成します。
Build a Simple LLM Application with LCEL
https://python.langchain.com/v0.2/docs/tutorials/llm_chain
LangChainのインストールには以下のコマンドを実行します。
pip install langchain
また、チュートリアルではLangSmithというライブラリも使用しています。
LangSmithとは、LLMアプリケーションのデバッグ、テスト、評価、監視を可能にする開発者向けプラットフォームです。
LangSmithを使用するためにはこちらのページでサインアップを行い、APIキーを発行する必要があります。
APIキーの発行後は、以下のように環境変数を設定することで使用可能になります。
export LANGCHAIN_TRACING_V2="true"
export LANGCHAIN_API_KEY="..."

LangChainでChatGPTを使用する
まずはLangChainでChatGPT単体を使用してみたいと思います。
ChatGPTを使用するパッケージは以下のコマンドでインストールします。
pip install -qU langchain-openai
前回、前々回と同様にOPENAI_API_KEY環境変数を予め設定する必要があります。
ChatGPTを使用する簡単なプログラムは以下の通りです。
from dotenv import load_dotenv
load_dotenv()
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
model = ChatOpenAI(model="gpt-4")
messages = [
SystemMessage(content="次の文章を英語から日本語に変換してください。"),
HumanMessage(content="The quick brown fox jumps over the lazy dog."),
]
model.invoke(messages)
ドキュメントによると、SystemMessageを一連の入力メッセージの最初に渡し、その後HumanMessageとしてモデルにプロンプトを入力するようです。
このプログラムを実行すると以下のような出力がLangSmithのコンソールUIに表示されます。

この出力にはトークン使用量などのメタデータが含まれています。
文字列プロンプトのみを出力させたい場合は、 LangChainのOutputParserを使用します。
OutputParserは以下のように使用します。
from langchain_core.output_parsers import StrOutputParser
parser = StrOutputParser()
result = model.invoke(messages)
parser.invoke(result)
こうすることで、LangSmithのコンソールUIにメタデータが含まれなくなります。

Chain
先程の使用例でモデルからの出力をOutputParserの入力にしました。
LangChainではパイプライン演算子を使用することで、あるモデルからの出力を別のモデルの入力に連鎖(Chain)させることができます。
この機能により、複数のAPIの連携が容易になります。
Chainは以下のように作成します。
chain = model | parser
chain.invoke(messages)
プログラムを実行すると、LangSmithのコンソールUIで以下のように複数のモデルが実行されていることを確認できます。

Chainでは2つのモデルだけではなく、さらに多くのモデルを連鎖させることができます。
例えば「プロンプト作成用のモデル→ChatGPTモデル→OutputParser」のような連鎖も可能です。
具体的なコードは以下のようになります。
from dotenv import load_dotenv
load_dotenv()
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
model = ChatOpenAI(model="gpt-4")
parser = StrOutputParser()
system_template = "次の文章を英語から{language}に変換してください。"
prompt_template = ChatPromptTemplate.from_messages(
[("system", system_template), ("user", "{text}")]
)
chain = prompt_template | model | parser
chain.invoke({"language": "日本語", "text": "The quick brown fox jumps over the lazy dog."})
プログラムを実行すると、LangSmithのコンソールUIで3つのモデルが連鎖していることを確認できました。

おわりに
今回はLangChainの簡単な使い方と、LangChainを使用する上で重要になるChainについて記事にしました。
次回はChainを利用した具体的なAPIの連携方法を記事にしたいと思います。
コメントを残す