元記事: https://moday.me/blogs/journal/15min-chatbot-render-comeback
15分で作ったチャットbot — Renderを捨てたのに、また使った
5/19 の機会損失から、15分で動いたところまで
別の記事で書いたが、5/19 に最初の問い合わせが2通来た。
当日中には返せず、返信を送ったのは翌日になった。
これを 機会損失 と認識したので、その日のうちにチャットbot を作った。
ストアの右下に置く、よくあるあのウィジェット。
作業開始から、Shopify にデプロイされて動き出すまで、約15分。
中身を、把握している範囲で書いておく。
構成
ざっくり、こうなっている。
- フロント:Shopify テーマに右下ウィジェット(自分はどう実装したか把握していない)
- バックエンド:Render.com で Claude API を叩く
- 言語:Shopify ロケールに連動、9言語
- 履歴:Google スプレッドシートに保存
- エスカレ:答えられない質問は問い合わせフォームに誘導
設計思想はシンプルで、シンプルに済ませる、これに尽きる。
個人事業のフェーズで、何をやるにしても、複雑なものを抱えたくない。
Render を捨てたのに、また使った
別の記事で「FastAPI / Render はもう外した」と予告した。
矛盾するようだが、外したのは Webhook 用途 の話。
Shopify 注文を受けて Gelato に流す処理が、Render 上の FastAPI で動いていた。
それは別の構成に置き換えた(その経緯はそれで1本書ける話なので、また別の機会に)。
チャットbot は、その Render を 別構成で復活させた。
Webhook サーバーとして動かしていたインフラと、チャットbot の API として動かすインフラ。
役割は別物で、別のサービス、別のプロセス。
同じ Render を使っているだけ。
「Render を外した」と「Render を使っている」は、矛盾しない。
用途ごとに、その時点で最適な道具を選び直す だけのこと。
過去の判断に縛られて「もう使わない」と決めると、判断が硬くなる。
判断軸は自分が持っている。実装は Claude Code が組む。
組み直すたびに、その時の最適解を取りに行く。
履歴を Google スプレッドシートに保存している
bot とユーザーのやり取りは、全部 Google スプレッドシートに書き込まれる。
日時、ロケール、ユーザーの質問、bot の回答、エスカレしたかどうか。
これは Claude Code の提案を採用した。
あとで考えると、3つの理由でちょうど良かった。
- DB を立てたくない:スキーマ設計が要る、運用費もかかる、可視化も別途要る。個人事業のフェーズには重い
- 無料で済む:Google アカウントさえあればコストゼロ
- 後で分析させるときに、自分も Claude Code もすぐ読める:列を眺めれば全部わかる
特に3つめが大きい。
これから Claude Code に「最近の問い合わせ傾向まとめて」と頼むときに、
スプレッドシートを直接読みに行ってもらえる。
DB だったら、抽出スクリプトを書いて、CSV に吐いて、と一手間挟む。
専用 DB なら綺麗だが、いまの規模では SS で充分。
個人事業のフェーズで、これは 正しいズボラ だと思っている。
9言語対応はどうやっているか
Shopify の現在ロケールを取得して、bot に渡す。
bot は「この言語で返してね」というプロンプトを使って Claude API を叩く。
途中に翻訳ステップは挟まない。Claude が直接その言語で書く。
別の記事で「翻訳ではなくローカライズ・リライト」と書いたが、これは bot にも当てはまる。
日本語で書いて英語に翻訳するのではなく、最初から英語ネイティブが書く文体で返答する。
ドイツ語ならドイツ語ネイティブとして返す。
モデルの中で完結するので、翻訳のレイテンシも、誤訳のリスクも、構造的に減る。
これも特別なことはしていない。
「Shopify のロケールを受け取って、その言語で返答するように」と1行頼んだだけ。
プロンプトには「サイトの情報を把握しろ」と書いた
bot は、MODAY のサイトに載っている情報と、Gelato の商品情報を答えられる。
配送可否、納期、サイズ、決済方法、返品ポリシー、価格、バンドル構成。
これを「把握しろ」と Claude Code に頼んだ。
正直に書いておくと、どうやって把握させたかは、自分は把握していない。
プロンプトに埋め込まれているのか、サイトを fetch しているのか、
両方を組み合わせているのか、それは Claude Code が決めて実装した。
別の記事で書いた通りで、指示は出した、実装は任せた。
動いていて、ちゃんとした返答が返ってくるので、いまのところそれで充分。
壊れたら、Claude Code に「直して」と言う。
答えられないものは、問い合わせフォームに誘導する
全部の質問に bot が答えてしまうのは、危険。
特定のサイズの個別相談、ギフトラッピング、法人案件、トラブル対応。
このあたりは bot に断言させると、後で齟齬になる。
bot が「これは答えない方がいい」と判断したら、問い合わせフォームに誘導する。
ガードレールの設計も、Claude Code に任せた。
自分がやったのは「答えられない質問は問い合わせフォームに誘導する仕様にして」
と1行頼んだだけ。
どの質問を bot が答えて、どの質問をエスカレするか。
その境界線も Claude Code が引いた。
たまにログを眺めて、明らかにおかしい振り分けがあれば調整するつもりだが、
今のところ来ていない。
15分で動いたのは、その15分の中で考えることが少なかったからだ。
「右下に置く」「Claude API ベース」「9言語」「Render 復活」「履歴は SS」
「エスカレは問い合わせフォーム」。
これだけ決まれば、あとは Claude Code が組む。
自分は GO を出して、動いたかどうか確認する。
ストアを開けてから2日目に、サポートの自動化基盤が動き始めた。
「1日1個改善」の最初の1個目が、これだった。
それでは、また書きます。
— Yoskee
moday.me
今日を着る。— MODAY のTシャツを手に入れる
| セット | 枚数 | 価格 |
|---|---|---|
| 一週間セット → | Mon–Sun (7) | $159 |
| 平日セット → | Mon–Fri (5) | $119 |
| スターターパック → | Mon · Wed · Fri (3) | $79 |
| 週末セット → | Sat · Sun (2) | $55 |
$99以上で送料無料 · 8色 × 6サイズ · 9言語