四つの部分で伝わるプロンプト
プロンプトとは、言語モデルに送る文章のことです。モデルが読むのはその文章だけで、書かなかったことは推測できません。
「試合について教えて」では、毎回ちがう答えが返ります。役割、依頼、制限、形式を書けば、使える答えに近づきます。
このレッスンのゴール
メモ
あいまいな頼みを、役割、依頼、制限、形式を持つプロンプトに直せます。
キーワード
| ことば | いみ |
|---|---|
| プロンプト | モデルに送る文章 |
| 役割 | モデルに演じてほしい立場 |
| 依頼 | 今してほしい一つの仕事 |
| 制限 | 答えが超えてはいけない範囲 |
| 形式 | 答えの形 |
| チェックリスト | 確かめる項目の一覧 |
学生が入力するセルは、このプレビューでは空白です。
プロンプトの四つの部分とは
役割は、モデルが演じる立場です。依頼は、してほしい一つの仕事です。制限は、長さや使う情報など、答えの範囲です。形式は、一文や箇条書きなど、答えの形です。
各部分を、名前を付けて一行ずつ書きます。名前があると、読みやすく、確かめやすくなります。
同じ頼みを悪く書く、よく書く
| 部分 | あいまい | はっきり |
|---|---|---|
| 役割 | (なし) | あなたは学校新聞の記者です。 |
| 依頼 | 試合について教えて。 | 下の結果の見出しを書いて。 |
| 制限 | (なし) | 一文だけ。事実だけを使う。 |
| 形式 | (なし) | 記号なしの普通の文。 |
学生が入力するセルは、このプレビューでは空白です。
モデル用の補助を書く(1)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const base = process.env.AI_URL || \"http://ai:4000\";' '// 応答に含まれるトークン数。なければ null。' 'function count(data, name) {' ' return data.usage && typeof data.usage[name] === \"number\" ? data.usage[name] : null;' '}' > model.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
モデル用の補助を書く(2)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function ask(messages, sample, max) {' ' try {' ' const res = await fetch(base + \"/v1/chat/completions\", {' ' method: \"POST\",' ' headers: { \"content-type\": \"application/json\", authorization: \"Bearer lab\" },' ' body: JSON.stringify({ model: \"lab\", messages: messages, max_tokens: max || 100 }),' ' signal: AbortSignal.timeout(30000),' ' });' ' if (res.ok === false) throw new Error(\"status \" + res.status);' ' const d = await res.json();' ' return { text: d.choices[0].message.content, inTokens: count(d, \"prompt_tokens\"), outTokens: count(d, \"completion_tokens\"), recorded: false };' ' } catch (error) {' ' console.log(\"記録済みサンプル: モデルが答えませんでした (\" + error.message + \")。\");' ' return { text: sample, inTokens: null, outTokens: null, recorded: true };' ' }' '}' 'module.exports = { ask };' >> model.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
プロンプトの採点を書く(1)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { ask } = require(\"./model\");' 'const vague = \"試合について教えて。\";' 'const good = [' ' \"役割: あなたは学校新聞の記者です。\",' ' \"依頼: 下の結果について、見出しを一行書いてください。\",' ' \"制限: 一文だけ。与えた事実だけを使うこと。\",' ' \"形式: 記号なしの普通の文。\",' ' \"事実: 北高 3 対 2 南高。決勝点は田中さん。\",' '].join(\"\n\");' > say1.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
プロンプトの採点を書く(2)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const PARTS = [\"役割\", \"依頼\", \"制限\", \"形式\"];' 'function missing(prompt) {' ' const lines = prompt.split(\"\n\");' ' const gone = [];' ' for (const part of PARTS) {' ' const has = lines.some(function (l) {' ' return l.startsWith(part + \": \") && l.length > part.length + 2;' ' });' ' if (has === false) gone.push(part);' ' }' ' return gone;' '}' >> say1.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
プロンプトの採点を書く(3)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' for (const p of [vague, good]) {' ' const gone = missing(p);' ' console.log(\"点数 \" + (4 - gone.length) + \" / 4、足りない部分: \" + (gone.join(\"、\") || \"なし\"));' ' }' ' const sample = \"北高が南高に 3 対 2 で勝ち、決勝点は田中さんでした。\";' ' const reply = await ask([{ role: \"user\", content: good }], sample, 80);' ' console.log(\"モデル: \" + reply.text);' '}' 'main();' >> say1.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
二つのプロンプトを採点する
docker exec -w /home/node/project agent node say1.jsここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
Run が表示するもの
最初の二行は、あいまいなプロンプトと書いたプロンプトの点数です。あいまいなほうは 0 点で、四つとも足りません。書いたほうは 4 点です。
最後の行は、ラボのモデルの短い答えです。モデルがなければ、先に「記録済みサンプル」と出ます。答えの言葉は実行ごとに変わることがあり、それは普通です。
よくある間違い
注意
「長いプロンプトほどよい」と考えがちです。そうではありません。各部分があり、それぞれが一つのことを言っているプロンプトがよいのです。答えを絞るか、形を決める行だけを足してください。