チャットボットは次の言葉を予想する
チャットボットは、文字を打って話しかける AI のプログラムです。返事は、次の言葉を予想することを何度もくり返して書いています。
このしくみを知ると、ふしぎなくせのわけがわかります。チャットボットは、自信たっぷりなのに、まちがえることがあるのです。
このレッスンのゴール
メモ
チャットボットが返事を書くしくみを説明できる。
キーワード
| ことば | いみ |
|---|---|
| チャットボット | 文字を打って話しかける AI のプログラム |
| プロンプト | チャットボットに送る言葉 |
| 予測 | 次に来るものを予想すること |
| ありそうな | 例の中でよく見かけた |
| 自信ありげ | たしかなように聞こえること |
学生が入力するセルは、このプレビューでは空白です。
一度に一つの言葉を書く
チャットボットは、ものすごい量の文章から学んでいます。あなたがプロンプトを送ると、次の言葉を予測して足します。そして、その次の言葉を予測します。
返事が終わるまで、これを続けます。答え全体を先に考えてから書くわけではありません。
例: 次に来るのは何か
| ここまでの言葉 | 次の言葉 | 10回のうち見た回数 |
|---|---|---|
| 放課後、友だちとよくするのは | サッカー | 5 |
| 放課後、友だちとよくするのは | ゲーム | 3 |
| 放課後、友だちとよくするのは | カラオケ | 2 |
学生が入力するセルは、このプレビューでは空白です。
次の言葉を自分で数える
下の Python は、短い4つの文から学びます。選んだ言葉のすぐあとに、どの言葉が来たかを数えます。文は、言葉の間にスペースを入れて書いてあります。
Run を押しましょう。次に、最後の行の「と」を「放課後」に変えて、もう一度動かします。
次に来た言葉はどれか
# プログラムが学ぶ4つの文。言葉の間にスペースを入れて書きます。
sentences = [
"放課後 は 友だち と サッカー を する",
"放課後 は 友だち と ゲーム を する",
"土曜日 は 兄 と サッカー を する",
"放課後 は 一人 で ラーメン を 食べる",
]
def next_words(word):
counts = {}
for sentence in sentences:
words = sentence.split()
for i in range(len(words) - 1):
if words[i] == word:
after = words[i + 1]
if after not in counts:
counts[after] = 0
counts[after] = counts[after] + 1
return counts
print(next_words("と"))
ラボのチャットボットに聞く
メモ
ラボを起動してから、次の2つの Run を押しましょう。どちらも、ラボのチャットボットに文の続きを頼みます。学校で AI が使えないときは、かわりに記録済みのサンプルが、そうわかる印付きで表示されます。
次の言葉を聞く
docker exec -w /home/node/project agent node -e "const u=(process.env.AI_URL||'http://ai:4000')+'/v1/chat/completions';const post=(m,t,x)=>fetch(u,{method:'POST',headers:{'content-type':'application/json',authorization:'Bearer lab'},body:JSON.stringify({model:'lab',messages:[{role:'user',content:m}],max_tokens:t,temperature:x})}).then(r=>r.json());post('次の文の続きを、一つの言葉だけで答えてください。ほかには何も書かないでください。放課後、友だちとよくするのは',12,0.7).then(j=>console.log('チャットボット: '+j.choices[0].message.content)).catch(e=>console.log('記録済みのサンプル(チャットボットは答えませんでした): サッカー'))"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
同じことを2回聞く
docker exec -w /home/node/project agent node -e "const u=(process.env.AI_URL||'http://ai:4000')+'/v1/chat/completions';const post=(m,t,x)=>fetch(u,{method:'POST',headers:{'content-type':'application/json',authorization:'Bearer lab'},body:JSON.stringify({model:'lab',messages:[{role:'user',content:m}],max_tokens:t,temperature:x})}).then(r=>r.json());const s=['サッカー','ゲーム'];(async()=>{for(let i=0;i<2;i++){let t;try{const j=await post('次の文の続きを、一つの言葉だけで答えてください。ほかには何も書かないでください。放課後、友だちとよくするのは',12,1);t='チャットボット: '+j.choices[0].message.content}catch(e){t='記録済みのサンプル(チャットボットは答えませんでした): '+s[i]}console.log((i+1)+'回目: '+t)}})()"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
たしかそうでも正しいとは限らない
チャットボットは、ありそうな言葉を選びます。それが本当かどうかは確かめません。まちがった文でも、ありそうな文になることがあります。
だから、チャットボットは、うその内容を落ち着いた自信ありげな調子で書くことがあります。たしかそうに聞こえることと、正しいことは別です。
よくある間違い
注意
チャットボットは、検索のように答えを調べている、と考える人が多いです。そうではありません。型からありそうな言葉を書いているので、大事なことは使う前に確かめましょう。
さらに挑戦: 中のしくみ
本物のチャットボットも、あなたが数えたのと同じ考えを、ずっと大きな規模で使っています。直前の言葉だけでなく、その前のたくさんの言葉も見ています。
興味があれば、大学向けのモジュール「言語モデルの仕組み: トランスフォーマーを一から作る」で、そのやり方を学べます。