前章では、LangChainを使ってLLMを効率的に実装する方法を紹介しました。第2章では、LLMを安定して活用するための重要な仕組みである PromptTemplateとパイプライン構文について解説します。
PromptTemplateは、LLMに渡す質問や指示の型をあらかじめ決めておく仕組みです。これにより、質問の形式が統一され、回答の質を安定させることができます。
また、パイプライン構文を利用すると、プロンプトの生成からLLMの呼び出し、応答の取得までをスムーズに一連の流れとして扱えるようになります。
1. PromptTemplateの役割
LLMは、ユーザから入力されたテキストに応じて回答を返します。
例えば、直接質問を渡す場合は次のようになります。
from langchain_ollama import OllamaLLM
llm = OllamaLLM(model="llama3.1:8b")
response = llm.invoke("中学生にもわかるようにブラックホールについて解説してください。")
print(response)
この場合、質問文は自由形式で記述されています。しかし、多様な質問を扱うアプリでは、質問文の書き方が毎回バラバラだと、回答の質や内容にムラが出やすくなります。
そこで、PromptTemplateを利用します。PromptTemplateは「質問文の型」をテンプレート化し、変数だけ差し替えて使える仕組みです。これにより、統一感のある質問文(プロンプト)を簡単に扱うことができます。
例えば次のようなテンプレートを考えます。
以下のトピックについて中学生にもわかるように解説してください:\n{topic}
ここで {topic} に「ブラックホール」や「Python」などの変数を入れることで、質問文(プロンプト)が完成します。PromptTemplateを利用することで、アプリ内で一貫した指示をLLMに渡すことができ、安定した応答が得られます。
2. PromptTemplateの活用例
PromptTemplateを利用すると、様々な場面で活用できます。
教育向け解説アプリ
ユーザーが入力したトピックについて、中学生にもわかるように解説を作るアプリ。
以下のトピックについて中学生にもわかるように解説してください:\n{topic}
自動文章作成サポート
ブログ記事のタイトルを入力すると、その冒頭文を生成するツール。
以下のタイトルに合うブログ記事の冒頭文を作成してください:\n{title}
ビジネス用自己紹介自動生成
職種やスキル、性格を入力して自然な自己紹介文を作成するツール。
私は{job}です。得意なことは{skills}で、性格は{personality}です。
これらを元に自然な自己紹介文を作成してください。
カスタマーサポートAI
問い合わせ内容に応じて丁寧な返答を作成するツール。
あなたはカスタマーサポート担当者です。
以下のお客様からの問い合わせに対して、丁寧な返答を作成してください:\n{inquiry}
このように、PromptTemplateを利用することで、アプリの用途に応じた一貫性のある指示ができ、LLMから安定した回答を得ることができます。
3. パイプライン構文とは
LangChainでは、PromptTemplateで作成した質問文(プロンプト)をLLMに渡し、回答を得る処理をチェーン(一連の処理) として接続できます。この仕組みをパイプライン構文と呼びます。
簡単に言うと、「ユーザ入力 → プロンプト生成 → モデル実行 → 出力」という流れを一連の処理として扱える機能です。
1. ユーザ入力
ユーザが「ブラックホール」と入力します。
2. プロンプト生成(PromptTemplate)
入力をテンプレートに当てはめて、LLMに渡すプロンプトを作成します。
例:
以下のトピックについて中学生にもわかるように解説してください:
ブラックホール
3. モデル実行(Ollama)
作成したプロンプトをモデルに渡し、応答を生成します。
4. 出力
モデルが生成した回答をアプリで表示します。
この一連の流れを、LangChainではパイプライン構文を利用することで簡潔に記述できます。
chain = prompt | llm
この | 演算子は「左側の出力を右側に渡す」ことを意味します。
- 左側(prompt):ユーザ入力をテンプレートに当てはめる
- 右側(llm):テンプレート化された文章をモデルに渡して応答を取得する
4. 実例コード
PromptTemplate、パイプライン構文を利用した実例コードを示します。これにより、PromptTemplateとLLMを組み合わせた処理が実現できます。
from langchain.prompts import PromptTemplate
from langchain_ollama import OllamaLLM
# LLMの初期化
llm = OllamaLLM(model="llama3.1:8b")
# 1. プロンプトテンプレート作成
template = (
"以下のトピックについて中学生にもわかるように解説してください:\n\n{topic}"
)
prompt = PromptTemplate.from_template(template)
# 2. パイプライン構文でチェーン作成
chain = prompt | llm
# 3. 入力データ
topic_input = {"topic": "ブラックホール"}
# 4. チェーン実行
response = chain.invoke(topic_input)
# 5. 結果表示
print("AIの応答:", response)
出力例は以下の通りです。
AIの応答: ブラックホールとは何ですか?
宇宙の中には、太陽に比べると非常に重い星があるんです。そういう星は物質を吸い込んでしまって、光さえも出なくなるんです。それを「ブラックホール」と呼びます。
もし、人がその重力の前に行くと、重力でとても早く動いてしまうんです。でも、運動量(元の位置から移動した距離)を守るという物理の法則があります。したがって、人も光も、ブラックホールの中に入れてしまいます。
そして、その外側では、ブラックホールのような重い星があるかどうかはわかりません。なぜなら、あそこからは何も出てこないからです。そして、「暗い」ので「ブラック」と「ホール(穴)」が組み合わさって「ブラックホール」という名前になったのです。
ただ、ブラックホールの中には、物質とエネルギーがぶつかって大きなエネルギーを出していることもあります。それを観測して、そのことが存在する証拠はあるんです。なので、それを観察した科学者たちはブラックホールの存在を確かめました。
そして今でも、宇宙にある重い星がブラックホールになったと考えています。そして、人がそのブラックホールに近づくと危険だから、その場所には人が行くことができません
PromptTemplateを利用して {topic} に「ブラックホール」が入り、決まった形式の質問文が自動的に生成されます。ユーザ入力に応じて安定した形式のプロンプトを自動生成し、LLMに渡すことができます。
また、このコードでは次のようにステップが整理されます。
- テンプレートを作る
- テンプレートとLLMをチェーンでつなぐ
- 入力データを渡す
- LLMからの応答を取得する
- 結果を表示する
パイプライン構文を利用することで、ユーザ入力からLLMの応答までの処理を1本にまとめて記述できるため、コードが非常にシンプルになります。
5. まとめ
この章では、LangChainで安定した応答を得るためのPromptTemplateとパイプライン構文について学びました。
- PromptTemplateを利用することで、質問文の形式を統一し、入力ごとのムラを減らせます。
- 教育、ビジネス、カスタマーサポートなど、多様な用途で応答の質を安定させることができます。
- パイプライン構文を利用すると、「テンプレート → モデル → 応答」の処理を一連の流れとして簡潔に扱えます。
次章では、このテンプレートとパイプラインを応用して、会話の文脈保持や会話履歴の管理方法を学びます。