1ページの規則に検索エンジン
検索拡張生成は、費用のかかる道具で、ときには不向きです。文書の分割と、ベクトルと、答えを逃しうる検索を足すからです。
自転車クラブに、1ページの規則があります。学生が、それだけのために、検索の仕組みを丸ごと作ります。ページはプロンプトに入ったはずで、いまは検索のほうが失敗しうる部分です。
このレッスンのゴール
メモ
検索が不向きな道具である場面を言える。
キーワード
| ことば | いみ | れい |
|---|---|---|
| コンテキストウィンドウ | モデルが一度に読める最大の量 | |
| トークン | モデルが数える、文章の小さな単位 | 約1文字 |
| 予算 | 使うと決めたトークンの上限 | |
| ライブデータ | 数分ごとに変わる事実 | |
| 検索 | 質問に答える断片を見つけること |
学生が入力するセルは、このプレビューでは空白です。
検索は習慣でなく、取引
検索のおかげで、モデルは、1つのプロンプトに入る量より多い文章を使えます。それが利点です。
代わりに、手間とリスクが増えます。分割し、ベクトルを作り、検索を調整しなければなりません。検索は、間違った断片や、何も返さないことがあり、そのとき答えは間違った文章から作られます。省けるなら省きます。
小さな文書はそのまま入る
モデルが一度に読める量には限りがあり、これをコンテキストウィンドウと呼びます。量はトークンで数えます。日本語では、1文字がおよそ1トークンです。これは目安で、正確な数ではありません。
コンテキストに使うトークンの予算を決めます。文書全体が予算より小さければ、全部入れます。探すものがないので、逃すものもありません。
例: 6つの場面と、選ぶ4つの方法
| 場面 | 方法 | 理由 |
|---|---|---|
| 1ページの規則 | そのままプロンプトへ | 入るので、探す必要がない |
| 4万文字のハンドブック | 検索 | 大きすぎるので、必要な断片を見つける |
| 本17冊の延滞料の合計 | コードで計算 | モデルは計算を間違えることがある |
| 次のバスの遅れ | その場で取得 | 毎分変わるので、保存すると古くなる |
| めったに尋ねられない3ページの規程 | そのままプロンプトへ | 入るし、余分な費用は小さい |
| 大学のイントラネット、数千ページ | 検索 | どのプロンプトにも入らない |
学生が入力するセルは、このプレビューでは空白です。
文書を予算と比べる
次のスクリプトは、自転車クラブの規則を持ち、文字数を数えます。目安でトークンに直し、予算3000と比べます。
4万文字のハンドブックも、数だけを使って同じ判定をし、そのあと規則のプロンプト全体を作ります。モデルは呼びません。
予算のスクリプトを書く(1)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const rules = \"出発は朝9時、古い水車小屋の前です。全員ヘルメットをかぶります。1つの班は、最大12人と班長1人です。班長は速さを決め、曲がり角ごとに待ちます。日没後に終わる走行では、ライトが必要です。会費は年に2000円です。体験の参加は2回まで無料です。氷や強い雨の日は中止し、班長が朝7時までに全員へ知らせます。誰も置いていきません。転んだときは、その日のうちに班長へ伝えます。\";' '// 目安: 日本語では、1文字がおよそ1トークンです。かなり粗い目安です。' 'function tokensFor(letters) { return letters; }' 'const BUDGET = 3000;' > whole.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
予算のスクリプトを書く(2)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const documents = [' ' { name: \"自転車クラブの規則\", letters: Array.from(rules).length },' ' { name: \"図書館のハンドブック\", letters: 40000 },' '];' 'documents.forEach(function (one) {' ' const need = tokensFor(one.letters);' ' const verdict = need <= BUDGET ? \"そのまま入る\" : \"検索が必要\";' ' console.log(one.name + \": \" + one.letters + \"文字、約\" + need + \"トークン、\" + verdict);' '});' 'const prompt = \"クラブの規則だけを使って答えてください。\n\n\" + rules + \"\n\n質問: 1つの班は、最大何人ですか。\";' 'console.log(\"プロンプト全体は\", prompt.length, \"文字です。検索は要りません。\");' >> whole.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
実行して判定を読む
docker exec -w /home/node/project agent node whole.jsここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
表示される内容
| 行 | 意味 |
|---|---|
| 自転車クラブの規則: 184文字、約184トークン、そのまま入る | 予算よりずっと小さい |
| 図書館のハンドブック: 40000文字、約40000トークン、検索が必要 | 予算よりずっと大きい |
| プロンプト全体は 226 文字です。検索は要りません。 | そのまま送れる小ささ |
学生が入力するセルは、このプレビューでは空白です。
よくある間違い
注意
検索は、文書をプロンプトに入れるより、いつもよい、と考える人が多くいます。文書が入るなら、検索は答えを逃しうる手順を足すだけです。かっこよく聞こえるからではなく、必要なときに使います。