本文へスキップ
BecomeCoder

RAGコース · 第4章 生成につなぐ · レッスン14

文脈をプロンプトに差し込む ― augment

ブラウザで完結

導入

検索で得た文書を、質問と一緒に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章の検索結果をそのまま渡せば、検索から生成までがひとつながりになる。

実際に動かしてみよう

下のエディタにPythonを書いて「実行」を押すと、scikit-learn(TF-IDF)とnumpyで本物の「検索」をその場で動かせます。RAGの検索フェーズ――文書のチャンク分割・ベクトル化・類似度計算・並べ替え――が実際に動きます。scikit-learn を使う回は初回の読み込みに数十秒かかることがあります。検索デモのサンプル文書は英語です(TF-IDFの既定トークナイザが日本語を分割できないため。日本語検索の対処は読み物で解説します)。LLMの生成や本物の埋め込みAPIは、APIキーが要るため読み物の回でコードを示します。

Python — ライブラリ付きで実行(Pyodide)

numpy / pandas / matplotlib が使える本物のPython(Pyodide)を読み込みます。初回のみ読み込みに少し時間がかかります(以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。