もっともらしい、まちがった答え
ある市役所が、ごみの出し方を答えるチャットボットを試しました。
「粗大ごみはどう出せばいいですか」と聞くと、すらすらと答えます。ところが、手数料の金額も申し込み先も、この市のものではありませんでした。
モデルは、この市の決まりを知らないまま、それらしい文を作っていたのです。このレッスンでは、アプリがモデルに正しい情報を渡すしくみを学びます。
このレッスンのゴール
メモ
アプリが言語モデルに正しい情報を渡すしくみを、説明できる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| 大規模言語モデル | 大量の文章から学び、続きの文を作るモデルです。 | LLM |
| プロンプト | モデルに渡す指示と情報の文です。 | |
| ハルシネーション | モデルが事実でないことを、もっともらしく答えることです。 | |
| 検索拡張生成 | 関係する文書を探して渡してから、答えさせるしくみです。 | RAG |
| ベクトル | 文の意味を表す、数の並びです。 | |
| ベクトル検索 | 意味の近い文を、数の近さで探すことです。 |
学生が入力するセルは、このプレビューでは空白です。
モデルは、自分の会社の情報を知らない
大規模言語モデルは、インターネットなどの大量の文章から学んでいます。
でも、学んだのはある時点までの、公開された文章だけです。この市のごみの出し方や、社内のマニュアルは知りません。
知らないことを聞かれても、モデルは黙りません。それらしい文を作ってしまいます。これをハルシネーションと呼びます。
モデルが知っていること、知らないこと
| 質問 | モデルだけで答えられるか | 理由 |
|---|---|---|
| ごみを分別する一般的な理由 | 答えられる | 公開された文章に多く書かれている |
| この市の粗大ごみの手数料 | 答えられない | 市の案内は学習に入っていない |
| 先週変わった収集日 | 答えられない | 学んだ時点より後のこと |
| 社内の経費精算のルール | 答えられない | 社外に公開されていない |
学生が入力するセルは、このプレビューでは空白です。
探してから、答えさせる
そこで、アプリが先に答えの材料を探します。このしくみを検索拡張生成、略してRAGと呼びます。
まず、市の案内文を小さな断片に分けて、保存しておきます。質問が来たら、関係する断片を探します。
見つけた断片を、質問と一緒にプロンプトに入れます。最後に「この案内文だけを使って答えてください」と指示して、モデルに渡します。
やってみよう: 関係する案内文を探す
# 市役所の案内文です。説明のため、あらかじめ単語に分けてあります。
docs = [
["燃えるごみ", "月曜", "木曜", "出す"],
["粗大ごみ", "予約", "手数料", "シール", "出す"],
["引っ越し", "住民票", "窓口", "届け出"],
]
question = ["粗大ごみ", "出す", "予約"]
best = 0
best_score = -1
for i in range(len(docs)):
score = 0
for word in question:
if word in docs[i]:
score = score + 1
print("案内文", i, "の一致:", score)
if score > best_score:
best = i
best_score = score
print("モデルに渡す案内文:", docs[best])
# question を ["住民票", "窓口"] に変えて、もう一度実行しましょう。
よくある誤解
注意
RAGを使えば、モデルは自分の会社の文書を覚える、と考える人がいます。実際は、質問のたびに断片を渡しているだけで、モデルの重みは変わりません。案内文が古いと、答えも古くなります。文書を新しく保つのが、運用の仕事です。
意味の近さで探す、ベクトル検索
同じ単語で探すやり方には、弱点があります。「大型の家具を捨てたい」と聞かれても、「粗大ごみ」という単語がないので見つかりません。
そこで、文をベクトルという数の並びに変えます。意味の近い文は、近い数になるように作られています。
質問の数と近い数を持つ断片を探すのが、ベクトル検索です。単語がちがっても、意味が近ければ見つかります。
例: 文を数に変える(実際は数百個の数)
| 文 | ベクトル(簡単にした例) | 質問との近さ |
|---|---|---|
| 質問: 大型の家具を捨てたい | 0.8、0.2 | |
| 粗大ごみの出し方 | 0.9、0.1 | 近い |
| 燃えるごみの収集日 | 0.6、0.3 | やや近い |
| 住民票の取り方 | 0.1、0.9 | 遠い |
学生が入力するセルは、このプレビューでは空白です。