🦜

LangChainのPromptTemplateで`{}`をエスケープしたい。

2024/08/15に公開

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"'

参考ページ

https://github.com/langchain-ai/langchain/issues/1914

Discussion