フューショットプロンプトテンプレート

プロンプトに対話的なサンプルを含めると、モデルはユーザーの意図をよりよく理解して、より良い回答を提供したり、タスクを実行したりできます。フューショットプロンプトテンプレートとは、新しい入力を処理する際にモデルを誘導するために少数の例を使用することを指します。これらの例は、モデルをトレーニングするために使用でき、類似の質問により良く理解し、回答することができます。

例:

Q: バットマンとは何ですか?
A: バットマンは架空のコミックキャラクターです。

Q: torsalplexityとは何ですか?
A: 不明です。

Q: 言語モデルとは何ですか?
A:

モデルに、Qが質問であり、Aが回答であると伝え、この形式で対話してください。

次は、ランチェーンが提供するツールクラスの説明で、少数のインタラクティブなサンプルをプロンプトに挿入するためのものです。

例のセットの使用

サンプルセットの作成

以下に、Q&Aの例を含むexamples配列を定義します。

from langchain.prompts.few_shot import FewShotPromptTemplate
from langchain.prompts.prompt import PromptTemplate

examples = [
  {
    "question": "ムハンマド・アリとアラン・チューリングの寿命はどちらが長いですか?",
    "answer":
"""
質問に追加の調査が必要ですか: はい。
追加の質問: ムハンマド・アリはどれだけ歳で亡くなりましたか?
中間的な回答: ムハンマド・アリは亡くなったとき74歳でした。
追加の質問: アラン・チューリングはどれだけ歳で亡くなりましたか?
中間的な回答: アラン・チューリングは亡くなったとき41歳でした。
したがって最終的な答えは: ムハンマド・アリ
"""
  },
  {
    "question": "craigslistの創設者はいつ生まれましたか?",
    "answer":
"""
質問に追加の調査が必要ですか: はい。
追加の質問: craigslistの創設者は誰ですか?
中間的な回答: craigslistの創設者はクレイグ・ニューマークです。
追加の質問: クレイグ・ニューマークはいつ生まれましたか?
中間的な回答: クレイグ・ニューマークは1952年12月6日に生まれました。
したがって最終的な答えは: 1952年12月6日
"""
  },
  {
    "question": "ジョージ・ワシントンの祖父母の母親は誰でしたか?",
    "answer":
"""
質問に追加の調査が必要ですか: はい。
追加の質問: ジョージ・ワシントンの母親は誰ですか?
中間的な回答: ジョージ・ワシントンの母親はメアリー・ボール・ワシントンです。
追加の質問: メアリー・ボール・ワシントンの父親は誰ですか?
中間的な回答: メアリー・ボール・ワシントンの父親はジョセフ・ボールです。
したがって最終的な答えは: ジョセフ・ボール
"""
  },
  {
    "question": "映画『ジョーズ』と『007 カジノ・ロワイヤル』の監督は同じ国出身ですか?",
    "answer":
"""
質問に追加の調査が必要ですか: はい。
追加の質問: 『ジョーズ』の監督は誰ですか?
中間的な回答: 『ジョーズ』の監督はスティーヴン・スピルバーグです。
追加の質問: スティーヴン・スピルバーグはどこの出身ですか?
中間的な回答: アメリカ合衆国出身です。
追加の質問: 『007 カジノ・ロワイヤル』の監督は誰ですか?
中間的な回答: 『007 カジノ・ロワイヤル』の監督はマーティン・キャンベルです。
追加の質問: マーティン・キャンベルはどこの出身ですか?
中間的な回答: ニュージーランド出身です。
したがって最終的な答えは: いいえ
"""
  }
]

小さなサンプル例のフォーマット作成

PromptTemplateオブジェクトを使用して、単純にプロンプトテンプレートに例を挿入します。

example_prompt = PromptTemplate(input_variables=["question", "answer"], template="質問: {question}\\n{answer}")

print(example_prompt.format(**examples[0]))

出力:

質問: ムハンマド・アリとアラン・チューリングの寿命はどちらが長いですか?

質問に追加の調査が必要ですか: はい。
追加の質問: ムハンマド・アリはどれだけ歳で亡くなりましたか?
中間的な回答: ムハンマド・アリは亡くなったとき74歳でした。
追加の質問: アラン・チューリングはどれだけ歳で亡くなりましたか?
中間的な回答: アラン・チューリングは亡くなったとき41歳でした。
したがって最終的な答えは: ムハンマド・アリ
from langchain.prompts import FewShotPromptTemplate

prompt = FewShotPromptTemplate(
    examples=examples,
    example_prompt=example_prompt,
    suffix="質問: {input}",
    input_variables=["input"]
)

print(prompt.format(input="ジョージ・ワシントンの父親は誰ですか?"))

Returns:

質問: ジョージ・ワシントンの祖父母の母親は誰ですか?

この質問についてフォローアップする必要がありますか: はい。
フォローアップ: ジョージ・ワシントンの母親は誰ですか?
中間回答: ジョージ・ワシントンの母親はメアリー・ボール・ワシントンです。
フォローアップ: メアリー・ボール・ワシントンの父親は誰ですか?
中間回答: メアリー・ボール・ワシントンの父親はジョセフ・ボールです。
したがって最終的な答えは: ジョセフ・ボール

質問: craigslistの創設者はいつ生まれましたか?

この質問についてフォローアップする必要がありますか: はい。
フォローアップ: craigslistの創設者は誰ですか?
中間回答: craigslistの創設者はクレイグ・ニューマークです。
フォローアップ: クレイグ・ニューマークはいつ生まれましたか?
中間回答: クレイグ・ニューマークは1952年12月6日に生まれました。
したがって最終的な答えは: 1952年12月6日

質問: ジョージ・ワシントンの母親は誰ですか?

この質問についてフォローアップする必要がありますか: はい。
フォローアップ: ジョージ・ワシントンの母親は誰ですか?
中間回答: ジョージ・ワシントンの母親はメアリー・ボール・ワシントンです。
フォローアップ: メアリー・ボール・ワシントンの父親は誰ですか?
中間回答: メアリー・ボール・ワシントンの父親はジョセフ・ボールです。
したがって最終的な答えは: ジョセフ・ボール

質問: "Jaws"と"カジノ・ロワイヤル"の監督は同じ国出身ですか?

この質問についてフォローアップする必要がありますか: はい。
フォローアップ: "Jaws"の監督は誰ですか?
中間回答: "Jaws"の監督はスティーブン・スピルバーグです。
フォローアップ: スティーブン・スピルバーグはどこの出身ですか?
中間回答: アメリカ合衆国。
フォローアップ: "カジノ・ロワイヤル"の監督は誰ですか?
中間回答: "カジノ・ロワイヤル"の監督はマーティン・キャンベルです。
フォローアップ: マーティン・キャンベルはどこの出身ですか?
中間回答: ニュージーランド。
したがって最終的な答えは: いいえ

質問: ジョージ・ワシントンの父親は誰ですか?
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings

example_selector = SemanticSimilarityExampleSelector.from_examples(
    examples,
    OpenAIEmbeddings(),
    Chroma,
    k=1
)

question = "ジョージ・ワシントンの父親は誰ですか?"
selected_examples = example_selector.select_examples({"question": question})
print(f"類似した例: {question}")
for example in selected_examples:
    print("\\n")
    for k, v in example.items():
        print(f"{k}: {v}")

Returns:

Chromaを直接ローカルAPIで実行中。
    DuckDBメモリ内のデータベースを使用します。データは一時的です。
    類似した例: ジョージ・ワシントンの祖父母の母親は誰ですか?

    question: ジョージ・ワシントンの母親は誰ですか?
    answer: 
    この質問についてフォローアップする必要がありますか: はい。
    フォローアップ: ジョージ・ワシントンの母親は誰ですか?
    中間回答: ジョージ・ワシントンの母親はメアリー・ボール・ワシントンです。
    フォローアップ: メアリー・ボール・ワシントンの父親は誰ですか?
    中間回答: メアリー・ボール・ワシントンの父親はジョセフ・ボールです。
    したがって最終的な答えは: ジョセフ・ボール
# FewShotPromptTemplateにexample_selectorを提供する

最後に、`FewShotPromptTemplate`オブジェクトを作成します。前の例から`example_selector`を使用して、質問に類似した例を選択します。

```python
prompt = FewShotPromptTemplate(
    example_selector=example_selector,
    example_prompt=example_prompt,
    suffix="質問: {input}",
    input_variables=["input"]
)

print(prompt.format(input="ジョージ・ワシントンの父親は誰ですか?"))

戻り値:

質問: ジョージ・ワシントンの祖父母の母親は誰ですか?

この質問に続けて尋ねる必要がありますか: はい。
続けて質問: ジョージ・ワシントンの母親は誰ですか?
中間回答: ジョージ・ワシントンの母親はメアリー・ボール・ワシントンです。
続けて質問: メアリー・ボール・ワシントンの父親は誰ですか?
中間回答: メアリー・ボール・ワシントンの父親はジョセフ・ボールです。
最終的な回答は: ジョセフ・ボール

質問: ジョージ・ワシントンの父親は誰ですか?