はじめに
LangChain は、LLM(大規模言語モデル)と連携して効率的にプロンプトを生成・管理できるライブラリです。
プロンプトテンプレートを活用することで、定型文にユーザーの入力を差し込み、求める形式のリクエストを簡単に作成できます。
以下では、以下の 3 つのテンプレートについて解説します。
- PromptTemplate
単純なテキストテンプレートにユーザー入力を埋め込む基本的な機能。 - ChatPromptTemplate
チャット形式(システムメッセージ・ユーザーメッセージ)のプロンプトを作成するための機能。 - FewShotPromptTemplate
複数の回答例(Few-shotプロンプティング)を埋め込むことで、出力形式をコントロールするための拡張機能。
それでは、各テンプレートの使い方とコード例を順に見ていきましょう。
1. PromptTemplate の基本
概要
PromptTemplate
は、あらかじめ用意したテンプレート文字列中のプレースホルダに、ユーザーが入力した値を埋め込むシンプルな仕組みです。
たとえば、専門用語の解説を求めるプロンプトを作る場合、テンプレートに {term}
という変数を用意し、後から入力値(例:”人工知能”)を差し込むことができます。
コード例
以下は、技術用語「人工知能」について初心者向けに解説を求めるプロンプトを生成する例です。
from langchain.prompts import PromptTemplate
# テンプレート文字列を定義
template = """
次の技術用語を初心者にも分かりやすく解説してください。
技術用語:{term}
解説:
"""
# PromptTemplate オブジェクトを作成(テンプレート中に埋め込む変数は "term")
prompt = PromptTemplate(
input_variables=["term"],
template=template,
)
# ユーザー入力(ここでは "人工知能")を差し込んでプロンプトを生成
message = prompt.format(term="人工知能")
print(message)
出力例
上記コードを実行すると、以下のようなプロンプトが生成されます。
次の技術用語を初心者にも分かりやすく解説してください。
技術用語:人工知能
解説:
このように、シンプルなコードでテンプレートに値を埋め込むことができ、後はこのプロンプトを LLM に渡して解説を生成させるだけです。
2. ChatPromptTemplate によるチャット形式のプロンプト作成
概要
ChatPromptTemplate
は、チャットボットのやり取り形式(システムメッセージ、ユーザーメッセージなど)に最適化されたプロンプトを作成します。
各役割ごとにテンプレートを定義できるため、例えば「料理のプロ」としてのシステムメッセージと、ユーザーからの質問を組み合わせたチャット形式のリクエストを簡単に作成できます。
コード例
以下は、イタリア料理のプロとして、ピザ作りのコツを尋ねるチャット形式のプロンプトを生成する例です。
from langchain.prompts import (
ChatPromptTemplate,
SystemMessagePromptTemplate,
HumanMessagePromptTemplate,
)
# システムメッセージのテンプレート(変数 {topic} を利用)
system_template = "あなたは、{topic}に精通した料理のプロです。ユーザーからの質問には50文字以内で具体的な回答をしてください。"
# ユーザーメッセージのテンプレート
human_template = "{question}"
# ChatPromptTemplate を生成
chat_prompt = ChatPromptTemplate.from_messages([
SystemMessagePromptTemplate.from_template(system_template),
HumanMessagePromptTemplate.from_template(human_template),
])
# 変数に値を渡して、最終的なチャット形式のプロンプトリストを生成
messages = chat_prompt.format_prompt(
topic="イタリア料理",
question="ピザを自宅で美味しく作るコツは何ですか?"
).to_messages()
# プロンプトリストの内容を表示
print(messages)
出力例
実行結果は、以下のようなチャットメッセージのリストになります。
[
SystemMessage(content='あなたは、イタリア料理に精通した料理のプロです。ユーザーからの質問には50文字以内で具体的な回答をしてください。', additional_kwargs={}, response_metadata={}),
HumanMessage(content='ピザを自宅で美味しく作るコツは何ですか?', additional_kwargs={}, response_metadata={})
]
このプロンプトリストは、Chat Completions API などに渡すことで、LLM から適切な回答を引き出すことが可能です。
3. FewShotPromptTemplate を使った Few-shot プロンプティング
概要
Few-shot プロンプティングでは、複数の回答例をプロンプトにあらかじめ埋め込むことで、出力形式や回答の精度を向上させるテクニックです。FewShotPromptTemplate
は、この手法を簡単に実現するための機能で、例となる入力と出力のペアを指定しておくことで、LLM に対して「この形式で答えてください」と指示できます。
コード例
ここでは、英単語の日本語訳を求めるプロンプトを例に解説します。
いくつかの英単語とその訳を例として用意し、最終的に新たな単語(例:”cat”)に対する日本語訳を生成してもらいます。
from langchain.prompts import FewShotPromptTemplate, PromptTemplate
# 回答例(例:英単語とその日本語訳)のリスト
examples = [
{"word": "apple", "translation": "りんご"},
{"word": "book", "translation": "本"},
{"word": "dog", "translation": "犬"},
]
# 各例の出力形式を定義するテンプレート
example_template = "英単語:{word}\n日本語訳:{translation}\n"
# PromptTemplate を使って例のフォーマットを定義
example_prompt = PromptTemplate(
input_variables=["word", "translation"],
template=example_template,
)
# FewShotPromptTemplate を作成
fewshot_prompt = FewShotPromptTemplate(
examples=examples, # 用意した例のリスト
example_prompt=example_prompt, # 各例を整形するためのテンプレート
prefix="以下の英単語の日本語訳を答えてください。\n",
suffix="英単語:{word}\n日本語訳:", # ユーザー入力後の出力形式を定義
input_variables=["word"],
example_separator="\n" # 例同士の区切り
)
# ユーザーからの入力 "cat" を使ってプロンプトを生成
message = fewshot_prompt.format(word="cat")
print(message)
出力例
実行すると、生成されるプロンプトは以下のようになります。
以下の英単語の日本語訳を答えてください。
英単語:apple
日本語訳:りんご
英単語:book
日本語訳:本
英単語:dog
日本語訳:犬
英単語:cat
日本語訳:
このように、事前に例を用意しておくことで、LLM に対して出力形式を明確に指示でき、例えばシンプルな訳語(ここでは「猫」)のみを得ることが期待できます。
まとめ
今回紹介した LangChain のプロンプトテンプレート機能を使うことで、さまざまなシーンで柔軟なプロンプト生成が可能になります。
- PromptTemplate:定型のテキストプロンプトにユーザー入力を埋め込うことができる
- ChatPromptTemplate:チャット形式の会話プロンプトを組み立てることができる
- FewShotPromptTemplate:Few-shot プロンプティングの手法で出力フォーマットを制御できる
LangChain を用いたプロンプト生成の技術は、幅広い分野での活用が期待されます。ぜひ、実際のプロジェクトに取り入れて、さらなる可能性を探ってみましょう。