LLM-Powered Voice Assistant for Restaurant Operations and Personalized Alcohol Recommendations

doordash · E-commerce · 2025 · source Agentic: yes · promotional bias: med · source-backed · extracted with prompt 0.5.6 (schema v2)

Generated from extraction.json — do not edit by hand. Every claim cites verbatim source evidence; stated means the quote directly asserts the claim, implied means it supports it indirectly.

Problem

Domain: Restaurant operations and personalized commerce discovery

DoorDash needed more flexible merchant-hours verification than DTMF robocalls allowed, and more personalized alcohol item discovery than ranked store lists and category tiles provided.

Constraints:

Architecture

DoorDash built a voice AI path behind the existing robocall interface. A RobocallCreatorFactory selects legacy DTMF or AI voice providers by store configuration and feature flags; Alex, the voice agent, collects natural-language hours; Vapi sends structured responses to a webhook; the webhook validates data, creates special hours through MenuDataService/SpecialHoursRepository, and publishes the same VoiceCallStatusUpdateEvent as the legacy flow. Separately, an alcohol recommendation pipeline uses user history and semantic search to write item recommendations to a database, then renders them through CSF, Discovery SDK, and VLP while a two-stage LLM pipeline generates and judges carousel titles.

Diagram confidence: explicit (topology described by the source).

flowchart LR
  Scheduler["Scheduler"] --> Factory["RobocallCreatorFactory"]
  Factory --> Legacy["Legacy DTMF provider"]
  Factory --> Client["Voice AI provider client"]
  Client --> Alex["Voice agent Alex"]
  Alex --> Webhook["Webhook handler"]
  Webhook --> Hours["SpecialHoursRepository"]
  Webhook --> Event["VoiceCallStatusUpdateEvent"]
  Recs["Recommendation generator"] --> DB["Recommendation database"]
  DB --> CSF["Carousel Serving Framework"]
  CSF --> SDK["Discovery SDK"]
  SDK --> VLP["VLP Layout Framework"]
  Recs --> TitleGen["Title generation LLM"]
  TitleGen --> TitleJudge["Title judge LLM"]
Drag to pan · scroll or use +/− to zoom · reconstructed from the source's described component topology

Components

Component Role Interacts with
Scheduler Initiates robocall creation through a stable interface while remaining decoupled from provider choice. RobocallCreatorFactory
RobocallCreatorFactory Chooses legacy DTMF or AI voice implementation by store configuration and feature flags. Scheduler, Legacy DTMF provider, Voice AI provider client
Voice AI provider client Abstracts providers such as Vapi and future Twilio or Amazon Connect implementations. RobocallCreatorFactory, Voice agent Alex
Voice agent Alex Conducts a guided natural-language conversation and returns digits plus normalized hours fields. Voice AI provider client, Webhook handler
Webhook handler Validates structured voice data, creates special hours when preconditions are met, and publishes status events. Voice agent Alex, SpecialHoursRepository, VoiceCallStatusUpdateEvent
SpecialHoursRepository Creates special-hours updates for stores when the voice response is complete enough. Webhook handler
VoiceCallStatusUpdateEvent Existing Kafka event contract reused so downstream alerting, dashboards, and consumers do not change. Webhook handler
Recommendation generator Uses order history, search terms, and semantic search to produce orderable alcohol item recommendations. Recommendation database, Title generation LLM
Recommendation database Stores item-level alcohol recommendations for carousel serving. Recommendation generator, Carousel Serving Framework
Carousel Serving Framework Defines carousel type and fetches recommendation content for display. Recommendation database, Discovery SDK
Discovery SDK Assembles carousels and other products into the final feed with separable latency budgets. Carousel Serving Framework, VLP Layout Framework
VLP Layout Framework Maps alcohol recommendation placements to the right UI carousel configuration. Discovery SDK
Title generation LLM Generates candidate carousel titles after summarizing beverage categories. Recommendation generator, Title judge LLM
Title judge LLM Filters and re-ranks candidate titles for naturalness, specificity, and accuracy. Title generation LLM

Data flow

For store hours, the scheduler asks the factory for a provider, the AI voice agent talks to the merchant, structured response data goes to a webhook, valid special-hours data triggers a MenuDataService update, and Kafka status events notify downstream systems. For alcohol recommendations, user history and search terms feed semantic search over orderable catalog products, recommendations are written to a database, CSF fetches them into the VLP, and LLM candidate generation plus a title judge produce carousel titles.

"Scheduler picks the provider via factory

  1. Voice agent "Alex" talks to the merchant
  2. VAPI sends structured response to webhook
  3. Webhook interprets and triggers special hours update in MenuDataService"
4 supporting quotes
“5. Kafka events notify systems downstream and keep stores open or closed”article, stated
“Our current LLM-powered recommendation pipeline generates item-level alcohol recommendations by taking in a user’s order history and search terms, using semantic search to surface real, orderable products”article, stated
“Using CSF, we created a carousel type and a content fetcher that retrieves recommendation data from the database.”article, stated
“Because the first suggested title was not always the most natural or accurate, we added a second step where the LLM evaluates its own candidates.”article, stated

Why this architecture

DoorDash used abstractions and existing framework contracts to add LLM capabilities without broad rewrites. Factory selection and feature flags let the voice system roll forward or back safely, while the old digits/status contract keeps downstream systems unchanged. For recommendations, CSF, Discovery SDK, and VLP separate recommendation content from presentation; the two-stage title pipeline fixes a specific observed title-quality failure mode.

5 supporting quotes
“The goal of this refactor was to decouple the scheduler from any one vendor to make a runtime decision about which voice stack to use.”article, stated
“This keeps backward compatibility intact while giving us a safe path to A/B test and gradually roll out new conversational experiences.”article, stated
“Because we preserved the old contract — status updates and digits semantics — the rest of the system remains blissfully unaware”article, stated
“This separation allows each feature to maintain its own latency budget.”article, stated
“This step prevents the model from generating misleading titles such as “Unwinding with Wine” when the carousel includes drinks other than wine.”article, stated

Models used: LLMs · Vapi voice AI agent

Scale

Alternatives considered (roads not taken)

Keep same-day DTMF robocalls as the only merchant-hours workflow

Rejected because: DTMF calls could not capture detailed schedules or advanced special-hours information.

“our robocalls can only be sent on the day in question—for example, the morning of a holiday—because they can’t capture detailed information or specific hours in advance.”article, stated
“The system relies solely on a simple yes/no response, which prevents us from gathering precise schedules ahead of time.”article, stated

Bind the scheduler directly to one AI voice vendor

Rejected because: DoorDash wanted provider flexibility and future support for Vapi, Twilio, or Amazon Connect without changing business logic.

“The same pattern is extended via VoiceAIAgentClientFactory so we can swap specific AI providers — for example, using Vapi today with the ability to switch to Twilio or Amazon Connect later”article, stated

Create new downstream voice-call contracts

Rejected because: Reusing existing events and digits semantics kept alerting, dashboards, and consumers unchanged.

“Instead of inventing new topics or APIs, the voice path publishes the same **VoiceCallStatusUpdateEvent**downstream.”article, stated
“That means alerting, dashboards, and consumer services didn’t need to change.”article, stated

Use the first LLM-generated carousel title

Rejected because: The first title was not always natural or accurate, so a second LLM evaluates, filters, and re-ranks candidates.

“Because the first suggested title was not always the most natural or accurate, we added a second step where the LLM evaluates its own candidates.”article, stated

Patterns

tool-use-orchestration (orchestration)

The voice assistant coordinates provider calls, webhook processing, special-hours mutations, and Kafka status events around a natural-language conversation.

“Webhooks are the bridge between conversation and action. Their job is to take the assistant’s structured output, validate it, and trigger the correct business side-effects”article, stated
  1. Kafka events notify systems downstream"

— article, stated

structured-output-contract (integration)

The voice prompt always returns legacy-compatible digits plus normalized timestamps, and the webhook only reads the structured fields it needs.

“the assistant always returns a digits field compatible with the old interactive voice response flow (1/2/3), plus normalized opening/closing timestamps when applicable.”article, stated
“The data model for the message sent by the voice AI provider contains a myriad of other fields within the Analysis object, but for our purposes, we only need the structured data defined previously.”article, stated

fallback-degradation (reliability)

Factory selection and feature flags provide deterministic fallback from AI voice calls to legacy robocalls.

“The factory pattern is the enforcement point for policy and safety: It centralizes provider selection, lets us gate by geography/merchant tier/feature flag, and ensures we always have a deterministic fallback”article, stated

canary-rollout (release)

DoorDash can send a small percentage of stores through the AI path and roll back by changing feature flags.

“on Monday, we can run 1% of stores on the AI path, but on Tuesday, we can roll back to 0% if something looks off”article, stated

prompt-chaining (prompting)

The carousel title workflow first generates candidates after category reasoning, then uses another LLM step to filter and re-rank them.

"For this, we developed a two-stage pipeline:

  1. **Candidate Generation:**The LLM proposes 3–5 short (3–5 word) titles"
“**Title Judge and Re-Rank:**Because the first suggested title was not always the most natural or accurate, we added a second step where the LLM evaluates its own candidates.”article, stated

llm-as-judge (evaluation)

A second LLM judges title candidates, removes generic or editorial titles, and re-ranks the rest.

“It filters out overly editorial or generic titles and re-ranks the rest. This reliably produced stronger, more contextually accurate titles.”article, stated

observability-tracing (operations)

Both systems rely on instrumentation or framework metrics to debug latency, fallback, and job-level failures.

“We added instrumentation to monitor cache hit rates, fallbacks, and end-to-end latency.”article, stated
“The built-in observability from Discovery SDK and CSF (such as job-level metrics and error logs) also simplifies debugging and iteration.”article, stated

Tradeoffs

Route through an abstraction layer

Chose RobocallCreator and provider factories selected by flags over direct coupling to one voice provider or rewriting downstream systems.

Rationale: The abstraction reduces vendor lock-in, blast radius, and rollout risk while preserving backward compatibility.

“By introducing an abstraction — the RobocallCreator interface — and a factory that selects an implementation per store via feature flags”article, stated
“This isolates risk — for instance, we can roll forward or back by flipping a flag — while reducing blast radius”article, stated

Preserve the legacy digits field

Chose dual output with digits plus normalized timestamps over a new voice-only schema that would force downstream changes.

Rationale: The old field keeps legacy semantics intact while new timestamps enable richer special-hours automation.

“the assistant always returns a digits field compatible with the old interactive voice response flow (1/2/3), plus normalized opening/closing timestamps when applicable.”article, stated

Use a two-stage LLM title pipeline

Chose candidate generation followed by LLM judging and re-ranking over taking the first generated title.

Rationale: The second stage improves naturalness and contextual accuracy of carousel titles.

“Because the first suggested title was not always the most natural or accurate, we added a second step where the LLM evaluates its own candidates.”article, stated
“This reliably produced stronger, more contextually accurate titles.”article, stated

Use existing carousel and discovery frameworks

Chose CSF, Discovery SDK, and VLP Layout Framework over building a bespoke carousel serving stack.

Rationale: Framework reuse lets engineers focus on recommendation content while preserving latency budgets and observability.

“To build the new carousel, we used DoorDash’s Carousel Serving Framework (CSF), Discovery SDK, and Vertical Landing Page (VLP) Layout Framework.”article, stated
“Combining these frameworks with server-driven UI, engineers can quickly create new carousel types, focusing on content rather than presentation.”article, stated

Gotchas (what bit them)

Legacy AI integration can break downstream assumptions if old contracts are not preserved.

Root cause: Downstream systems expected status events and digits semantics from DTMF robocalls.

Resolution: Return compatible digits, publish the same VoiceCallStatusUpdateEvent, and keep consumers unaware of whether the call was DTMF or natural language.

“This preserves backward compatibility and keeps downstream services simple.”article, stated
“Because we preserved the old contract — status updates and digits semantics — the rest of the system remains blissfully unaware”article, stated

Open-ended conversations are unsafe unless converted into validated structured data.

Root cause: A merchant can phrase hours in many ways, but downstream systems need deterministic fields for business mutations.

Resolution: Guide the conversation, confirm back the interpreted schedule, normalize time formats, and validate preconditions in the webhook.

“the next challenge is to convert an open-ended conversation into reliable, machine-actionable data.”article, stated
“To reduce errors, the prompt enforces a confirm-and-repeat step (‘So you’re open from 9 AM to 5 PM today, correct?’).”article, stated

Incomplete voice data can corrupt store-hour source-of-truth systems.

Root cause: Webhook payloads may lack sufficient opening/closing times or valid digits.

Resolution: Make the webhook idempotent, schema-driven, strict about preconditions, and avoid partial writes while publishing observable status events.

“We designed the webhook to be idempotent, schema-driven, and strict about preconditions”article, stated
“If the data isn’t sufficient, we avoid partial writes but still publish a status event for observability.”article, stated

LLM-generated titles can be misleading when they overfocus on one item category.

Root cause: A title like 'Unwinding with Wine' can be inaccurate if the carousel includes non-wine products.

Resolution: Have the model first summarize beverage categories, then judge and re-rank candidate titles.

“This step prevents the model from generating misleading titles such as “Unwinding with Wine” when the carousel includes drinks other than wine.”article, stated
“It filters out overly editorial or generic titles and re-ranks the rest.”article, stated

Evaluation

The voice assistant is controlled through feature flags and observability for rollouts, fallbacks, and latency. The recommendation system used launch/employee testing plus LLM self-judging for title quality; the source does not provide quantitative customer-facing A/B metrics for these LLM systems.

Metrics: feature-flag rollout percentage · rollback percentage · cache hit rates · fallbacks · end-to-end latency · job-level metrics · error logs · employee testing feedback

4 supporting quotes
“The factory pattern is the enforcement point for policy and safety: It centralizes provider selection, lets us gate by geography/merchant tier/feature flag”article, stated
“We added instrumentation to monitor cache hit rates, fallbacks, and end-to-end latency.”article, stated
“The built-in observability from Discovery SDK and CSF (such as job-level metrics and error logs) also simplifies debugging and iteration.”article, stated
“The launch of our alcohol recommendation email and early employee testing for the alcohol recommendations carousel demonstrate how LLMs can drive meaningful personalization”article, stated

Outcomes

The source emphasizes controlled rollout rather than broad production metrics for the LLM systems; the voice path supports 1% to 0% feature-flag rollbacks, and the recommendation path integrates with DoorDash's New Verticals serving frameworks.

4 supporting quotes
“The result is a system that can seamlessly switch between legacy system robocalls and AI-powered conversations based on merchant preferences and feature flags”article, stated
“automatically processing real merchant responses to update store hours.”article, stated
“The launch of our alcohol recommendation email and early employee testing for the alcohol recommendations carousel demonstrate how LLMs can drive meaningful personalization”article, stated
“More broadly, this work highlights how LLMs enable high-quality personalization in domains that were historically underserved due to sparse data.”article, stated