導入
検索で得た文書を、質問と一緒に1つのプロンプト文字列に組み立てる作業を**拡張(augment)**と呼びます。これが「Retrieval-Augmented-Generation」の”Augmented”の正体です。
説明
def build_prompt(query, contexts):
joined = "\n".join(f"- {c}" for c in contexts)
return f"""You are a helpful assistant. Answer the question using ONLY the context below.
If the context does not contain the answer, say "I don't know".
Context:
{joined}
Question: {query}
Answer:"""
contexts = [
"Mount Fuji is 3776 meters tall.",
"Mount Fuji is located on Honshu island in Japan.",
]
prompt = build_prompt("How tall is Mount Fuji?", contexts)
print(prompt)
build_prompt がやっていることは単純です。検索で見つかった文書のリスト contexts を箇条書きにして Context: の下に並べ、その下に質問 Question: を書き添えているだけです。LLMはこのテキスト全体を1つの入力として受け取り、Answer: の続きを書きます。
ポイントは冒頭の指示文です。「contextの範囲だけで答えよ、なければ”I don’t know”と言え」という一文が、LLMが自分の知識だけで適当に答えてしまう**幻覚(hallucination)**を抑える鍵になります。この指示の効かせ方は、次のレッスン以降でさらに深掘りします。
もう1つ大事なのは、contexts の中身です。ここには第3章で作った検索(retriever)が返してきた文書をそのまま渡せば、「検索 → プロンプト組み立て → 生成」というパイプラインが1本につながります。
やってみよう
contexts に文書を1つ足したり減らしたりして、prompt の中身がどう変わるか確かめてみましょう。"How tall is Mount Fuji?" を別の質問に変えて build_prompt を呼び出すのも試してみてください。
演習
contexts の中に答えが含まれていない質問(例: "What is the population of Tokyo?")を渡してプロンプトを組み立て、そのプロンプトの末尾に "Answer in one sentence." という追加の指示を足して print で表示してください。
ヒント1を見る
build_prompt が返す文字列の末尾に + "\nAnswer in one sentence." のように文字列を連結します。
ヒント2を見る
prompt = build_prompt("What is the population of Tokyo?", contexts) + "\nAnswer in one sentence." のように1行で書けます。
まとめ
- 検索結果
contextsと質問queryを1つのプロンプト文字列にまとめることを augment(拡張) と呼ぶ。 - 「contextの範囲だけで答える/なければ知らないと言う」という指示が、幻覚を抑える最初の一歩。
contextsに第3章の検索結果をそのまま渡せば、検索から生成までがひとつながりになる。