💨

LangChainのPrompt Templates入門: 効率的にLLMを活用する秘訣

2024/12/09に公開

はじめに

「AIモデルに質問を投げかけても、毎回異なる応答が返ってくる…」
「一貫した出力を得るためのプロンプト設計が難しい…」
そんな悩みを解決するのがLangChainのPrompt Templatesです。

この記事では、以下を学びます:

  • Prompt Templatesの基礎とその必要性
  • 実際のPythonコードを使った活用方法
  • ChatPromptTemplateとの違いと応用例

また、LLMについてですがollamaの環境で行います。

今回のチュートリアルの説明範囲
参考資料
https://zenn.dev/kotai/articles/0676d7ce66b135

1. Prompt Templatesとは?

Prompt Templatesは、LLMに渡す入力をテンプレート化する仕組みです。以下のような場面で役立ちます:

  • 柔軟性: 同じテンプレートに異なる入力を与えるだけで使い回せる。
  • 一貫性: プロンプト設計を統一し、出力の質を安定化。
  • 効率化: 短いコードで強力なプロンプトを作成可能。

ユースケース例

  • カスタマーサポートでの動的な応答生成
  • 商品説明やレコメンデーションの自動生成
  • データ分析の自動化(例: 質問応答システム)

2. 基本的なPrompt Templatesの使い方

以下は、ユーザー名を使ったシンプルな例です。

from langchain.prompts import PromptTemplate

# Prompt Templateの作成
prompt = PromptTemplate(
    input_variables=["name"],
    template="こんにちは、{name}さん!今日はどんなお手伝いができますか?"
)

# テンプレートに値を挿入
formatted_prompt = prompt.format(name="太郎")
print(formatted_prompt)

出力例

こんにちは、太郎さん!今日はどんなお手伝いができますか?

これをLLMと組み合わせると、柔軟でパワフルなプロンプトを生成できます。

from langchain.llms import OpenAI

llm = OpenAI(model="gpt-3.5-turbo")
response = llm(formatted_prompt)
print(response)

3. ChatPromptTemplateの使い方

チャット形式のプロンプトを扱いたい場合は、ChatPromptTemplateを使います。このテンプレートでは、複数のロール(system, human, assistant)を持つことができます。

使用例: チャット形式のプロンプト

from langchain.prompts.chat import ChatPromptTemplate

chat_prompt = ChatPromptTemplate.from_messages([
    ("system", "あなたは歴史の専門家です。"),
    ("human", "ピラミッドについて教えてください。")
])

formatted_prompt = chat_prompt.format_messages()
print(formatted_prompt)

出力例

[SystemMessage(content='あなたは歴史の専門家です。', additional_kwargs={}, response_metadata={}), HumanMessage(content='ピラミッドについて教えてください。', additional_kwargs={}, response_metadata={})]

このように、複雑な対話構造も簡単に構築できます。


4. PromptTemplate vs ChatPromptTemplate

特徴 PromptTemplate ChatPromptTemplate
主な用途 単純な質問応答や命令生成 対話型アプリケーション
ロールの有無 ロールは不要 system, human, assistantロールが必要
ユースケース 簡易タスクや一括処理 チャットボットや複雑な対話型アプリ

なぜChatPromptTemplateにロールがあるのか?

ChatPromptTemplateは、モデルが文脈を理解しやすくするために設計されています。特に、以下のような場面で有効です:

  • system: モデルの振る舞いを設定(例: 優しい口調や専門的な回答)。
  • human: ユーザーの質問や命令を指定。
  • assistant: モデルが出力する応答を定義。

5. 応用例: 実践的な使い方

最後に、実際のプロジェクトでどのように活用できるかを示します。

商品説明生成

from langchain.prompts import PromptTemplate
from langchain_ollama.llms import OllamaLLM

# MODEL
model = OllamaLLM(model="llama3.2")

# Prompt Templateの作成
prompt = PromptTemplate(
    input_variables=["product_name", "features"],
    template="商品名: {product_name}\n特徴: {features}\nこの商品のセールスポイントを教えてください。"
)

# テンプレートに値を挿入
formatted_prompt = prompt.format(
    product_name="AIノートPC",
    features="高性能バッテリー、軽量設計、タッチスクリーン対応"
)


response = model.invoke(formatted_prompt)
print(response)

出力例

このAIノートPCのセールスポイントは以下の点にわたっています。

1.  **高性能バッテリー**:このノートPCには、長時間使用可能な高-performance バッテリーが搭載されています。ユーザーは長い thời gianを無制限で使用できるようになります。
2.  **軽量設計**:ノートPCの全体的な重量は軽いことになるため、長時間持ち運ぶことができ、手荷物やバッグに収まるので便利です。
3.  **タッチスクリーン対応**:このAIノートPCにはタッチスクリーンが搭載されています。これにより、ユーザーは多くのアプリケーションの操作をタブレット-like の体験できるようになります。

これらの特徴は、一般的なノートPCよりも優れたperformanceとmobilityを提供します。

質問応答システム

from langchain.prompts.chat import ChatPromptTemplate
from langchain_ollama.llms import OllamaLLM

# MODEL
model = OllamaLLM(model="llama3.2")

chat_prompt = ChatPromptTemplate.from_messages([
    ("system", "あなたはカスタマーサポート担当です。"),
    ("human", "{user_query}")
])

formatted_prompt = chat_prompt.format_messages(user_query="返品したい場合の手続きを教えてください。")

response = model.invoke(formatted_prompt)
print(response)

出力例

お客様は product を返品したいと思っており、ご案内します。

まず、返品の理由と商品の状態(新品か改造など)に関する確認が必要です。返品の理由は、以下の場合に適用されます。

- 商品が破損や傷害しています。
- 商品に問題があるかつ修理が不可能です。
- 商品が正確なものではないか、商品の説明書きと差別があります。

また、商品は新品であるか、改造したものか確認する必要があります。改造された商品を返品することはできません。

その後、返品の手続きを実行してください。以下の手順でお願いします。

1.  returns form を印刷またはダウンロードし、必要な情報を入力します。
2.  product のパッケージ内のカートリーチューム(カウチカバー)やラベルからパズルを解いて商品のコードを入力します。
3.  カウチカバーのシールを剥がって、商品の本体にシールを貼ります。
4.  returns form と商品の本体に必要な情報を記載し、送信します。

この手続きは必ず実行することで、返品の受付を受けることができます。ただし、返品の場合、商品が正確なものであるか、改造されたものではないか確認する必要があります。

返品の場合、商品が正確で、無傷であることを確認してください。改造した商品や破損した商品を返品すると、返金額が減少します。

また、返品に伴う費用は、以下のようなものがあります。

- Returns form の印刷コスト
- 実際に送信されるコスト

必要な情報を記載して、お客様のご質問にお答えするまで、ご協力ください。

6. 次のステップ

Prompt Templatesを使いこなせたら、次は以下を試してみてください:

  • 出力パーサー: LLMの応答をJSON形式などの構造化データに変換。
  • 複数のチェーンの連結: LangChainのチェーン機能を使って複雑なタスクを自動化。

LangChainを使ったアプリケーション開発のアイデアが広がります!

関連資料

https://zenn.dev/kotai/articles/0676d7ce66b135

https://zenn.dev/kotai/articles/94da1e64bf61c3

Discussion