LLM-Powered Customer Support Agent Handling 50% of Inbound Requests

otter · Tech · 2024 · 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 customer support automation

Otter needed an LLM-native support agent that could resolve high-volume restaurant support issues by diagnosing user intent, using internal systems safely, offering human escalation, and avoiding rigid decision-tree chatbot limits.

Constraints:

Architecture

Otter built an in-house agentic support bot around function calling and plain-text runbooks. A GetRunbook function semantically matches the user's issue against a vector database of runbooks, an LLM chooses the right runbook or returns Not Found, and the bot follows runbook steps by asking follow-ups, invoking API/widget functions with the user's token, researching help articles for unmatched questions, requiring confirmation for critical writes, or escalating to a human agent through Zendesk.

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

flowchart LR
  Chat_interface["Customer chat interface"] --> Assistant_service["Otter Assistant service"]
  Assistant_service --> GetRunbook["GetRunbook function"]
  GetRunbook --> Runbook_vector_db["Runbook repository vector database"]
  GetRunbook --> Selection_LLM["Runbook selection LLM"]
  Assistant_service --> API_widgets["API and widget functions"]
  API_widgets --> Existing_APIs["Existing Otter APIs"]
  Existing_APIs --> Permission_model["Permission model"]
  API_widgets --> Confirmation_widget["Confirmation widget"]
  Assistant_service --> Research_function["Research function"]
  Research_function --> Knowledge_base["Support knowledge base"]
  Assistant_service --> Escalation["Human escalation path"]
  Evaluation["Evaluation framework"] --> Assistant_service
  Escalation --> Chat_interface
Drag to pan · scroll or use +/− to zoom · reconstructed from the source's described component topology

Components

Component Role Interacts with
Customer chat interface Front-end conversation surface initially built on Zendesk Sunco Web SDK and later replaced with a custom front end. Otter Assistant service, Human escalation path
Otter Assistant service LLM-native support backend that orchestrates runbook retrieval, function calls, research, confirmations, and escalation. Customer chat interface, GetRunbook function, API and widget functions, Research function, Human escalation path
GetRunbook function Matches user issue descriptions to support runbooks using embeddings and an LLM reranking/selection call. Otter Assistant service, Runbook repository vector database, Runbook selection LLM
Runbook repository vector database Stores plain-text support runbooks for semantic retrieval. GetRunbook function
Runbook selection LLM Chooses the correct runbook from semantic candidates or returns Not Found. GetRunbook function
API and widget functions Wrapper functions that fetch information, update accounts, or surface solution widgets through existing Otter APIs. Otter Assistant service, Existing Otter APIs, Confirmation widget
Existing Otter APIs Internal APIs for menus, accounts, printers, orders, and store operations, called with user-token permissions. API and widget functions, Permission model
Permission model Existing access-control infrastructure reused by passing the user token with each service request. Existing Otter APIs
Confirmation widget User-review layer for critical write operations before execution. API and widget functions
Research function Searches and summarizes help articles when a user question does not match a runbook. Otter Assistant service, Support knowledge base
Support knowledge base Help articles used by the research function for unmatched questions. Research function
Human escalation path Hands control to a live support agent through Zendesk when the user requests escalation or the bot detects escalation intent. Otter Assistant service, Customer chat interface
Evaluation framework Unit-test-like chatbot evaluation harness with input cases and expected outputs. Otter Assistant service

Data flow

A restaurant user describes an issue. GetRunbook embeds and retrieves relevant runbooks, a separate LLM chooses the correct runbook or Not Found, and the bot executes the runbook by gathering information, calling APIs/widgets, researching help articles, or escalating to a human. Critical writes require explicit confirmation before the backend API executes under the user's permissions.

3 supporting quotes
“Mechanically, GetRunbook function takes the user issue description as an input and outputs a corresponding runbook if it can find one. Otherwise it returns “Not Found”.”article, stated
“If there’s a match, the LLM then begins to work through the listed runbook steps, gathering follow-up information from the user and/or executing API calls as needed”article, stated
“For any critical write operation (e.g. Pause store, update price) we require user review and explicit click confirmation before kicking off the operation.”article, stated

Why this architecture

Otter built in-house because support resolution needed deep, permissioned integrations and flexible LLM-native reasoning, while vendor tools were tied to decision trees or lacked the ability to manage complex resolution steps. Function calling let the agent mimic human support tasks while confirmation and escalation guarded risky actions.

3 supporting quotes
“resolving these tickets required deep integration with our systems. For example, a support agent has tightly controlled permission to review a customer’s menu”article, stated
“there were no vendors that offered our needed level of integration flexibility without hard coded decision trees”article, stated
“by setting out to emulate the diagnostic and resolution steps taken by our agents, we naturally followed agentic approach.”article, stated

Models used: LLM for intent matching · LLM for runbook selection · LLM support agent · embedding model · RAG on support knowledge base

Scale

Alternatives considered (roads not taken)

Established vendor chatbot products

Rejected because: They relied primarily on hard-coded decision trees and did not provide Otter's needed integration flexibility.

“Established vendors' products primarily featured hard-coded decision trees and were still working to determine their LLM product strategy.”article, stated

LLM-native startup support bots

Rejected because: Otter did not believe available startups could manage the complexity of the top resolution steps.

“we spoke with several startups building LLM-native chatbots for support, but didn’t encounter one we believed would be able to manage the complexity of resolution steps required”article, stated

Hard-coded decision trees for bot logic

Rejected because: Otter wanted LLM-native, plain-text, modular runbooks that were easier to implement and traverse at runtime.

“the runbooks function like a decision tree, but unlike the previous generation of bot tech, can be written in plain text”article, stated

Allowing the LLM to execute critical writes directly

Rejected because: Hallucination risk required explicit user review and click confirmation before operations like pausing stores or updating prices.

“We strictly follow this approach to mitigate risk from LLM hallucination (e.g. incorrectly assume that the user wants to pause a store).”article, stated

Patterns

tool-use-orchestration (agent architecture)

Otter Assistant uses function calling across GetRunbook, API/widget functions, research, and human escalation to mimic human support workflows.

“we designed four main types of functions: GetRunbook, API & Widget Functions, Research, and EscalateToHuman”article, stated
“we designed the bot to use function calling and mimic how human support agents work”article, stated

rag-retrieval (retrieval)

The runbook and research functions retrieve relevant support instructions and help articles from vector/search-backed stores before the LLM acts.

“Based on the embedding of user issue description, retrieve relevant runbooks from our runbook repository (vector db) based on semantic similarity”article, stated
“The research function is designed to retrieve and summarize helpful answers to user questions that don’t match a runbook.”article, stated

human-in-the-loop-gate (safety)

Critical writes require explicit user confirmation, and users can escalate to live agents when needed.

“For any critical write operation (e.g. Pause store, update price) we require user review and explicit click confirmation before kicking off the operation.”article, stated
“When the LLM detects a user’s intent to escalate, we can inform the chat message interface to pass conversation control to the assigned human agent”article, stated

safety-policy-enforcement (governance)

Internal API calls reuse existing access-control models by passing the user's token through the service request.

“we call backend APIs with the user token passed over as part of each Otter Assistant service request. This way, we maintain and reuse existing permission control models”article, stated

eval-driven-development (evaluation)

Otter built a chatbot test/evaluation framework modeled on unit tests with inputs and expected outputs.

“we developed a new test and evaluation framework for Otter Assistant and any other chatbot”article, stated
“we can evaluate chatbots through a mechanism that is similar to traditional unit tests, where we define a set of inputs and assert on expected output for each.”article, stated

Tradeoffs

Build the support agent in-house

Chose custom Otter Assistant backend over third-party chatbot vendors.

Rationale: Otter needed flexible, permissioned integrations and complex resolution-step handling that vendors did not offer.

“resolving these tickets required deep integration with our systems.”article, stated
“there were no vendors that offered our needed level of integration flexibility without hard coded decision trees”article, stated

Represent automation logic as plain-text runbooks

Chose LLM-selected modular runbooks over hard-coded decision tree bot logic.

Rationale: Plain-text runbooks were easier to implement, maintain, and traverse dynamically during diagnosis.

“unlike the previous generation of bot tech, can be written in plain text, making them 1) significantly easier to implement and maintain 2) more modular and traversable”article, stated

Use confirmation widgets for writes

Chose user review and explicit click confirmation over fully autonomous write execution by the LLM.

Rationale: Confirmation mitigates hallucination and lets users modify inputs when the LLM gets details wrong.

“This approach also provides users a quick way to modify inputs for the write operation if the LLM got details wrong.”article, stated

Reuse existing APIs and authorization

Chose API wrapper calls with user tokens over new side-channel automation bypassing existing controls.

Rationale: Reusing internal APIs preserved permission boundaries while giving the agent real operational capability.

“Fortunately, we were able to largely reuse pre-existing API calls within the Otter ecosystem.”article, stated
“we call backend APIs with the user token passed over as part of each Otter Assistant service request”article, stated

Gotchas (what bit them)

Vendor support bots could not provide both flexibility and integration depth.

Root cause: Existing products were either hard-coded decision trees or unlikely to handle the complex resolution steps required by top support issues.

Resolution: Build an in-house LLM-native backend while using Zendesk front-end pieces for MVP time-to-market.

“Established vendors' products primarily featured hard-coded decision trees and were still working to determine their LLM product strategy.”article, stated
“We thus decided to build our own in-house Bot back end while leveraging Zendesk’s Sunco Web SDK front end”article, stated

Internal write operations created hallucination and authorization risk.

Root cause: The bot could modify real store/account state, so incorrect assumptions could have customer-visible consequences.

Resolution: Reuse existing permission models and require explicit user click confirmation for critical write operations.

“This way, we maintain and reuse existing permission control models and auth infrastructure.”article, stated
“We strictly follow this approach to mitigate risk from LLM hallucination (e.g. incorrectly assume that the user wants to pause a store).”article, stated

Runbook matching can fail when no known issue pattern fits the user's request.

Root cause: Support questions may fall outside the top high-volume runbooks selected for automation.

Resolution: Return Not Found from GetRunbook and route to the research function or human escalation path.

“Mechanically, GetRunbook function takes the user issue description as an input and outputs a corresponding runbook if it can find one. Otherwise it returns “Not Found”.”article, stated

Automation needed to preserve user trust in human support availability.

Root cause: Restaurant customers valued speed but still wanted access to 24/7 human agents.

Resolution: Keep seamless escalation to live agents as a first-class tool.

“customers appreciate the speed and reliability that Otter Assistant can deliver over traditional call center agents, as long as we continue to offer the option to contact a 24/7 human agent”article, stated

Evaluation

Otter built a chatbot evaluation framework that behaves like unit tests: define inputs, assert expected outputs, and use it for Otter Assistant and other chatbots.

Metrics: autonomous resolution share · customer satisfaction · unit-test-like expected-output assertions

“After close to one year of development, Otter Assistant solves ~half of support requests autonomously without compromising customer satisfaction.”article, stated
“we can evaluate chatbots through a mechanism that is similar to traditional unit tests, where we define a set of inputs and assert on expected output for each.”article, stated

Outcomes

The agent was built and scaled over about one year, starting with Q1 2024 issue/vendor analysis and Q2 2024 implementation.

“After close to one year of development, Otter Assistant solves ~half of support requests autonomously without compromising customer satisfaction.”article, stated
“Handling customer support requests is just a starting point!”article, stated