Pythonで大規模言語モデル(LLM: Large Language Model)を活用する際に使用できるLangChainでChainを使用してワークフローを実行する方法を解説します。
LangChainのChain機能
LangChainは、大規模言語モデル(LLM: Large Language Model)を活用するためのオープンソースPythonライブラリです。LangChain自体の概要については「LangChainで大規模言語モデル(LLM)を活用する」で説明していますので参考にしてください。
LangChainは、LLMの複雑なタスクを実行するためのライブラリでワークフリーを簡単に実現することが可能です。
上記の記事でPromptTemplateやOutputParserといったLangChainの機能を紹介していますが、「PromptTemplateでプロンプトを作成」→「モデルの実行」→「OutputParserで出力を整形」といった一連の流れを簡単に実行できるようにしたものがChain機能です。Chain機能を使用することで複雑な処理の流れを簡単に実装できるようになります。
この記事では、Chain機能の使い方を例を使用して紹介します。
この記事で使用されているプログラムは以下のバージョンでの動作を確認済みです。生成AIの分野は進歩が速いため、API等の変更により最新バージョンではプログラムがそのままでは動作しない可能性もありますので注意してください。
- Python: 3.11.5
- langchain: 0.2.11
- langchain-core: 0.2.26
- langchain-community: 0.2.10
- langchain-openai: 0.1.16
Chain機能
Chainは、プロンプトの生成から出力の生成までの一連の流れを制御するためのチェーンです。イメージで記載すると以下のような流れになります。
以下のプログラムの例は、OpenAIのAPIを使ってLLMを呼び出し、文字列として出力する簡単な流れをChainを使用して実装した例です。
import configparser from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ( ChatPromptTemplate, HumanMessagePromptTemplate, SystemMessagePromptTemplate, ) from langchain_openai import ChatOpenAI # コンフィグファイルからキーを取得する config = configparser.ConfigParser() config.read("config.ini") # ChatPromptTemplateを生成する。 prompt = ChatPromptTemplate.from_messages( [ SystemMessagePromptTemplate.from_template( "あなたは優秀な{language}プログラマです。ユーザーをサポートしてください。" ), HumanMessagePromptTemplate.from_template( "プログラミング言語:{language}の{content}について教えてください。" ), ] ) # モデルを初期化する model = ChatOpenAI(openai_api_key=config["OPENAI"]["key"]) # OutputParserを定義する parser = StrOutputParser() # Chainを構成する llm_chain = prompt | model | parser # Chainを実行する result = llm_chain.invoke({"language": "Python", "content": "概要"}) print(result)
【実行結果】 Python(パイソン)は、汎用プログラミング言語の1つであり、初心者からプロまで幅広い層に人気があります。Pythonの特徴として以下の点が挙げられます。 1. **シンプルで読みやすい構文**: Pythonはシンプルな文法を持ち、可読性が高いため初学者にも理解しやすいです。 2. **豊富なライブラリ**: Pythonは豊富な標準ライブラリを持っており、さまざまな用途に利用できます。さらに、サードパーティ製のライブラリやフレームワークも充実しています。 3. **クロスプラットフォーム**: Windows、macOS、Linuxなど様々なプラットフォームで動作します。 4. **オブジェクト指向プログラミング**: Pythonはオブジェクト指向プログラミングをサポートしており、クラスやオブジェクト指向の機能を活用することができます。 5. **豊富な用途**: データサイエンス、機械学習、Web開発、自動化、ゲーム開発など、さまざまな分野で利用されています。 Pythonは、初学者にとって学びやすい言語であり、プロフェッショナルにとっても非常に強力なツールとなっています。
上記プログラムは以下の流れで動作しています。
ChatPromptTemplate
でプロンプトテンプレートを作成する。- 使用するOpenAIのモデルを初期化する。
- OutputParserとして
StrOutputParser
を定義する。 - ①~③の情報をもとにChainを構成する。
- Chainを実行する。
Chainの定義では以下の部分で示しているように「|
(パイプ)演算子」を使った連結を行います。
# Chainを構成する llm_chain = prompt | model | parser
左から順にプロンプト生成→モデル→パーサーといった順に適用することを表現しています。これはLinuxのシェルスクリプトにおけるパイプと似た概念であるため、Linuxになじみがある人には理解しやすいかなと思います。
# Chainを実行する result = llm_chain.invoke({"language": "Python", "content": "概要"})
Chainの実行では、上記部分で示すようにinvokeメソッドで実行可能です。引数に辞書でテンプレートに渡す値を指定することが可能になっているので柔軟に呼び出しを変更することが可能です。
上記の説明では基本的なモデル実行に関する説明やPromptTemplate、OutputParserの詳細な説明は省略しています。必要に応じて以下ページを参考にしてください。
LCEL(LangChain Expression Language)
LangChainは、2023年8月にLCEL(LangChain Expression Language)と呼ばれる独自構文を発表しています。これは、一連のワークフローを構築するための新しい方法で「|
(パイプ)演算子」でフローを表現します。
上述したChain機能の説明では、まさにこのLCELの機能を使って「|
(パイプ)演算子」で処理を連結しました。もともとはこういったチェーンの実装ではLLMChain
のような各種クラスが使用されていました。これらのクラスは、クラスによって内部実装が異なっていたり、ドキュメント整備が不十分などといった問題もありました。
現在では、LLMChain
のようなクラスの使用は非推奨となり、上記で紹介したような「|
(パイプ)演算子」を使った連結が推奨されています。この新しい方法は、プロンプト、言語モデル、出力パーサーなどのコンポーネントを直接つなぐことで構文を単純化し、可読性を高めます。
まとめ
Pythonで大規模言語モデル(LLM: Large Language Model)を活用する際に使用できるLangChainでChainを使用してワークフローを実行する方法を解説しました。
Chain機能を使用することで、「PromptTemplateでプロンプトを作成」→「モデルの実行」→「OutputParserで出力を整形」といった一連の流れを簡単に実行できるようになります。この記事では、簡単な例を用いてChainの実行方法を紹介しました。
LangChainには、他にも様々な機能があります。皆さんもLangChainの使い方をぜひ覚えていってもらえるといいと思います。