クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

チャットボットが返事を書くしくみ

このレッスンのあとで: チャットボットが返事を書くしくみを説明できる。

45分のレッスンコマンド2件AI コーディングエージェントのラボ:opencode でコードを説明・修正し、その結果を確かめる

チャットボットは次の言葉を予想する

チャットボットは、文字を打って話しかける AI のプログラムです。返事は、次の言葉を予想することを何度もくり返して書いています。

このしくみを知ると、ふしぎなくせのわけがわかります。チャットボットは、自信たっぷりなのに、まちがえることがあるのです。

このレッスンのゴール

メモ

チャットボットが返事を書くしくみを説明できる。

キーワード

ことばいみ
チャットボット文字を打って話しかける AI のプログラム
プロンプトチャットボットに送る言葉
予測次に来るものを予想すること
ありそうな例の中でよく見かけた
自信ありげたしかなように聞こえること

学生が入力するセルは、このプレビューでは空白です。

一度に一つの言葉を書く

チャットボットは、ものすごい量の文章から学んでいます。あなたがプロンプトを送ると、次の言葉を予測して足します。そして、その次の言葉を予測します。

返事が終わるまで、これを続けます。答え全体を先に考えてから書くわけではありません。

例: 次に来るのは何か

ここまでの言葉次の言葉10回のうち見た回数
放課後、友だちとよくするのはサッカー5
放課後、友だちとよくするのはゲーム3
放課後、友だちとよくするのはカラオケ2

学生が入力するセルは、このプレビューでは空白です。

次の言葉を自分で数える

下の Python は、短い4つの文から学びます。選んだ言葉のすぐあとに、どの言葉が来たかを数えます。文は、言葉の間にスペースを入れて書いてあります。

Run を押しましょう。次に、最後の行の「と」を「放課後」に変えて、もう一度動かします。

次に来た言葉はどれか

コード: python
# プログラムが学ぶ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)}})()"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

たしかそうでも正しいとは限らない

チャットボットは、ありそうな言葉を選びます。それが本当かどうかは確かめません。まちがった文でも、ありそうな文になることがあります。

だから、チャットボットは、うその内容を落ち着いた自信ありげな調子で書くことがあります。たしかそうに聞こえることと、正しいことは別です。

よくある間違い

注意

チャットボットは、検索のように答えを調べている、と考える人が多いです。そうではありません。型からありそうな言葉を書いているので、大事なことは使う前に確かめましょう。

さらに挑戦: 中のしくみ

本物のチャットボットも、あなたが数えたのと同じ考えを、ずっと大きな規模で使っています。直前の言葉だけでなく、その前のたくさんの言葉も見ています。

興味があれば、大学向けのモジュール「言語モデルの仕組み: トランスフォーマーを一から作る」で、そのやり方を学べます。

このラボとソースについて: AI コーディングエージェントのラボ:opencode でコードを説明・修正し、その結果を確かめる

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。