同じ説明をまたさせられる
通販サイトの問い合わせAIが、荷物の遅れを三回聞き返しました。客は怒って「担当の人を出して」と頼みます。やっと代わった担当者は、最初から事情を聞き直しました。
人に代わる場面で大切なのは、いつ代わるかと、何を渡すかです。
このレッスンのゴール
メモ
AIが人に代わる条件を決め、引き継ぎメモを作れる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| 引き継ぎ | AIから人へ会話を渡すこと | |
| 引き金 | 引き継ぎを決める条件 | 客の希望 |
| メモ | 人に渡す、会話の要点 | |
| 往復 | 客と AI の発言のやり取り一回分 | |
| 待ち行列 | 人を待つ会話の並び |
学生が入力するセルは、このプレビューでは空白です。
代わる条件を先に決めておく
代わる条件は、あらかじめ決めておきます。ここでは四つを使います。客が人を希望した、返金や苦情の話題だった、AIの自信が低い、往復が多すぎる、です。
どれか一つでも当てはまれば、人に代わります。境界ちょうどの値は、まだAIのままにします。
四つの会話と判定
| 会話 | 話題 | 判定 |
|---|---|---|
| c1 | 営業時間 | AIのまま |
| c2 | 返金 | 引き継ぎ: 話題 |
| c3 | 配達 | 引き継ぎ: 自信と往復 |
| c4 | 営業時間 | 引き継ぎ: 希望 |
学生が入力するセルは、このプレビューでは空白です。
渡すメモと、先に回す会話
引き継ぎメモには、会話の番号、理由、最後の発言、往復の数を入れます。人が最初から聞き直さずに済みます。
待ち行列では、客が人を希望した会話を先に並べます。それぞれのグループの中では、届いた順を保ちます。
よくある間違い
注意
「人への道はなるべく隠し、AIで済ませたほうがよい」と考えがちです。希望した客を引き止めると、信頼が落ちます。人への道は、見える場所に置いて、すぐ使えるようにします。
モデル用の補助を書く(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 RULES = { maxTurns: 6, minConfidence: 50, topics: [\"返金\", \"苦情\"] };' 'const CHATS = [' ' { id: \"c1\", turns: 3, confidence: 90, topic: \"営業時間\", asked: false, last: \"何時に開きますか。\" },' ' { id: \"c2\", turns: 4, confidence: 80, topic: \"返金\", asked: false, last: \"お金を返してほしいです。\" },' ' { id: \"c3\", turns: 8, confidence: 40, topic: \"配達\", asked: false, last: \"まだ届きません。\" },' ' { id: \"c4\", turns: 2, confidence: 95, topic: \"営業時間\", asked: true, last: \"担当の人と話したいです。\" },' '];' > handover.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
引き継ぎの判定を書く(2)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function reasons(c) {' ' const out = [];' ' if (c.asked) out.push(\"希望\");' ' if (RULES.topics.includes(c.topic)) out.push(\"話題\");' ' if (c.confidence < RULES.minConfidence) out.push(\"自信\");' ' if (c.turns > RULES.maxTurns) out.push(\"往復\");' ' return out;' '}' >> handover.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
引き継ぎの判定を書く(3)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' for (const c of CHATS) {' ' const why = reasons(c);' ' console.log(c.id + \" \" + (why.length > 0 ? \"引き継ぎ \" + why.join(\"+\") : \"モデルのまま\"));' ' }' ' const note = CHATS[2];' ' console.log(\"メモ \" + JSON.stringify({ id: note.id, reasons: reasons(note), last: note.last, turns: note.turns }));' ' const msg = \"担当の人に代わることと、同じ説明を繰り返さなくてよいことを伝える、短い一文を書いてください。\";' ' const reply = await ask([{ role: \"user\", content: msg }], \"ここから担当の人に代わります。同じ説明は不要です。\", 40);' ' console.log(\"客に見せる一行: \" + reply.text);' '}' 'main();' >> handover.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
引き継ぎを判定する
docker exec -w /home/node/project agent node handover.jsここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
出力の例
| 行 | 示していること |
|---|---|
| c1 モデルのまま | 条件がどれも当てはまらない |
| c2 引き継ぎ 話題 | 返金の話題は、一つで十分 |
| c3 引き継ぎ 自信+往復 | 理由は決まった順に並ぶ |
| メモ {...} | 人に渡す要点 |
| 客に見せる一行: ... | モデルの一文。言葉は毎回違う |
学生が入力するセルは、このプレビューでは空白です。