はじめに
『かがみの孤城』円盤発売まであと2️⃣日、リオンくん!
リオンくんのパラレルワールドでは、6/26は日曜日。nikkieです。
アーカイブを視聴して概念を理解したLangChain、ちょっとだけ触ってみました。
目次
- はじめに
- 目次
- 前回、「プロンプトエンジニアリングから始めるLangChain入門」のアーカイブを視聴
- 今回の対象:Models, Prompts, Chains
- 1.models.py
- 2.prompts.py
- Chains
- 終わりに
- P.S. StudyCoさんの次回は6/29「LangChainソースコードリーディング」
前回、「プロンプトエンジニアリングから始めるLangChain入門」のアーカイブを視聴
コードは手元で動かせていないので、時間を見つけて試していこうと思います。
説明を分かりやすくするためにモデルはtext-davinci-003指定だと思うのですが、gpt-3.5-turboに変えると結果がどう変わるのか、そしてコードをどう書き換えるかが気になるところです。
StudyCoさんの勉強会のサンプルコードは、LangChain v0.0.144かつtext-davinci-003指定。
今回は最新(v0.0.215)のLangChainを使い、gpt-3.5-turboでどのようにコードが変わるかを見ていきます。
今回の対象:Models, Prompts, Chains
サンプルコードの1〜3を最新(v0.0.215)のLangChainを使い、gpt-3.5-turboで書き換えます。
動作環境
- Python 3.10.9
- langchain 0.0.215
- openai 0.27.8
1.models.py
LangChain v0.0.215では、ModelsとPromptsがModel I/Oにまとまっていました1。
Language models2を見ていくと以下のようです
- StudyCoさんの勉強会で扱ったtext-davinci-003はLLMs
- 入力は文字列のプロンプト
- 出力も文字列による補完
- 今回指定したいgpt-3.5-turboはChat models
- 入力に(単一の文字列の代わりに)複数のチャットメッセージを受け取る
Chat modelsのドキュメントのGet startedに沿って手を動かします3。
pip install openai
export OPENAI_API_KEY="..."
ChatOpenAI
クラスのドキュメントを見ると、この環境変数を使うことが記載されています(openaiライブラリと同じ挙動ですね)- ref: https://github.com/hwchase17/langchain/blob/v0.0.215/langchain/chat_models/openai.py#L142-L143
% python 1.models.py 私はGPTです。自然言語処理に特化したAIで、文章生成や言語理解などのタスクに優れています。
Message(ここではHumanMessage
)の配列を扱うのがポイントかなと思います。
2.prompts.py
Promptsは整理されたようですが、「Prompt templates」は健在です4。
ドキュメントの「Chat prompt template」によると、Chat modelsではHumanMessagePromptTemplate
などのMessageのテンプレートを使うようです。
- テンプレート(文字列)から
from_template
メソッドでインスタンス化 format
メソッドでテンプレートの変数部分を埋められる
% python 2.prompts.py 次のコマンドの概要を説明してください。 コマンド: echo
Chains
3.chain.py
ここまでのモデルとプロンプトをつなぐ例です(LLMChain
)。
Chainsのドキュメントの「Get started」を参考にします5。
少し引っかかったのは以下の順にする必要があるという点。
- テンプレートの文字列からまず
HumanMessagePromptTemplate
を作る HumanMessagePromptTemplate
をリストに詰めて、ChatPromptTemplate
を作る- Chat modelsと
ChatPromptTemplate
をLLMChain
でつなぐHumanMessagePromptTemplate
を渡したところ、型が合わなかったようでPyDanticのエラー
% python 3.chain.py > Entering new chain... Prompt after formatting: Human: 次のコマンドの概要を説明してください。 コマンド: echo > Finished chain. 「echo」コマンドは、引数として与えられた文字列を標準出力に表示するために使用されます。また、シェルスクリプト内で変数の値を表示するためにも使用されます。引数を指定しない場合、改行だけを出力します。例えば、「echo Hello, World!」と入力すると、「Hello, World!」という文字列が表示されます。
verboseの出力で何が起こっているかはっきり分かります!
3.chain2.py
CoT -> Summarizeとつなぐ例。
- CoTの
LLMChain
- Summarizeの
LLMChain
- 上記2つをつなぐ
SimpleSequentialChain
- CoTの出力を自動でSummarizeのプロンプトの変数に埋めていました。すごい!!
だいぶ慣れてきたのでドキュメントをあまり見ず、「これでいけるんちゃうか」と書き換えていきました。
% python 3.chain2.py > Entering new chain... > Entering new chain... Prompt after formatting: Human: 以下の質問に回答してください。 ### 質問 ### 私は市場に行って10個のリンゴを買いました。隣人に2つ、修理工に2つ渡しました。それから5つのリンゴを買って1つ食べました。残りは何個ですか? ### 質問終了 ### ステップバイステップで考えましょう。 > Finished chain. 1. 最初に市場で10個のリンゴを買いました。 2. 隣人に2つ、修理工に2つ渡したので、残りは10 - 2 - 2 = 6個です。 3. その後、さらに5つのリンゴを買いました。残りのリンゴの数は6 + 5 = 11個です。 4. 1つリンゴを食べたので、残りは11 - 1 = 10個です。 よって、残りのリンゴの数は10個です。 > Entering new chain... Prompt after formatting: Human: 入力を結論だけ一言に要約してください。 ### 入力 ### 1. 最初に市場で10個のリンゴを買いました。 2. 隣人に2つ、修理工に2つ渡したので、残りは10 - 2 - 2 = 6個です。 3. その後、さらに5つのリンゴを買いました。残りのリンゴの数は6 + 5 = 11個です。 4. 1つリンゴを食べたので、残りは11 - 1 = 10個です。 よって、残りのリンゴの数は10個です。 ### 入力終了 ### > Finished chain. 市場で買ったリンゴは最終的に10個残りました。 > Finished chain. 市場で買ったリンゴは最終的に10個残りました。
動いたあああああ!!!
終わりに
StudyCoさんのLangChain入門のコードについて、モデル・プロンプト・チェインを使った例を最新のLangChainかつgpt-3.5-turboを使うように書き換えました。
- gpt-3.5-turboはChat modelsの1つで、複数のMessageを扱う
- プロンプトもMessageのプロンプトになる
- ChainsはChat modelsもLLMsと同様につなげるみたい
- CoT -> Summarizeの例、すげ〜〜〜!!!
LangChain、LLMを使ったアプリケーションをめっちゃサポートしてくれますね!!
引き続き時間を見つけて素振りしていこうと思います。
P.S. StudyCoさんの次回は6/29「LangChainソースコードリーディング」
GPTを使ったアプリケーション開発では、OpenAIの「Chat API」を使うのが定番ですが、実はLangChainでOpenAIのChat APIを「ちゃんと」使うには、LangChainのソースコードを読み解くことが役立ちます。
そこでこの勉強会では、LangChainでOpenAI Chat APIを「ちゃんと」使うことをテーマとして、ソースコードリーディングを実施していきます。
楽しみになってまいりました!
- ドキュメントの変更も激しそうなので、ソースのドキュメントを脚注に残します。https://github.com/hwchase17/langchain/blob/v0.0.215/docs/docs_skeleton/docs/modules/model_io/index.mdx↩
- https://github.com/hwchase17/langchain/blob/v0.0.215/docs/docs_skeleton/docs/modules/model_io/models/index.mdx↩
- https://github.com/hwchase17/langchain/blob/v0.0.215/docs/docs_skeleton/docs/modules/model_io/models/chat/index.mdx↩
- https://github.com/hwchase17/langchain/blob/v0.0.215/docs/docs_skeleton/docs/modules/model_io/prompts/prompt_templates/index.mdx↩
- https://github.com/hwchase17/langchain/blob/v0.0.215/docs/docs_skeleton/docs/modules/chains/index.mdx↩