nikkie-ftnextの日記

イベントレポートや読書メモを発信

「プロンプトエンジニアリングから始めるLangChain入門」の例をChatGPTを使うように書き直す(Models, Prompts, Chains) #StudyCo

はじめに

『かがみの孤城』円盤発売まであと2️⃣日、リオンくん!
リオンくんのパラレルワールドでは、6/26は日曜日。nikkieです。

アーカイブを視聴して概念を理解した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

% 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

少し引っかかったのは以下の順にする必要があるという点。

  1. テンプレートの文字列からまずHumanMessagePromptTemplateを作る
  2. HumanMessagePromptTemplateリストに詰めて、ChatPromptTemplateを作る
  3. Chat modelsとChatPromptTemplateLLMChainでつなぐ
    • 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を「ちゃんと」使うことをテーマとして、ソースコードリーディングを実施していきます。

楽しみになってまいりました!