🦜
LangChainのPromptTemplateで`{}`をエスケープしたい。
LangChainのPromptTemplateでは{}
によって変数を指定します。
ただし、jsonでの出力例を指示する時など、{}
をプロンプト内で使用したい場面がありました。今回はその時の対処法メモです。
{{
や}}
でエスケープする
結論: 変数として使用したくない部分(エスケープしたい部分)を{xxx}
から{{xxx}}
のように変更すると、エラーが起きません。
エラーが起きない書き方
prompt = """
短編小説を作ってください。REFERENCEは主人公の情報です。出力はJSON形式(title, text)でお願いします。
# REFERENCE
'''
{reference}
'''
# OUTPUT EXAMPLE
{{
"title": "タイトル1",
"text": "テキスト本文1",
}}
# OUTPUT
"""
reference = """
名前: 真島 悠太(ましま ゆうた)
- 28歳の若き研究者で、都市伝説を科学的に解明しようとする情熱家。
- 孤独な性格だが、友人の助けを得て少しずつ心を開いていく。
- 子供の頃に見た幻影が、彼の人生と研究の大きな動機となっている。
"""
prompt_template = PromptTemplate.from_template(prompt) # プロンプトテンプレート
content = prompt_template.format(reference=reference) # プロンプト
messages = [HumanMessage(content=content),] # メッセージ
response = chat_gpt4o_mini_json.invoke(messages) # LLM実行
result_json = json.loads(response.content)
result_json
# --- 出力 ---
# {
# 'title': '幻影の真実',
# 'text': '28歳の真島悠太は、大学の研究室で都市伝説の解明に取り組んでいた。彼の情熱は...'
# }
エラーが起こる書き方
PromptTemplate
を使用して、プロンプトにJSON形式の例を含めようとすると、{}がテンプレートエンジンによって変数と見なされ、パースエラーが発生します。
prompt = """
短編小説を作ってください。REFERENCEは主人公の情報です。出力はJSON形式(title, text)でお願いします。
# REFERENCE
'''
{reference}
'''
# OUTPUT EXAMPLE
{
"title": "タイトル1",
"text": "テキスト本文1",
}
# OUTPUT
"""
reference = """
名前: 真島 悠太(ましま ゆうた)
- 28歳の若き研究者で、都市伝説を科学的に解明しようとする情熱家。
- 孤独な性格だが、友人の助けを得て少しずつ心を開いていく。
- 子供の頃に見た幻影が、彼の人生と研究の大きな動機となっている。
"""
prompt_template = PromptTemplate.from_template(prompt) # プロンプトテンプレート
content = prompt_template.format(reference=reference) # プロンプト
messages = [HumanMessage(content=content),] # メッセージ
response = chat_gpt4o_mini_json.invoke(messages) # LLM実行
result_json = json.loads(response.content)
result_json
# --- 出力 ---
# KeyError: '\n "title"'
参考ページ
Discussion