DoorDash が AI 買い物アシスタントをどう作ったか:モデルだけに頼らず、ツールと記憶で落地させる
- DoorDash が Ask DoorDash を発表。自然言語の会話でレストラン検索・献立計画・カート作成ができる AI アシスタントで、現在は米国内の一部地域で iOS に段階公開中。
- アーキテクチャはオーケストレーター、専門ドメインエージェント、共有ツール層、マネージドサービスを4層に分け、業務ロジックは共有ツール層に置き、プロンプトには詰め込まない。
- 3層の記憶システム(長期記憶はオフラインバッチ、セッション内記憶はリアルタイム更新、対話記憶は明示抽出)がパーソナライズを支える。7日間の本番データでは、記憶ありの食料品チェックアウト転換率が相対で約24%向上、バスケットサイズ17%増、対話ターン7%減、レストラン推薦転換率15%向上。
- 自前の評価基盤は AI がユーザーを演じ、録画済みツールデータを再生。1日2000件超の自動評価でエージェント品質点が8点上がり、回帰テストは6時間から20分へ。遅延35%削減かつ品質維持のモデル基盤移行も支えた。
DoorDash は何を出したか
いま開放されているのはレストラン検索と食料品買い物の2シーンだけで、Android と Web はまだ。初期データではメッセージの約7割が「探す」系(「近くのラーメン」「今夜何食べよう」「今週のベジ夕食の買い方」など)。大半のユーザーは同じ会話内で何ターンも直し、一言で終わらない。DoorDash も本番でいちばん起きやすい失敗は「事実のずれ」だと書く:閉店中の店を勧める、価格がカタログと違う、カートに入ったと言ったのに入っていない。直し方は同じで、事実に触れる一文はすべてツールでシステム・オブ・レコードを引き、文脈だけで推測させない。
1回の注文の裏で何が起きているか
Turn 2 が肝心:カートウィジェット上のポチポチ編集はすべてカート・オブジェクトを直接更新し、AI の往復は発生しない。いちばん重い「AI 呼び出し」を大半の操作から外している。

4層アーキテクチャの役割分担
オーケストレーターとドメインエージェントは A2A(agent-to-agent)で会話する。社内の部署が共通の書類フォーマットでやり取りするイメージ:形式が合えば、レストラン班と食料品班は別々に開発・リリースでき、同時リリースに縛られない。
「エージェントロック」という細部がある:前ターンが買い物体なら、今ターンの「カートに入れて」は食料品エージェントへ寄せたままにし、意図が明らかに変わるまで切替えない。各エージェントは Google の Agent Development Kit 上で動き、モデルは役割ごとに設定。問題があれば役割単位で差し替え、新バージョンを配らなくてよい。


記憶システム:エージェントに「あなたが誰か」を覚えさせる
エージェントは毎回ゼロから始まり、誰と話しているか知らない。DoorDash が解くのは、散在するユーザーデータを「正しい瞬間に正しい文脈」へ変えること。3層記憶+4段階の記憶スケジューリングで実現する。
| 記憶層 | 更新リズム | 中身 |
|---|---|---|
| 長期記憶 | 日次/週次バッチ | 食事嗜好・外食習慣・ブランド・よく行く店 |
| セッション内記憶 | リアルタイム | 現在のカート・検索中・見たのに見送った商品 |
| 対話記憶 | 対話中に生成 | 今回の会話で明示した、長期で残すべき事実 |
3層だけでは足りない。AI はまず「今ターンはどの記憶を引くか」を決める必要がある。DoorDash はこの過程を4段階に分けた:
「チキンティッカマサラを作りたい」を通すと:①意図解析でレシピ要求と判定し、ブランド/分量の嗜好を引き、近くの店は見ない。②クエリ計画で「キーワードでブランド」「意味検索で分量履歴」に分け、食料品関連ブロックだけを探す。③検索順位付けを並列実行し、最近確定した「2人分をよく買う」を上に。④「2人分・Oatlyをよく買う・肉なし」など数行の構造化事実をプロンプトへ。エージェントは数百件の履歴を全部載せない。クエリ計画は3軸でパラメータ化:意味類似/キーワード厳密/構造化フィールド、どの記憶区画か、件数・類似度しきい値・時間窓。
キーワード検索を効かせるため、会話開始時にそのユーザーの現在記憶に実在する語の目録(Memory Bank Index)をプロンプトへ入れる。目録にない語を探すとトークンを無駄にするだけ。注文履歴のような巨大ブロックでは、まず軽量の「ざっと見」で件数や可用性を取り、全文を読む価値があるか決めてから入れる。
記憶と棚の現実がぶつかったら、どちらが譲る
記憶と今の現実は別物。「いつも Oatly」でも最寄りに在庫がなければ代替を探す。「60ドル予算」でも最低72ドルなら、偽の60ドルに合わせず事実を伝える。この照合は別レイヤではなく、同一ターンで嗜好を取り出し、検索・カートツールのリアルタイム価格・在庫・営業時間と突き合わせ、衝突したら現実側に寄せる。


記憶はどう沈殿し、どう精密に忘れるか
一言が使える記憶になるまで
「うちはベジなので、今週も2人分で。」
内容家族はベジ、よく2人分を買う
有効期限長期(本人が変えない限り)
「これは友達用で今夜だけ」のような一回限りはスキップし、長期記憶に入れない。基準はシーンで変わる:レストランで「ラーメンはいい」は一時の気分とみなし、always/never などがなければ覚えると以後ずっと麺を避ける害になる。食料品では「Oatly が好き」は長期のブランド信号。価格感度はユーザーが能動的に言った時だけ(「Safeway の安いのは?」など)。AI が安い店を勧めて受け入れただけでは、その人の持続的な判断とはみなさない。
「忘れる」は「覚える」より難しい
「Nova のチーズ焼きが好きなのを忘れて」を類似度やキーワードだけで消すと、Nova やチーズに関する、まだ残したい記憶まで一緒に消しやすい。
削除は保存と違う。保存は非同期で遅延を足さず、削除は同期。エージェントは返信で何件消したかをすぐ言える。統一の有効期限もない:食用油は80日前でも台所にある確率が高く、牛乳は12日前なら飲み切っている確率が高い。ベジなど本人が言った嗜好には TTL がなく、本人が変えるまで残る。寿命は中身次第で、一律の減衰式は使わない。
エージェントが本当に頼れるとどう知るか
エージェント対話に唯一の正解はなく、人手抜き取りではスケールしない。DoorDash は自動評価基盤を作り、「この対話はユーザーを助けたか」を毎日回せ、数値化できる問題にした。
各基準を二元判定できる形に書く(例:推奨店が配達時間・予算・食事制限を満たすか)。まずこのシーンに適用するか判定し、適用時だけ採点。reorder 専用の検査がレシピ場面を誤って減点しない。
各対話は OpenTelemetry で計装し ClickHouse に保存。生ログは情報過多なので Python が各採点基準専用の証拠スライスに切り、ジャッジは必要な部分だけ見る。
AI がユーザーを演じ、台本どおり多ターンを回す。ツール応答は録画済みフィクスチャ(本番DBは叩かない)で、同じシナリオの起点を毎回固定し、点数を公平に比較できる。
GEPA で採点プロンプトを反復し、人手ラベルと揃うまで校正。整ったあと1日2000件超の対話を自動審査できる。
評価時は本番の在庫・注文 API を叩かず、事前録画の固定レスポンスを再生する。同じシナリオの開始条件が毎回同じなので、点数の変化をエージェント自体に帰せ、今日たまたま在庫があった偶然に左右されない。
採点プロンプトを自動で書き換え反復する手法:新版を次々生成し、人手ラベルにいちばん近い版を残し、AI ジャッジの尺度を人の審査に近づける。


評価システムが2つの本番インシデントでどう効いたか
事例①:AI がコードを読み上げているみたい
タスクは完了していたが、返信に「reorder skill」「fetch」「in parallel」など内部用語が混ざり、店員ではなく別プログラムへの報告のように聞こえた。
コミュニケーション規則を整理し、内部スキル指示とユーザー向け文言を分離。オフライン検証でこの種の問題は11%減。全シナリオ再走で回帰なしを確認し、公開後のモニタでも改善が続いた。
事例②:モデルを換えたら点数が落ちた
Gemini 3.5 Flash 発表時、DoorDash のエージェントは Claude Sonnet 4.6 上だった。Flash のベンチは速そうで遅延削減のため乗り換えを検討したが、基盤モデル変更は高リスクで、品質が落ちないことを先に検証してから公開する必要があった。
原因は能力不足ではなくフォーマット互換:Flash は一部ツール引数を Sonnet と違う形(文字列のところを JSON オブジェクトなど)にし、システムプロンプトの暗黙の約束を Sonnet は補完できても Flash は読めなかった。修正も対症:ツール入力に決定的な補正を入れ、不正フォーマットを捨てずに直す/プロンプトに「店舗名はデータどおり、加工しない」などを明示。再評価で点数は Sonnet と誤差が評価ノイズ内で並んだ。公開後の品質・関与指標でも遅延35%減、品質は下がらなかった。
この仕組みは何をもたらすか
業務ロジックを共有 MCP ツール層に置くと、検索・カート・在庫ツールを社内の他 AI 機能チームがそのまま使える。バックエンドを一度上げれば上層エージェント全員が恩恵を受け、チームごとに再接続しなくてよい。
記憶は独立ツール層で、特定エージェントの専有ではない。買い物対話で「この家は全員ベジ」を学んだら、予約や出前推薦の他エージェントがすぐ使え、抽出・重複排除・検索を各チームがやり直さなくてよい。
自動評価で回帰が6時間→20分になり、モデルやプロンプトの変更を数十分で検証できる。「基盤モデル載せ替え」のような高リスクも、低リスクのオフラインで通してから本番ユーザーへ出せる。
カート編集を版付きオブジェクトへ直接更新し AI 往復を省くのは、モデルが速くならなくても E2E 遅延を下げる考え方で、「AI+リアルタイム在庫/価格」系アプリにそのまま持ち運べる。
本番データは何を語るか
使える AI エージェントを作るのも難しい。本当に良いか知るのはさらに難しい。Raghav Saboo、DoorDash 推薦・検索リード
1週間分の食材:自分で1点ずつカートへ → 一言で AI が2分で組み立て
DoorDash が AI 買い物アシスタント Ask DoorDash を公開。速くて頼れる秘訣はモデルの賢さより、「あなたを覚え」「毎日2000回の模擬試験」すること。このページで図解する。
↓ 1ページで読了 · 動く図あり
DoorDash は米最大級の出前・お使いプラットフォーム(中国の美団外卖に近い)。新公開の Ask DoorDash は米一部地域の iOS で段階公開(一部ユーザー向け)。できることは2つ:レストラン検索と買い物体。
✘ でも今どの店が開いているか、アボカドがあるか、実価格、全家がベジと言ったかも覚えていない
これらの情報は AI の「脳」になく、毎分変わり、ネットでもほぼ取れない。賢いモデルだけでは答えられない。
以前は1週間分をアプリで1点ずつ検索して追加。いまは一言。
アプリで1点ずつ検索してカートへ。1週間2人分を揃え、$60 を超えないよう見張る。
「2人分の60ドル・ベジリストを」の一言で、AI がリアルタイム在庫と価格を見て2分で満載し、あなたは微調整するだけ。
時間短縮の工夫もある:カート上のブランド差替え・数量・家にある物の削除はデータを直接更新し AI を通さないので速い。ただし「一言で車を満載」は簡単に見え、DoorDash は2つの難題——あなたを覚えさせること、本当に頼れるかを測ること——を解く必要がある。
まず難題①:正しい瞬間に、あなたに関する正しい数件だけを思い出させる。
小互の一言に、AI はゼロから推測しない。数百の記憶から関連数件(ベジ・Oatly・2人分)だけを抜き、不要は詰めず、棚の在庫と価格を見て1台を組む。同じ記憶は精密に忘れもする:「この嗜好を忘れて」と言えばその1件だけ消し、隣を誤削除しない。
難題②:AI は頼れるか?以前は社員の散発フィードバック(1日約1件)だけ。いまは AI が何千人もの客を演じ、別の AI ジャッジが採点し、1日2000回超「試験」する。記憶+評価がもたらす効果は、
終わらない…
言葉は分かる、
でも見えない:
- × どの店が開いている
- × アボカドがあるか
- × 実価格はいくらか
- × 全家がベジと言ったか
約 5 倍速い
関連3件だけ抜く
AI ジャッジが採点
DoorDash の自測、
7日窓口、
第三者再現なし。
モデルが賢いからではない
