Re:ゼロから始めるML生活

どちらかといえばエミリア派です

LlamaIndexの裏で動いてるプロンプトを日本語にする覚書き

以前LlamaIndexを使っていました。

www.nogawanogawa.com

LlamaIndexで質問を入力するとき、デフォルトだと英語のプロンプトが混じっています。 これをすべて日本語で動かすときにいつもやり方を忘れてしまうので今回はそのメモです。

英語になってしまっている箇所

百聞は一見に如かず、ということで確認してみましょう。

この辺のコード動かして、langfuseの画面を見てみるとこんな感じになってます。

こんな感じに、質問とcontextの周辺の細かい指示が英語になっており、実は裏で動いているプロンプトはこんな感じになっているわけです。

対象コードとしてはこの辺りですね。

github.com

これだと、ChatGPTを生で使っているときと振る舞いが微妙に変わってきたり、ひどいときには日本語で質問しているのに英語で返答を返されたりしそうです。(この辺はよくわかってない)

とにかく、日本語を使用する想定であるならば、プロンプトのテンプレートも日本語にしたいわけです。

どこを直すか

これを直すときはだいたいこちらの記事を参考にしてたりします。

note.com

修正としてはこんな感じにするらしいです。

from llama_index.core.llms import ChatMessage, MessageRole
from llama_index.core.prompts import ChatPromptTemplate

# Text QA Prompt
chat_text_qa_msgs = [
    ChatMessage(
        role=MessageRole.SYSTEM,
        content="""あなたは世界中で信頼されているQAシステムです。
事前知識ではなく、常に提供されたコンテキスト情報を使用してクエリに回答してください。
従うべきいくつかのルール:
1. 回答内で指定されたコンテキストを直接参照しないでください。
2. 「コンテキストに基づいて、...」や「コンテキスト情報は...」、またはそれに類するような記述は避けてください。""",
    ),
    ChatMessage(
        role=MessageRole.USER,
        content="""コンテキスト情報は以下のとおりです。
---------------------
{context_str}
---------------------
事前知識ではなくコンテキスト情報を考慮して、クエリに答えます。
Query: {query_str}
Answer: """
    ),
]
text_qa_template = ChatPromptTemplate(chat_text_qa_msgs)

# Refine Prompt
chat_refine_msgs = [
    ChatMessage(
        role=MessageRole.SYSTEM,
        content="""あなたは世界中で信頼されているQAシステムです。
事前知識ではなく、常に提供されたコンテキスト情報を使用してクエリに回答してください。
従うべきいくつかのルール:
1. 回答内で指定されたコンテキストを直接参照しないでください。
2. 「コンテキストに基づいて、...」や「コンテキスト情報は...」、またはそれに類するような記述は避けてください。""",
    ),
    ChatMessage(
        role=MessageRole.USER,
        content="""あなたは、既存の回答を改良する際に2つのモードで厳密に動作するQAシステムのエキスパートです。
1. 新しいコンテキストを使用して元の回答を**書き直す**。
2. 新しいコンテキストが役に立たない場合は、元の回答を**繰り返す**。
回答内で元の回答やコンテキストを直接参照しないでください。
疑問がある場合は、元の答えを繰り返してください。
New Context: {context_msg}
Query: {query_str}
Original Answer: {existing_answer}
New Answer: """
    ),
]
refine_template = ChatPromptTemplate(chat_refine_msgs)

更新したプロンプトテンプレートを反映するのをお忘れなく。

query_engine = vector_index.as_query_engine(
    text_qa_template=text_qa_template,  # QAプロンプトテンプレートの設定
    refine_template=refine_template  # Refineプロンプトテンプレートの設定
)

すると、ちゃんとすべて日本語でプロンプトになりました。 日本語化するだけでなく、細かい命令を組み込んでおきたいこともあるので、そういったときはこのやり方をすれば良さそうです。

全体としてはこんな感じ。

感想

とくになし。