低評価は無料のテストケース
フィードバックのループは、回答についての利用者の声を、変更のたびに試すケースに変えます。利用者は、思いもしなかった質問を見つけます。修正付きの低評価は、最良のテストケースです。
ただし、個人的な言葉も含みます。だれが見られるか、どれだけ保存するかを決める必要があります。
このレッスンのゴール
メモ
回答についての利用者の声を、よりよいケースに変えられます。
キーワード
| ことば | いみ |
|---|---|
| フィードバック | 利用者が回答に付ける評価や修正 |
| 修正 | 利用者が「こうあるべき」と言う答え |
| ケース | 質問と、期待する答えの組 |
| 保存期間 | 記録を削除するまで置く期間 |
| アクセス | 記録を読める人 |
学生が入力するセルは、このプレビューでは空白です。
修正がケースになる
すべてのフィードバックがケースになるわけではありません。修正のない低評価は、何かが違うことは示しますが、正しい答えは示しません。高評価は直すものがありません。
質問と、直した答えを残します。だれが言ったかは残しません。利用者の id やメールアドレスを持つケースは、守るべき個人データになります。
例: 三件のフィードバック
| 評価 | 修正 | ケースになるか |
|---|---|---|
| 低 | 日曜は 18 時です。 | なる: 質問とその答え |
| 低 | (なし) | ならない: 期待する答えがない |
| 高 | (なし) | ならない: 直すものがない |
学生が入力するセルは、このプレビューでは空白です。
だれが見るか、どれだけ置くか
生のフィードバックは、機能を改善する少数の人のものです。そこから作ったケースは、だれも含まないので、チーム全体で使えます。
保存期間を決め、過ぎた生の記録を削除します。Run では経過日数が記録に入った数値なので、全員が同じ結果を見ます。実際のシステムは日付を比べます。
よくある間違い
注意
「フィードバックは多く、長く持つほどよい」と考えがちです。生の記録には、利用者が入力した、ときに個人的な内容が入っています。ケースを残し、残りは予定どおり削除し、期間を書いておきます。
モデル用の補助を書く(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 KEEP_DAYS = 30; // これより古いフィードバックは削除する' 'const feedback = [' ' { id: \"f1\", rating: \"down\", question: \"お店は何時に閉まりますか。\", fix: \"日曜は 18 時です。\", user: \"u17\", age: 3 },' ' { id: \"f2\", rating: \"up\", question: \"注文はどこにありますか。\", fix: \"\", user: \"u22\", age: 5 },' ' { id: \"f3\", rating: \"down\", question: \"靴は返品できますか。\", fix: \"\", user: \"u31\", age: 12 },' ' { id: \"f4\", rating: \"down\", question: \"北海道へ届けられますか。\", fix: \"はい、3 日で届きます。\", user: \"u40\", age: 45 },' '];' > feedback.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
フィードバックのループを書く(2)
docker exec -w /home/node/project agent sh -c "printf '%s\n' '// ケースは質問と期待する答えを持ち、利用者は決して持たない。' 'function toCase(f) {' ' if (f.rating === \"down\" && f.fix.length > 0) return { id: f.id, question: f.question, expected: f.fix };' ' return null;' '}' >> feedback.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
フィードバックのループを書く(3)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' feedback.forEach(function (f) {' ' if (f.age > KEEP_DAYS) {' ' console.log(f.id + \": \" + KEEP_DAYS + \" 日より古いので削除\");' ' return;' ' }' ' const c = toCase(f);' ' console.log(f.id + \": \" + (c ? \"新しいケース: \" + c.question + \" -> \" + c.expected : \"ケースなし\"));' ' });' ' const q = \"このケースのテストは何を確かめるべきですか。一文で答えてください。質問: お店は何時に閉まりますか。期待: 日曜は 18 時です。\";' ' const r = await ask([{ role: \"user\", content: q }], \"答えに 18 時が含まれ、日曜に触れていることを確かめます。\", 60);' ' console.log(\"確認内容の一例: \" + r.text);' '}' 'main();' >> feedback.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ループを実行する
docker exec -w /home/node/project agent node feedback.jsここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
出力の例
| 行 | 示していること |
|---|---|
| f1: 新しいケース: お店は何時に閉まりますか。 -> ... | 最近の、修正付きの低評価 |
| f2: ケースなし と f3: ケースなし | 高評価と、修正のない低評価 |
| f4: 30 日より古いので削除 | 保存期間の決まりを適用した |
| 確認内容の一例: ... | あなた自身の呼び出し。実行ごとに変わるか、記録済みサンプルと出る |
学生が入力するセルは、このプレビューでは空白です。