レッスン 1 / 7
チャットボットの全体像
学ぶコト
- ルールで答えるボットとLLMで答えるボットの違い
- 今でもルールのほうが向いている場面
- チャットボットを形づくる7つの部品
- このコースで作るボットと、準備するもの
このコースでは、架空のネットショップ「ことり雑貨店」のお問い合わせ窓口のチャットボットを、Python で作って公開するところまで進めます。画面は Streamlit で作り、答えは OpenAI の API で作ります。
最初のレッスンでは、コードを書き始める前に「チャットボットはどんな部品でできているか」をおさえます。全体の地図を持っておくと、あとのレッスンで「今どこを作っているのか」が分かりやすくなります。
このページの Python のコードは「▶ 実行」を押すと、ブラウザの中で動かせます。上から順に実行してください。
チャットボットの2つの作り方
チャットボットの作り方は、大きく2つに分けられます。
- ルールで答えるボット:「送料」という言葉が入っていたら、送料の説明を返す。あらかじめ決めた条件と答えの組で動きます
- LLMで答えるボット:お客様の文章を大規模言語モデル(LLM)に渡して、答えの文章を作らせます。ChatGPT のような答え方ができます
まずは、ルールで答えるボットを作って動かしてみましょう。言葉が入っているかどうかだけで答えを選ぶ、いちばん簡単な形です。
import unicodedata
RULES = [
(["送料", "配送料"], "送料は全国一律550円です。お買い上げ金額が5,000円以上のときは無料になります。"),
(["営業時間", "受付時間"], "お問い合わせ窓口の受付時間は、平日の10時〜17時です。"),
(["返品", "交換"], "商品が届いてから8日以内の、未使用の商品に限り返品を受け付けています。"),
]
FALLBACK = "申し訳ありません。そのご質問にはお答えできません。お問い合わせフォームからご連絡ください。"
def rule_bot(text):
t = unicodedata.normalize("NFKC", text) # 全角・半角の違いをそろえる
for words, answer in RULES:
if any(w in t for w in words):
return answer
return FALLBACK
rule_bot("送料はいくらですか?")
決まった質問には、決まった答えが正確に返ってきます。では、もう少し違う聞き方をしてみます。
questions = [
"返品できますか",
"注文した商品はいつ届きますか?",
"いまカートに3,200円分あります。送料無料まであといくらですか?",
"交換ではなく、色違いを追加で注文したいです",
]
for q in questions:
print("Q:", q)
print("A:", rule_bot(q))
print()
結果を見ると、ルールで答えるボットの弱いところが分かります。
- 「いつ届きますか?」は、ルールがないので答えられません
- 「あといくら?」には、送料の一般的な説明を返すだけで、「あと1,800円です」とは答えられません
- 「交換ではなく、追加で注文したい」は、「交換」という言葉に反応して、返品の説明を返してしまいました
ルールを足せば1つずつ直せますが、お客様の聞き方は無限にあります。ルールは増えるほど、どのルールが先に当たるかの管理も難しくなります。
LLMで答えるボットなら、言い回しが違っても意味をくみ取り、「あと1,800円で送料が無料になります」のように、質問に合わせた答えを作れます。その代わり、答えがいつも同じになるとは限らず、もっともらしい間違いをすることもあります。
| ルールで答えるボット | LLMで答えるボット | |
|---|---|---|
| 得意なこと | 決まった質問に、いつも同じ答えを返す | いろいろな言い回しを理解し、質問に合わせて答える |
| 苦手なこと | ルールにない質問、言葉は合っていても意図が違う質問 | いつも同じ答えを返すこと、事実の正しさの保証 |
| まちがえ方 | 「分かりません」と答える・見当違いの答えを返す | それらしい間違い(ハルシネーション)を自信ありげに書く |
| 費用 | 作るのに手間がかかり、動かすのはほぼ無料 | 作るのは早く、1回答えるごとにAPIの料金がかかる |
| 直し方 | ルールを足す・直す | 指示(プロンプト)・渡すデータ・関数を直す |
今でもルールのほうが向いている場面
LLMが出てきても、ルールが要らなくなったわけではありません。次のような場面では、今でもルールのほうが向いています。
- 答えが1つに決まっていて、言い換えてほしくないもの:送料・営業時間・返品の期限・利用規約の文言など。LLMに言い換えさせると、細かい条件が抜けることがあります
- 必ず決まった手順を通すもの:本人の確認、注文のキャンセル、支払い。LLMの判断に任せず、コードで決まった順に進めます
- 間違えたときの影響が大きいもの:お金・契約・健康・法律に関わる判断。ボットは答えずに、人に引き継ぎます
- とても数が多く、同じ質問ばかりのもの:1日に何万回も来る同じ質問は、決まった答えで返すほうが安く、速く、正確です
実際のサービスでは、ルールとLLMを組み合わせるのがふつうです。このコースで作るボットも、次のように分けます。
- まずルールで振り分ける(決まった質問・断るべき質問・人に引き継ぐ質問)
- それ以外の質問を、LLMに答えさせる
- 注文を調べる・日付を計算するなどの「正しさが大事な仕事」は、LLMからコードの関数を呼んでもらう
- キャンセルのような「取り消せない操作」は、お客様がボタンで確定するまで実行しない
チャットボットを形づくる7つの部品
LLMで答えるチャットボットは、次の7つの部品でできています。
| 部品 | 役割 | このコースで使うもの |
|---|---|---|
| 画面(UI) | お客様が文章を入力し、答えを読む | Streamlit |
| 会話の状態 | これまでのやりとりを覚えておく | Python のリスト(レッスン2) |
| モデル | 文章を読んで、答えを作る | OpenAI の GPT-6 Luna(Responses API) |
| 指示 | ボットの役割・話し方・答える範囲を決める | instructions(レッスン6) |
| 関数(ツール) | 注文を調べる・日付を計算するなど、コードで正しく行う仕事 | Function Calling(レッスン5) |
| データ | 店のルール・注文の情報など、答えのもとになる情報 | Python の辞書(本物ならデータベース) |
| ログ | どんな質問にどう答えたかの記録。見直して改善する | JSON の記録(レッスン6・7) |
お客様が1回質問すると、部品は次の順に動きます。
- お客様が画面に質問を書く
- ルールで振り分ける。決まった答えで返せるものは、ここで返す
- それ以外は、指示・これまでの会話・今の質問をまとめて、モデルに送る
- モデルが「注文を調べたい」と考えたら、関数を呼ぶよう頼んでくる。コードが関数を動かし、結果をモデルに返す
- モデルが答えを作り、画面に少しずつ表示する
- 答えを会話の状態に足し、ログに記録する
「モデル」は部品の1つにすぎません。ボットの出来は、モデルの賢さだけでなく、指示の書き方・渡すデータ・関数・ルールでの振り分けで大きく変わります。
このコースで作るもの
作るのは、ことり雑貨店のお問い合わせ窓口のボットです。次のことができるようにします。
- 送料・返品・支払いなどのよくある質問に答える(決まった答えはルールで返す)
- 注文番号と電話番号の下4桁から、注文の状況を調べる
- 今注文したら、いつ届くかを計算する(店の休みを除いた日で数える)
- 注文のキャンセルを受け付ける(確定はお客様がボタンで行う)
- 店と関係のない質問や、指示を書き換えようとする入力を断る
- クレームや「人と話したい」には、担当者への連絡のしかたを案内する
- 使いすぎを防ぐ上限を付けて、インターネットに公開する
レッスンは次の7つです。
| レッスン | 内容 |
|---|---|
| 1. チャットボットの全体像 | ルールとLLMの違い、部品、作るもの(このレッスン) |
| 2. 会話の記憶を扱う | 履歴の持ち方、トークンの節約、お客様ごとの会話(ブラウザで動かせます) |
| 3. まずはターミナルで動かす | API で会話を続ける、少しずつ表示する、エラーに備える |
| 4. Streamlit で画面を作る | チャットの画面、会話の保存、設定のメニュー |
| 5. 関数を呼ばせる(Function Calling) | 注文の検索・お届け日の計算、引数の確認、キャンセルの確定 |
| 6. 答え方を決めて守る | 指示の書き方、断る・引き継ぐ、入力と出力のチェック、ログの見直し(ブラウザで動かせます) |
| 7. 公開して使ってもらう | Streamlit Community Cloud、APIキーの管理、費用の上限、プライバシーの案内 |
準備するもの
このコースは「LLMのしくみとAPI入門」を終えた人を対象にしています。Responses API で答えを受け取る・会話を続ける・少しずつ受け取る、といった基本は、そちらで学んだ前提で進めます。
- Python 3.11 以上:2026年10月時点の Streamlit は Python 3.11 以上で動きます。手元のパソコンに入れておきましょう(レッスン3で作業用のフォルダを作ります)
- OpenAI の APIキー:「LLMのしくみとAPI入門」で作ったものを使います。このコースで使う GPT-6 Luna は、OpenAI のモデルの中でも安いモデルです。値段は料金のページで確かめてください。練習で数十回やりとりする程度なら、費用はわずかです
- GitHub のアカウント:最後のレッスンで、作ったボットを公開するときに使います
ウマたんいきなり全部を作ろうとすると、どこで止まっているのか分からなくなりがちです。このコースでは、ターミナルで動かす → 画面を付ける → 関数を足す → 守りを固める → 公開する、と一歩ずつ部品を足していきます。
演習
まとめ
- チャットボットには、ルールで答えるものとLLMで答えるものがある。ルールは決まった質問に正確で、LLMはいろいろな言い回しに対応できる
- 答えが1つに決まっているもの・決まった手順・間違えると影響が大きいものは、今でもルールやコードで扱う。実際のボットは、両方を組み合わせて作る
- チャットボットは、画面・会話の状態・モデル・指示・関数・データ・ログの7つの部品でできている
- このコースでは、ことり雑貨店のお問い合わせ窓口のボットを、部品を1つずつ足しながら作って公開する
次のレッスンでは、チャットボットが「会話を覚えている」しくみと、その記憶を上手に扱う方法を、ブラウザでコードを動かしながら見ていきます。
分からないところがあればこのレッスンについて質問するこのコースの Q&A を見る
