第 7 章 ChatGPT による開発実践の促進
LangChain フレームワークでのプロンプトの適用
このセクションでは、主に産業レベルのソース コードと特定のプロジェクトに基づいたプロンプト エンジニアリングについて説明します。エンジニアであろうと、技術的背景のない人であろうと、誰もがプロンプト ワードについて聞いたことがあるか、頻繁に使用します。つまり、OpenAI を使用するときは、その API または ChatGPT を使用して、プロンプト ワードを使用して通信します。図 7-1 に示すように、これは ChatGPT インターフェイスです。著者は通常、GPT-4 ラージ モデルを使用します。
図 7-1 ChatGPT インターフェイス
ここに入力する情報はすべて、モデルの観点からはプロンプトと呼ばれますが、産業グレードのプロンプトは、誰もが一般に理解しているプロンプトと同じではありません。まず、産業グレードのプロンプトがどのようなものかを見てみましょう。図 7-2 に示すように、多くの具体的な例を用意しました。これらの例は、基本的に DeepLearning.AI から来ています。プロンプトの観点から見ると、これらの例は非常に体系的で、非常に価値があります。たとえば、ここで述べた思考の連鎖は、明らかに非常に重要なものです。重要な例です。ギャビンの WeChat アカウント: NLP_Matrix_Space
図 7-2 プロンプトの単語のケース
現在、オープンソース、産業界、学術界で最も認知されている大規模アプリケーション開発フレームワークは、LangChain であり、これには多数のプロンプト ワードが使用されており、プロンプト ワードは、業界の実践や学術研究の実践だけでなく、多くの人々によってレビューされ、改良されてきました。LangChain のソース コードをダウンロードすると、図 7-3 に示すように、LangChain には基本的にさまざまな機能の下にプロンプト ワード (Prompt) があることがわかります。
図 7-3 LangChain 関数のディレクトリ
簡単な例を挙げると、図 7-4 に示すように、任意のディレクトリ (retrieval_qa など) に注目すると、base.py は基本的な API と考えることができ、コア部分はそのプロンプト ワード (prompt) です。
図 7-4 retrieval_qa のプロンプトワード
prompt.py のプロンプトには、「次のコンテキストの部分を使用して、最後に質問に答えてください。答えがわからない場合は、わからないと言ってください。答えを作成しようとしないでください。」 (「次のコンテキストの部分を使用して、質問に答えてください。答えがわからない場合は、わからないと言ってください。答えを作成しようとしないでください。」) と記述されたテンプレート (テンプレート) が含まれます。
プロンプト.py のコード実装:
#flake8:私
langchain.prompts から PromptTemplate をインポート
プロンプト_テンプレート = """次のコンテキストを使用して、最後の質問に答えてください。答えがわからない場合は、単にわからないと言ってください。答えをでっち上げようとしないでください。
{コンテクスト}
質問: {質問}
役立つ回答:「」
PROMPT = プロンプトテンプレート(
template=prompt_template、input_variables=["コンテキスト", "質問"]
もう一度例を見てみましょう。たとえば、question_answering では、map_reduce_prompt、map_rerank_prompt、refine_prompts、stuff_prompt などのプロンプト テンプレートに関する情報が提供されます。
図 7- 5 質問応答のプロンプトワード
map_reduce_prompt.py コードは、質問プロンプト テンプレートを独自の特定の形式で設定します。「長い文書の次の部分を使用して、質問への回答に関連するテキストがあるかどうかを確認します。関連するテキストをそのまま返します」 (「長い文書の次の部分を使用して、質問への回答に関連するテキストがあるかどうかを確認し、関連するテキストをそのまま返す」)、ここではコンテキストがあり、質問と関連するコンテンツがあります。
map_reduce_prompt.py のコード実装:
…
question_prompt_template = """長い文書の次の部分を使用して、質問の回答に関連するテキストがあるかどうかを確認します。
関連するテキストをそのまま返します。
{コンテクスト}
質問: {質問}
関連するテキスト (ある場合):"""
QUESTION_PROMPT = プロンプトテンプレート(
template=question_prompt_template、input_variables=["コンテキスト", "質問"]
)
system_template = """長い文書の次の部分を使用して、質問の回答に関連するテキストがあるかどうかを確認します。
関連するテキストをそのまま返します。
______________________
{コンテクスト}"""
メッセージ = [
SystemMessagePromptTemplate.from_template(system_template),
HumanMessagePromptTemplate.from_template("{質問}"),
】
CHAT_QUESTION_PROMPT = ChatPromptTemplate.from_messages(メッセージ)
……。
図 7-6 に示すように、query_constructor も見てください。
図 7-6 query_constructor のプロンプトワード
プロンプト.py コード ファイルには、プロンプト ワードに関する説明も含め、プロンプト ワードに関する多くの情報も提供されます。
プロンプト.py のコード実装:
…。
EXAMPLES_WITH_LIMIT = [
{
「い」:1、
「データソース」: SONG_DATA_SOURCE、
"user_query": "ダンス ポップ ジャンルで 3 分以内の 10 代の恋愛を描いたテイラー スウィフトやケイティ ペリーの曲は何ですか",
「構造化リクエスト」: FULL_ANSWER、
}、
{
「い」:2、
「データソース」: SONG_DATA_SOURCE、
"user_query": "Spotify で公開されていない曲は何ですか",
「構造化リクエスト」: NO_FILTER_ANSWER、
}、
{
「い」:3、
「データソース」: SONG_DATA_SOURCE、
"user_query": "愛についての曲を 3 曲挙げてください",
"構造化リクエスト": WITH_LIMIT_ANSWER,
}、
】
EXAMPLE_PROMPT_TEMPLATE = """\
<< 例 {i}。>>
情報元:
{情報元}
ユーザークエリ:
{ユーザークエリ}
構造化されたリクエスト:
{構造化_リクエスト}
「」
EXAMPLE_PROMPT = プロンプトテンプレート(
input_variables=["i", "データソース", "ユーザークエリ", "構造化リクエスト"],
テンプレート=EXAMPLE_PROMPT_TEMPLATE、
)
…。
ただし、このセクションで焦点を当てるのはエージェントです。図 7-7 に示すように、エージェントにはさまざまな種類があり、特に重要な 2 つのエージェントに注意する必要があります。1 つは React で、もう 1 つは mrkl と呼ばれます。ギャビンの WeChat アカウント: NLP_Matrix_Space
図 7-7 LangChain のエージェントディレクトリ
業界規模の大規模なモデルベースのアプリケーション開発を行う場合、通常、エージェントと総称されるマネージャーが必要ですが、ChatGPT プラグイン (プラグイン) について話すとき、実際にはエージェントの観点から物事を考える、つまりエージェントの考え方です。gpt-4-0613 と gpt-3.5-turbo-0613 は、2023 年 6 月に OpenAI によってリリースされた新しいモデルです。関数呼び出し (関数呼び出し) を十分にサポートできます。OpenAI の公式 Web サイトのドキュメントには、非常に重要な文が記載されています。「大規模なモデルは、情報から関数の名前とパラメーターを抽出し、関数を動員するためにそれらをあなたに渡します。サーバー)」。LangChainの話に戻りますが、実はLangChainにはChatGPTプラグインの機能をはじめ、OpenAIの関数呼び出し(関数呼び出し)の機能も含め、上記の機能がすべて含まれており、OpenAIが提供する機能はすぐにLangChainにマッピングすることができます。したがって、ここでの中心的な問題は、単に情報を入力すると結果が得られるのではなく、それを効果的に機能させることです。もちろん、結果にはいくつかのステップや対話などが含まれる場合があります。ただし、エージェントが存在しない場合はテキストの生成のみでアクション(Action)を実行できず、アプリケーションを開発する場合はエージェント(Agent)の主な役割であるActionを実装する必要があります。オープンソース ソフトウェアの命名という観点から見ると、LangChain の当初は、中心的な焦点はチェーンにあり、その後はエージェントに重点が置かれました。
図 7-8 に示すように、mrkl エージェントのディレクトリ構造ですが、「MRKL Systems」論文の著者は、miracle の発音と同じ ˈmɪrək(ə)l と発音しています。
図 7-8 mrkl のディレクトリ構造
図 7-9 に示すように、MRKL (Modular Reasoning, Knowledge and Language) は、ニューラル モデルと記号推論機能を考慮して、ニューラル ネットワーク モデル、外部知識ベース、エキスパート システムを組み合わせ、自然言語処理の効率を向上させる新しいタイプの言語理解システムです。
図 7-9 MRKL アーキテクチャの概略図