見出し画像

Langchain新機能:Fewshotプロンプトの動的生成

入力内容に基づいて適切な回答サンプルを選択して、動的にプロンプトを生成することで、より適切な回答を誘導するチャットモデル用のテンプレート機能のようです。

チャットモデルの挙動をうまく制御するのに使えそうです。
早速、試食してみます。


実行サンプル

実行準備:ライブラリのインポート

!pip install langchain > /dev/null
!pip install openai > /dev/null
!pip install chromadb /dev/null
!pip install tiktoken /dev/null
import os

os.environ["OPENAI_API_KEY"] = "your openai api key"

QA例の準備

from langchain.prompts import SemanticSimilarityExampleSelector
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
examples = [
    {"input": "2+2", "output": "4"},
    {"input": "2+3", "output": "5"},
    {"input": "2+4", "output": "6"},
    {"input": "1足す1は?", "output": "1タス1の答えは2です。"},
    {"input": "2足す3は?", "output": "2タス3の答えは5です。"},
]

to_vectorize = [" ".join(example.values()) for example in examples]
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_texts(to_vectorize, embeddings, metadatas=examples)

質問の類似性に基づいて例を選択できるように、QAサンプルをベクターストアに保存します。

QAの抽出例

example_selector = SemanticSimilarityExampleSelector(
    vectorstore=vectorstore,
    k=2,
)
example_selector.select_examples({"input": "3*2"})

[{'input': '2+2', 'output': '4'}, {'input': '2+2', 'output': '4'}]

プロンプトの動的生成

from langchain.schema import SystemMessage
from langchain.prompts import ChatPromptTemplate, HumanMessagePromptTemplate
from langchain.prompts.few_shot import FewShotChatMessagePromptTemplate


# Define the few-shot prompt.
few_shot_prompt = FewShotChatMessagePromptTemplate(
    # The input variables select the values to pass to the example_selector
    input_variables=["input"],
    example_selector=example_selector,
    # Define how each example will be formatted.
    # In this case, each example will become 2 messages:
    # 1 human, and 1 AI
    example_prompt=(
        HumanMessagePromptTemplate.from_template("{input}")
        + AIMessagePromptTemplate.from_template("{output}")
    ),
)
print(few_shot_prompt.format(input="What's 3+3?"))

Human: 2+3
AI: 5
Human: 2+3
AI: 5

final_prompt = (
    SystemMessagePromptTemplate.from_template("あなたは有能なアシスタントです。例を参考にして回答を返してください。")
    + few_shot_prompt
    + HumanMessagePromptTemplate.from_template("{input}")
)

実行!チャットモデルへ入力(LangSmithトレース)

from langchain.chat_models import ChatOpenAI

chain = final_prompt | ChatOpenAI(temperature=0.0)

実行例1

chain.invoke({"input": "5引く3は?"}).content

5引く3の答えは2です。

実行例2

chain.invoke({"input": "5 / 2"})

2.5

LangSmithトレース

本番の質問の前に、よく似たQAサンプルがベクトルDBから選択されチャット履歴に挿入されています。

まとめ

  • 適切な例を厳選してFewshotとして入力することで、LLMの出力品質がより高まることが期待でき、動作の安定化にも寄与しそうです。かなり利用用途が広そうなイケてる機能ですね!😄

 お読みいただきありがとうございました。

この記事が気に入ったらサポートをしてみませんか?