リモート開発メインのソフトウェア開発企業のエンジニアブログです

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="..."
Moba Pro

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の連携方法を記事にしたいと思います。

← 前の投稿

WordPress のデータを使って簡単な RAG を実装する(1)

次の投稿 →

Flutter の物理シミュレーションを理解する: ① Simulation の基本と FrictionSimulation

コメントを残す