DoorDash 如何做好 AI 购物助手:不全靠模型,靠工具和记忆落地
- DoorDash 推出 Ask DoorDash,一款通过自然语言对话搜餐厅、规划三餐、建购物车的 AI 助手,目前在美国部分地区 iOS 端灰度上线。
- 架构把编排智能体、专业化的领域智能体、共享工具层、托管服务拆成四层,业务逻辑收在共享工具层,不塞进提示词里。
- 三层记忆系统(长期记忆离线批处理、会话内记忆实时更新、对话记忆显式提取)支撑个性化,7天生产数据显示:有记忆支持的生鲜杂货结账转化率相对提升约24%、客单量提升17%、对话轮次减少7%,餐厅推荐转化率提升15%。
- 自建评测框架用AI模拟用户跑录制好的工具数据,日均自动评测超2000场,智能体质量分提升8分,回归测试从6小时压缩到20分钟,支撑了一次把延迟降低35%且不掉质量的模型底座迁移。
DoorDash 上线了什么
目前只开放了两个场景:餐厅搜索和杂货购物,安卓和网页端还没上。早期数据显示,七成左右的消息都是找东西一类的需求,比如“附近的拉面”“今晚吃什么”“这周素食晚餐怎么买”;大部分用户会在同一个对话里来回改好几轮,边聊边调整,而不是问一句就走。DoorDash 也提到,目前生产环境里最容易出问题的地方是“信息对不上”:推荐了一家其实已经关门的店,报的价格和货架不一致,或者说加进购物车的东西其实没加进去。修法都是同一个思路,让 AI 每一句涉及事实的话,都必须真的调用一次工具去查系统里的真实数据,而不是凭上下文猜。
一次点单背后发生了什么
Turn 2 是关键的一处设计:用户在购物车widget上点点改改,这些操作全部直接改动购物车这个对象本身,不会再走一次AI模型判断,AI处于空闲状态。这意味着最耗时间的“调用AI”这一步,被从大部分交互里砍掉了。

四层架构怎么分工
编排智能体和领域智能体之间靠一套叫 A2A(agent-to-agent)的协议互相传话,好比公司里不同部门约定好统一的公文格式:只要格式对得上,餐厅团队和杂货团队各自开发、各自发布,互不干扰,也不用绑在一起上线。
有个细节叫“智能体锁定”:如果用户上一轮问的是买菜,这一轮说“加到购物车”,系统会默认继续路由给杂货智能体,而不是重新判断一次,直到用户的意图明显变了才切换。每个智能体跑在Google的Agent Development Kit上,具体用哪个AI模型按角色配置,出了问题可以按角色单独换模型,不用发新版本。


记忆系统:让 Agent 记住你是谁
智能体每次对话都是从零开始,不知道自己在跟谁说话。DoorDash 要解决的问题是把散在各处的用户数据,变成“在正确的时刻,给到正确的上下文”,靠的是三层记忆系统加一套四阶段的记忆调度流程。
| 记忆层 | 更新节奏 | 装的是什么 |
|---|---|---|
| 长期记忆 | 每天/每周批处理 | 饮食偏好、就餐习惯、品牌偏好、常去店铺 |
| 会话内记忆 | 实时 | 当前购物车、正在搜的东西、刚看过又跳过的商品 |
| 对话记忆 | 随对话产生 | 用户在这次对话里明说的、要长期记住的事 |
光有这三层记忆还不够,AI 得先搞清楚这一轮该查哪几类记忆。DoorDash 把这个过程拆成四个阶段:
拿“我想做鸡肉提卡马萨拉”这句话走一遍:第一步意图解析先认出这是一个菜谱请求,该查的是品牌偏好和份量偏好,不是查附近餐厅;第二步查询规划把它拆成“精确关键词查品牌偏好”加“语义查询份量历史”,只在杂货相关的记忆区块里找;第三步检索排序并行查完,把最近确认过的“常买两人份”排到最前面;第四步打包成几行结构化事实塞进提示词,比如“两人份、常买Oatly燕麦奶、不吃肉”,智能体照着这几行字去挑食材,而不是把上百条历史记忆全部堆给它。查询规划这一步还会按三个维度参数化:用语义相似度搜、还是用关键词精确匹配、还是直接按结构化字段取;查哪个记忆分区;以及限定条数、相似度门槛、时间窗口这些边界。
为了让关键词检索好用,系统还会在每次对话开始时,把这个用户当前记忆里实际存在的词汇列一份目录(Memory Bank Index)塞进提示词,智能体照着这份目录去搜,搜目录里没有的词只会白费token。对于订单历史这类特别庞大的记忆区块,智能体会先做一次轻量的“扫一眼”,拿到条数、可用性这些概要信息,再决定值不值得把完整内容读进来,避免一上来就把整块历史塞进上下文。
记忆撞上货架现实,谁让步
记忆和当下的真实情况是两回事。一个“一直买Oatly”的用户,如果最近的门店没货,智能体查库存时会发现这一点,转而找替代品;一个说好“60美元预算”的清单,如果凑齐这周要买的东西最低也要72美元,AI 会据实告诉用户,而不是硬凑一个假的60美元。这个校对不是单独一层做的,是同一轮对话里,智能体先取出存好的偏好,再拿它去对照搜索和购物车工具返回的实时价格、库存、营业时间,记忆和现实冲突时,按现实调整方案。


记忆怎么沉淀、又怎么被精准遗忘
一句话怎么变成一条能用的记忆
“我们家吃素,这周还是买两人份哈。”
内容家庭吃素,常买两人份
时效长期,除非用户改口
但如果一句话只是“这个是给朋友带的,今晚要用”,这种一次性说法会被跳过,不会写进长期记忆。判断标准还会按业务场景变:在餐厅场景里,用户说“我不想吃拉面”默认是一时的心情,除非用了“always”“never”这类明确的耐用性字眼,不然记下来反而会让智能体以后一直不推面食;换到杂货场景,用户随口一句“我喜欢Oatly”,恰恰就是要长期记住的品牌信号。价格敏感度这类偏好,只有用户主动发起才算数,比如自己问“Safeway有什么便宜的”才会被记下来,如果只是被动接受了AI推荐的便宜店,那不算是对这个人的持久判断。
“忘记”比“记住”更难
如果用户说“忘记我喜欢Nova家的烤芝士”,简单粗暴地按相似度或者关键词匹配删除,很容易把跟“Nova”或者“芝士”有关、但其实用户还想留着的记忆一起删掉。
删除动作和保存不一样,保存是异步触发不占用时间,删除是同步执行的,智能体能在回复里当场告诉用户具体删了哪几条。记忆也没有统一的过期时间:食用油买了80天,大概率还在厨房里;牛奶买了12天,大概率已经喝完了;素食这类用户自己说出口的偏好,压根没有失效期,除非用户自己改口。一条记忆该活多久,取决于它本身是什么,不是套一个统一的衰减公式。
怎么知道 Agent 真的靠谱
智能体的对话没有唯一正确答案,人工抽查又扩不了量。DoorDash 建了一套自动化评测框架,把“这轮对话到底帮没帮到用户”变成一个能天天跑、能量化的问题。
把每条标准写成能二元判断的准则,比如“推荐的餐厅有没有满足用户说的送达时间、预算、忌口”。每条标准先判断适不适用这个场景,适用才打分,reorder专属的检查不会错误地扣到菜谱场景头上。
每场对话用OpenTelemetry打点,存进ClickHouse。原始记录信息量太大,Python脚本把它拆成每条评分标准专用的证据切片,裁判只看它需要看的那部分。
用AI扮演用户,按写好的场景脚本走完整段对话,配上一份提前录制好的工具返回数据(不查真实数据库),保证同一个场景每次跑起点都完全一样,分数才能公平对比。
用GEPA算法反复迭代打分提示词,直到跟人工标注的判断结果对得上,校准好了以后,一天能自动审2000多场对话。
评测时不真的去调用线上库存、订单这些接口,而是回放一份提前录好、固定不变的返回结果。这样同一个测试场景不管跑多少次,起始条件都完全一样,分数变化才能归因到智能体本身,而不是货架今天恰好有没有货这种随机因素。
一种自动改写打分提示词的算法:不断生成新版本的评分提示词,挑出跟人工标注结果最一致的那版留下来,反复校准,让AI裁判的判断尺度慢慢贴近真人评审。


评测系统在两个真实事故里怎么起作用
案例一: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模型往返,是一种不依赖模型本身变快、也能把端到端延迟压下来的思路,对任何“AI加实时库存或价格”类的应用都是可以直接搬过去用的做法。
生产数据说了什么
打造一个好用的AI智能体已经很难,知道它是不是真的好用,更难。Raghav Saboo,DoorDash 推荐与搜索团队负责人
买一周的菜:从自己一件件加购物车 → 一句话让 AI 两分钟建好
DoorDash 上线 AI 购物助手 Ask DoorDash;它又快又靠谱的秘诀不在模型多聪明,而在它记得你是谁、还天天给自己出 2000 场模拟考,这页带图讲完。
↓ 一页读完 · 有一张会动的图
DoorDash 是美国最大的外卖和跑腿平台(类似美团外卖)。它新上线一个叫 Ask DoorDash 的 AI 助手,目前只在美国部分地区的 iOS 手机上灰度开放(先给一小部分用户试用),能干两件事:搜餐厅、买菜。
✘ 却不知道最近哪家店开着、有没有牛油果、真实价格多少,也记不住你说过全家吃素
这些信息不在 AI 的"脑子"里,每分钟都在变,网上也几乎抓不到,光有一个聪明模型答不上来。
以前买一周的菜,得自己在 App 里一件件搜、一件件加。现在换成一句话。
自己在 App 里一件件搜、一件件加进购物车,凑够一周两人份,还得盯着别超 60 美元。
一句"给两人建一份 60 美元素食清单",AI 查着实时库存和价格,两分钟建好一整车,你再点点微调。
还有个省时间的巧思:你在购物车上换品牌、改数量、删掉家里已有的,这些改动直接改数据、根本不经过 AI,所以快。但"一句话建好车"看着简单,DoorDash 要做对两件难事,让 AI 记住你是谁,还要有办法确认它到底靠不靠谱。
先看第一件难事,怎么让 AI 在对的时刻,想起关于你的、对的那几条事。
小互随口一句,AI 不是从头猜,它先从你上百条记忆里只挑出相关的几条(吃素、常买 Oatly、两人份),其余用不上的不塞给它,再去查实时货架的库存和价格,才拼出这一车。同一套记忆还会精准遗忘:你说"忘掉某个偏好",它只删这一条,不误删相邻的记忆。
第二件难事:怎么知道 AI 靠不靠谱?以前只能靠员工零星反馈(一天约 1 条);现在让一个 AI 扮成上千个顾客跟它对话、再用一个 AI 裁判打分,一天自动"考"它 2000 多场。这套记忆加评测,换来的效果,
加不完啊
话听得懂,
可它看不见:
- × 哪家店还开着
- × 有没有牛油果
- × 真实价钱多少
- × 你说过全家吃素
快约 5 倍
只挑相关这 3 条
AI 裁判打分
DoorDash 自己测的,
7 天窗口,
没有第三方复现。
不是模型更聪明
