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"})
プロンプトの動的生成
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?"))
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
実行例2
chain.invoke({"input": "5 / 2"})
LangSmithトレース
まとめ
適切な例を厳選してFewshotとして入力することで、LLMの出力品質がより高まることが期待でき、動作の安定化にも寄与しそうです。かなり利用用途が広そうなイケてる機能ですね!😄
お読みいただきありがとうございました。
この記事が気に入ったらサポートをしてみませんか?