LangChainを使用したプロンプト・チェーン:包括的な概要

著者

Vrunda Gadesha

AI Advocate | Technical Content Author

プロンプト・チェーンは、大規模言語モデル(LLM)を使用して高度なワークフローを構築する際の基本的な概念です。複数のプロンプトを論理的なシーケンスで結び付け、あるプロンプトのアウトプットが次のプロンプトのインプットとして機能するようにします。このモジュール式アプローチは、多段階テキスト処理、要約、質問応答などの複雑なタスクの解決に強力です。

LangChainは、このようなワークフローの作成を簡素化するために設計された多用途フレームワークです。IBM GraniteモデルやOpenAIのGPT(Generative Pre-trained Transformer)モデルなどのLLMを管理し、カスタムプロンプトを定義し、それらを再利用可能なチェーンに接続するためのツールを提供します。LangChainでは、プロンプト管理の複雑さを抽象化することで、開発者はLLMとのやり取りをオーケストレーションするのではなく、問題の解決に集中できるようになります。

このチュートリアルでは、次のことを行います。

  1. さまざまなタイプのプロンプト・チェーン(シーケンシャル、分岐、反復など)を調べます。
  2. シーケンシャル、分岐、反復チェーンの各タイプを組み合わせた汎用チェーンのサンプルを実装します。
  3. PromptTemplate、LLMChain、SequentialChainなどのLangChainの組み込みクラスを活用して、ワークフローを定義および管理します。

LangChainでプロンプト・チェーンを管理する方法

LangChainでは、チャットボットアプリケーションでモジュール式ワークフローを構築するための強力なフレームワークを提供します。構造化プロンプト、動的チェーン、高度なLLM統合を組み合わせることで、開発者はRAG技術を活用し、JSONなどの構造化されたアウトプットを提供するスケーラブルで適応性のあるパイプラインを作成できます。LangChainがプロンプト・チェーンを効果的に処理する方法は次のとおりです。

プロンプトの抽象化:LangChainでは、from_templateを活用して各ステップの構造化された入出力ワークフローを設計し、複雑なチャットボット・オペレーションを簡単に処理できるようにします。

LLM統合:このフレームワークでは、IBM Granite、OpenAI、Hugging FaceなどのさまざまなLLMとシームレスに統合されており、カスタマイズされたタスクに合わせてファイン・チューニングすることができます。

チェーン管理:LangChainのSequentialChainとSimpleSequentialChainがチャットボットパイプライン用のモジュール式ワークフローを可能にし、StroutputparserがJSONなどの構造化されたアウトプットを実現します。

動的なワークフロー:LangChainでは、ConditionalChainやシステムメッセージテンプレートなどのツールを使用して、動的コンテンツ生成のためのRAG(検索拡張生成)の原則に沿った適応型ワークフローをサポートします。

このチュートリアルが終わるまでに、LangChainを使用して幅広い用途向けのモジュール式で拡張可能なワークフローを構築する方法をしっかり理解できるようになります。

プロンプト・チェーンの種類

プロンプト・チェーンを使用すると、あるステップからのアウトプットが次のステップに渡されるワークフローを設計できます。さまざまなタイプのチェーンが、単純な逐次タスクからより複雑で動的なプロセスまで、多様なワークフローをサポートします。プロンプト・チェーンの種類を簡単に説明します。

  • シーケンシャル・チェーン:最も単純なタイプのチェーンで、アウトプットがインプットとして次のプロンプトに直接渡されます。このオプションは、直線的な進行のタスクに最適です。[1]

  • 分岐チェーン:分岐チェーンでは、一つのアウトプットが複数の並列ワークフローに分割されます。分岐ごとにアウトプットを個別に処理します。[2]

  • 反復チェーン:反復チェーンでは、指定された条件が満たされるまでプロンプトまたはチェーンを繰り返し実行します。このオプションはアウトプットを洗練させるのに役立ちます。[3]

  • 階層的チェーン:このタイプでは、大規模なタスクを小さなサブタスクに分解し、階層的に実行します。下位レベルのアウトプットは、上位レベルのタスクにフィードされます。[4]

  • 条件付きチェーン:条件付きチェーンでは、前のプロンプトのアウトプットに基づいて次のステップを動的に選択します。ワークフロー内での意思決定を可能にします。

  • マルチモーダル・チェーン:マルチモーダル・チェーンでは、さまざまなデータタイプ(テキスト、画像、音声など)を処理するプロンプトを統合します。複数のモダリティーを組み合わせる用途に適しています。[2]

  • 動的チェーン:動的チェーンは、リアルタイムアウトプットや変化する条件に基づいてワークフローを適応させます。これにより、プロンプト・チェーンに柔軟性が加わります。[5]

  • 再帰的チェーン:再帰的チェーンでは、大規模なインプットを個々の処理のために小さなチャンクに分割し、その結果を結合します。長いドキュメントやデータセットの処理に役立ちます。[6]

  • リバース・チェーン:リバース・チェーンでは、期待されるアウトプットから始まり、それを達成するために必要なインプットやステップを決定します。問題解決とデバッグに最適です。[5]

各タイプのチェーンは固有のユースケースに対応しているため、タスクの複雑さと要件に基づいて適切なチェーンを選択することが不可欠です。

ユースケース - 多段階テキスト処理

このワークフローでは、チャット・モデルとプロンプト・エンジニアリングを使用して顧客からのフィードバックを処理し、スケーラブルなテキスト処理パイプラインを構築します。本チュートリアルの次のステージでは、生成AIを活用したシーケンシャル、分岐、反復チェーンの手法を紹介します。

キーワードの抽出(シーケンシャル・チェーン)

  • 自然言語で指定された入力テキストまたはユーザー入力は、プロンプトを通じて処理され、重要なキーワードが識別されます。
  • このステップでは、シーケンシャル・チェーンを使用して、抽出されたキーワードが後続タスクに直接フィードされるようにします。

センチメントサマリーの生成(分岐チェーン)

  • 抽出されたキーワードはチャット・モデルに渡され、感情の要約が生成されます。
  • 分岐チェーンにより、要約のための並列パスが可能になり、コンテキストに基づいてアウトプットを適応させることができます。

センチメントサマリーの改善(反復チェーン)

  • センチメントサマリーが事前に定義された品質基準を満たしていない場合は、改善プロンプトに渡されます。
  • 反復チェーンにより、アウトプットが期待されるレベルの精度を満たすまで再処理が可能になります。

最終アウトプット

  • 改善されたセンチメントサマリーは最終的なアウトプットとして納品され、ユーザーには洗練された洞察が提供されます。
  • ここでは、プロンプト・エンジニアリング、生成AI、高度なチェーン技術の統合を示しています。

このアプローチでは、Pythonのシーケンシャル、分岐、反復チェーンが、チャット・モデルとプロンプト・エンジニアリングと組み合わせられます。キーワードの抽出、センチメント分析、改善に生成AIを活用し、顧客からのフィードバックを確実に処理します。

前提条件

watsonx.aiプロジェクトを作成するにはIBM Cloudアカウントが必要です。

手順

ステップ1. 環境を設定する

いくつかあるツールの中から選択することもできますが、このチュートリアルでは、Jupyter Notebookを使用してIBMアカウントを設定する方法について説明します。

  1. IBM Cloudアカウントを使用して、watsonx.aiにログインします。
  2. watsonx.aiプロジェクトを作成します。プロジェクトIDはプロジェクト内から取得できます。管理(Manage)タブをクリックし、全般(General)ページの詳細(Details)セクションからプロジェクトIDをコピーします。このチュートリアルではこのIDが必要になります。
  3. Jupyter Notebookを作成します。

このステップでは、このチュートリアルのコードをコピーできるノートブック環境を開きます。あるいは、このノートブックをローカル・システムにダウンロードし、watsonx.aiプロジェクトにアセットとしてアップロードすることもできます。さらにGraniteのチュートリアルを表示するには、IBM Graniteコミュニティをご覧ください。このチュートリアルは、GitHubでも公開されています。

ステップ2. watsonx.aiランタイム・サービスとAPIキーを設定する

  1. watsonx.aiランタイム・サービス・インスタンスを作成します(無料インスタンスであるLiteプランを選択します)。
  2. APIキーを生成します。
  3. watsonx.aiランタイム・サービスを、watsonx.aiで作成したプロジェクトに関連付けます。

ステップ3. パッケージのインストール

LangChainフレームワークとwatsonxLLMを連携させるには、ライブラリーが必要です。まず、必要なパッケージをインストールしましょう。

注:古いバージョンの「pip」を使用している場合は、コマンド「pip install --upgrade pip」を使用してアップグレードできます。この手順は、古いバージョンと互換性がない可能性がある最新のパッケージを簡単にインストールするのに役立ちます。ただし、既に最新バージョンを使用している場合、または最近パッケージをアップグレードした場合は、このコマンドをスキップできます。

!pip install --upgrade pip
%pip install langchain
!pip install langchain-ibm

ステップ4. 必要なライブラリーをインポートする

このコード・ブロックでは、LangChainとIBM Watson LLMを使用してLLMアプリケーションを構築および管理するために不可欠なPythonライブラリーとツールをインポートします。

osモジュールは、プロジェクトの認証情報やAPIキーなどの環境変数にアクセスするために使用されます。

WatsonxLLMはlangchain_ibmのモジュールで、生成AIモデルからアウトプットを生成するためのIBM Watson LLMを統合します。

PromptTemplateは、プロンプトの再利用可能なテンプレートを作成するのに役立ち、プロンプト・エンジニアリングにおけるインプット構造と柔軟性を確保します。

LLMChainは、個々のタスクチェーンを構築する一方で

SequencialChainは、複数のステップを単一のワークフローにリンクし、「getpass」は画面上に公開することなく、機密情報(APIキーなど)を安全に取得します。

import os
from langchain_ibm import WatsonxLLM
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain, SequentialChain
import getpass

ステップ5. 認証情報を設定する

このコードでIBM Watson Machine Learning(WML)APIにアクセスするための認証情報を設定し、PROJECT_IDが正しく構成されていることを確認します。

  • 辞書の認証情報は、WMLサービスのURLとAPIキーを使用して作成されます。機密情報の漏洩を避けるため、APIキーはgetpass.getpassを使用して安全に収集されます。
  • このコードでは、os.environ関数を使用して環境変数からPROJECT_IDを取得しようとします。PROJECT_IDが見つからない場合、ユーザーはインプットを通じて手動で入力するように求められます。
# Set up credentials
credentials = {
    "url": "https://us-south.ml.cloud.ibm.com", # Replace with the correct region if needed
    "apikey": getpass.getpass("Please enter your WML API key (hit enter): ")
}

# Set up project_id
try:
    project_id = os.environ["PROJECT_ID"]
except KeyError:
    project_id = input("Please enter your project_id (hit enter): ")

ステップ6. 大規模言語モデルを初期化する

このコードでは、アプリケーションで使用するためにIBM Watson LLMを初期化します。

  1. このコードでは、命令ベースの生成AIタスク用に設計されたibm/granite-3-8b-instructモデルを使用してWatsonxLLMのインスタンスを作成します。
  2. 以前に設定した認証情報のurlapikeyproject_idの値が、認証のために渡され、IBM Watson LLMサービスに接続されます。
  3. max_new_tokensパラメーターを設定して、各応答でモデルが生成するトークンの数を制限します(この場合は150トークン)。

このステップでは、Watson LLMがワークフローで応答を生成できるように準備します。

# Initialize the IBM LLM
llm = WatsonxLLM(
    model_id="ibm/granite-3-8b-instruct",
    url=credentials["url"],
    apikey=credentials["apikey"],
    project_id=project_id,
    params={
    "max_new_tokens": 150
    }
)   

ステップ7. プロンプト・テンプレートを定義する

このコードでは、テキスト処理ワークフローの3つの段階でプロンプト・テンプレートを定義します。

  1. キーワード抽出:keyword_promptは、提供されたテキストから最も重要なキーワードを抽出するように設計されています。プレースホルダー{text}を使用してインプットを動的に挿入します。
  2. センチメントサマリーの生成:sentiment_promptでは、抽出された{keywords}をインプットとして受け取り、フィードバックのセンチメントサマリーを生成します。このテンプレートにより、センチメント生成は、指定されたキーワードに確実に重点を置きます。
  3. サマリーの改善:refine_promptでは、{sentiment_summary}をインプットとして使用することで、センチメントサマリーを改善します。アウトプットを簡潔かつ正確にすることに重点を置いています。

これらのPromptTemplateインスタンスにより、LLMアプリケーションの再利用可能で構造化されたプロンプト・エンジニアリングが可能になります。

# Define Prompt Templates

# Prompt for extracting keywords
keyword_prompt = PromptTemplate(
    input_variables=["text"],
    template="Extract the most important keywords from the following text:\n{text}\n\nKeywords:"
)

# Prompt for generating sentiment summary
sentiment_prompt = PromptTemplate(
    input_variables=["keywords"],
    template="Using the following keywords, summarize the sentiment of the feedback:\nKeywords: {keywords}\n\nSentiment Summary:"
)

# Prompt for refining the summary
refine_prompt = PromptTemplate(
    input_variables=["sentiment_summary"],
    template="Refine the following sentiment summary to make it more concise and precise:\n{sentiment_summary}\n\nRefined Summary:"
)

ステップ 8. チェーンを作成する

このコードでは、プロンプトを初期化されたIBM Watson LLMに接続して各段階に一意のアウトプットを割り当てるチェーンを定義します。

  1. キーワードチェーン:keyword_chainではkeyword_promptを使用して入力テキストからキーワードを抽出します。結果は、後続のステップで使用するために、一意のキー「キーワード」の下に保管されます。
  2. センチメントチェーン:sentiment_chainでは、抽出されたキーワードを取得し、sentiment_promptを使用してセンチメントサマリーを生成します。アウトプットには「sentiment_summary」というラベルが付けられます。
  3. 改善チェーン:refine_chainでは、生成されたセンチメントサマリーをrefine_promptを使用して処理します。改善された最終的なアウトプットは、「refined_summary」というキーとともに保管されます。

これらのLLMChainインスタンスでは、モジュール式タスクの実行を可能にし、段階的なLLMアプリケーションのワークフローを容易にします。

# Define Chains with Unique Keys

# Chain to extract keywords
keyword_chain = LLMChain(
    llm=llm,
    prompt=keyword_prompt,
    output_key="keywords" # Unique key for extracted keywords
)

# Chain to generate sentiment summary
sentiment_chain = LLMChain(
    llm=llm,
    prompt=sentiment_prompt,
    output_key="sentiment_summary" # Unique key for sentiment summary
)

# Chain to refine the sentiment summary
refine_chain = LLMChain(
    llm=llm,
    prompt=refine_prompt,
    output_key="refined_summary" # Final refined output
)

ステップ9. チェーンを結合する

このコードでは、以前に定義したチェーンがシーケンシャルワークフローに結合され、テキスト入力の段階的なプロセスが可能になります。SequentialChainでは、keyword_chainsentiment_chainrefine_chainを定義された順序でリンクし、あるチェーンのアウトプットが次のチェーンのインプットとして機能するようにします。ワークフローはテキストを最初のインプットとして受け入れるように構成されており、最終アウトプットである改善されたセンチメントサマリーは、キー「refined_summary」に保管されます。これにより、LLMアプリケーションの合理化された効率的な実行が可能になり、一貫性のあるモジュール式処理パイプラインが実現します。

# Combine Chains into a Sequential Workflow

workflow = SequentialChain(
    chains=[keyword_chain, sentiment_chain, refine_chain],
    input_variables=["text"], # Initial input for the workflow
    output_variables=["refined_summary"] # Final output of the workflow
)

ステップ10. ワークフローを実行する

このコード・ブロックでは、ワークフロー全体を実行します。まず、feedback_textとして定義された複数行のフィードバック文字列があり、アプリに関する肯定的なユーザー・コメントと否定的なユーザー・コメントの両方が含まれています。workflow.runメソッドでは、入力されたインプットを使用し、シーケンシャル・チェーン(キーワード抽出、センチメント分析、改善)を通じてフィードバックを処理します。そして、改善されたセンチメントサマリーが最終成果として直接印刷されます。

# Example Input Text

feedback_text = """
    I really enjoy the features of this app, but it crashes frequently, making it hard to use.
    The customer support is helpful, but response times are slow.

    I tried to reachout to the support team, but they never responded

    For me, the customer support was very much helpful. Ihis is very helpful app. Thank you for grate services.

"""

# Run the Workflow

result = workflow.run({"text": feedback_text})

# Display the Output

print("Refined Sentiment Summary:")
print(result) # Directly print the result since it is a string

アウトプット

改善されたセンチメントサマリー:

アプリの機能や、時折有用なカスタマー・サポートは高く評価しているものの、アプリのクラッシュが繰り返され、カスタマー・サポートの応答時間も遅いため、ユーザーの感情は主に否定的です。ユーザー満足度を高めるために、開発チームはアプリのクラッシュの解決とカスタマー・サポートの対応の迅速化に重点を置く必要があります。

改善されたセンチメントサマリーは、フィードバックの簡潔かつ明確な評価です。アプリの機能に対するユーザーの評価を強調していますが、頻繁なクラッシュやカスタマー・サポートの遅さに対する不満を表し、ワークフローがクリティカルな洞察を効果的に抽出できることを反映しています。

適切なチェーン・タイプの選択方法

LLMアプリケーションに適したチェーン・タイプを選択するには、効率と一貫性を確保するための重要な要素を評価します。

タスクの複雑さ:複数のステップを含むタスクには実行可能なワークフローを使用します。few-shotのサンプルやchatprompttemplateは、さまざまなプロンプトを必要とする複雑なタスクを構造化するのに役立つことがあります。

依存関係:あるステップからのアウトプットが次のプロンプトのプレースホルダーである場合は、シーケンシャル・チェーンを使用します。アウトプット・パーサーは、アウトプットを構造化されたインプットにスムーズに移行できるようにします。

適応性:LangChainエージェントが関与するような動的なワークフローの場合、反復チェーンによりパラメーターと次のプロンプトをリアルタイムに調整できます。

データのモダリティー:さまざまなデータ・タイプに対応したワークフローを選択します。テキストおよびベクトル・データの埋め込みメソッド、またはLangChain Expression Languageを使用して、柔軟性の高いオペレーションを実現します。

これらの要素を考慮することで、一貫したチェーン・ワークフローを備えた堅牢で適応性のあるLLMアプリケーションを構築できます。

まとめ

プロンプト・チェーンは、高度な自然言語処理(NLP)ワークフローを構築するための多用途な手法です。このチュートリアルでは、さまざまなチェーン・タイプを検討し、複数のチェーン・アプローチを統合する一般的なサンプルを示しました。これらの方法を実験することで、実際のアプリケーションに対する言語モデルの可能性を最大限に引き出すことができます。

関連ソリューション
IBM watsonx.ai

AI開発者向けの次世代エンタープライズ・スタジオであるIBM watsonx.aiを使用して、生成AI、基盤モデル、機械学習機能をトレーニング、検証、チューニング、導入しましょう。わずかなデータとわずかな時間でAIアプリケーションを構築できます。

watsonx.aiの詳細はこちら
人工知能ソリューション

IBMの業界をリードするAIの専門知識とソリューションのポートフォリオを活用して、AIをビジネスの業務に利用しましょう。

AIソリューションの詳細はこちら
人工知能(AI)コンサルティングおよびサービス

IBMコンサルティングAIサービスは、企業がAIをトランスフォーメーションに活用する方法を再考するのに役立ちます。

AIサービスの詳細はこちら
次のステップ

AIを使用することで、IBM Concertはお客様のオペレーションに関する重要な洞察を明らかにし、改善のためのアプリケーション固有の推奨事項を提供します。Concertがどのようにビジネスを前進させることができるかをご覧ください。

Concertの詳細はこちら ビジネス・プロセス自動化ソリューションの詳細はこちら
脚注

[1] Roegiest, A., & Chitta, R. (2024). Answering Questions in Stages: Prompt Chaining for Contract QA.

[2] Ge, J., Luo, H., Qian, S., Gan, Y., Fu, J., & Zhang, S. (2023). Chain of Thought Prompt Tuning in Vision Language Models.

[3] Sun, S., Yuan, R., Cao, Z., Li, W., & Liu, P. (2024). Prompt Chaining or Stepwise Prompt? Refinement in Text Summarization. , 7551-7558. https://arxiv.org/abs/2406.00507.

[4] Huang, Q., Zhu, J., Li, Z., Xing, Z., Wang, C., & Xu, X. (2023). PCR-Chain: Partial Code Reuse Assisted by Hierarchical Chaining of Prompts on Frozen Copilot. 2023 IEEE/ACM 45th International Conference on Software Engineering: Companion Proceedings (ICSE-Companion), 1-5. https://ieeexplore.ieee.org/document/10172550.

[5] Wu, T., Jiang, E., Donsbach, A., Gray, J., Molina, A., Terry, M., & Cai, C. (2022). PromptChainer: Chaining Large Language Model Prompts through Visual Programming. CHI Conference on Human Factors in Computing Systems Extended Abstracts. https://dl.acm.org/doi/10.1145/3491101.3519729.

[6] Trautmann, D. (2023). Large Language Model Prompt Chaining for Long Legal Document Classification. ArXiv, abs/2308.04138. https://arxiv.org/abs/2308.04138.