Gen AI On-Call Copilot for Engineering Support

uber · Tech · 2023 · source Agentic: no · promotional bias: low · 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: engineering on-call support

Uber needed to reduce repeated Slack support questions and long waits for on-call engineers by giving internal users a Genie copilot that could answer platform-engineering questions from existing internal documentation while respecting data-source access and limiting hallucinations.

Constraints:

Architecture

Genie is a Slack-facing RAG copilot backed by an offline Spark ingestion pipeline and an online Knowledge Service. Spark jobs scrape approved internal knowledge sources, chunk content with LangChain, generate OpenAI embeddings through PySpark UDFs, and push vector artifacts through Sia and Terrablob. At serving time, Slack questions are embedded, Knowledge Service retrieves relevant chunks from the vector database, the retrieved sub-contexts and source URLs are passed to an LLM through Michelangelo Gateway, and user feedback plus context metadata flow through Kafka and Hive into dashboards and custom LLM-as-judge evaluation reports.

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

flowchart LR
  internal-knowledge-sources["Internal knowledge sources"] --> spark-ingestion-pipeline["Spark ingestion pipeline"]
  spark-ingestion-pipeline --> embedding-generation["Embedding generation"]
  embedding-generation --> sia-vector-database["Sia vector database"]
  embedding-generation --> terrablob["Terrablob"]
  terrablob --> sia-vector-database
  slack-client["Slack client"] --> knowledge-service["Knowledge Service"]
  knowledge-service --> sia-vector-database
  knowledge-service --> michelangelo-gateway["Michelangelo Gateway"]
  michelangelo-gateway --> llm["LLM"]
  slack-client --> feedback-pipeline["Feedback pipeline"]
  feedback-pipeline --> evaluator["Evaluator"]
  evaluator --> llm
  internal-knowledge-sources --> document-evaluation-app["Document evaluation app"]
  knowledge-service --> cost-tracking["Cost tracking"]
Drag to pan · scroll or use +/− to zoom · reconstructed from the source's described component topology

Components

Component Role Interacts with
Slack client User-facing channel where engineers ask questions, receive Genie answers, provide feedback, and choose follow-up or human-support actions. Knowledge Service, Feedback pipeline
Knowledge Service Backend service that embeds incoming questions, retrieves relevant chunks, calls the LLM path, and serves responses. Vector database, Michelangelo Gateway, Cost tracking
Spark ingestion pipeline Offline ETL pipeline that fetches internal sources, prepares dataframes, chunks content, generates embeddings, and pushes artifacts for serving. Internal knowledge sources, Embedding generation, Sia vector database
Internal knowledge sources Approved sources such as Engwiki, internal Stack Overflow, and engineering requirement documents. Spark ingestion pipeline
Embedding generation LangChain chunking and OpenAI embedding generation through PySpark UDFs. Spark ingestion pipeline, Terrablob, Sia vector database
Sia vector database Uber's in-house vector database used to index and retrieve relevant chunks. Terrablob, Knowledge Service
Terrablob Blob storage for embedding artifacts, base indexes, and snapshots consumed by vector-search leaves. Sia vector database
Michelangelo Gateway Pass-through gateway to the LLM that receives context headers for audit and cost attribution. Knowledge Service, LLM
LLM Generates answers from retrieved sub-contexts and source URLs, and also serves as judge in evaluation workflows. Michelangelo Gateway, Evaluator
Feedback pipeline Slack plugin, Kafka topic, Hive table, and dashboard path for user feedback and operational metrics. Slack client, Evaluation dashboard, Evaluator
Evaluator Evaluation pipeline that retrieves Genie context and responses, joins metadata, runs LLM-as-judge prompts, and publishes evaluation reports. Hive metrics, LLM, Michelangelo UI
Document evaluation app LLM-as-judge workflow that scores knowledge-base documents and suggests improvements to document quality. Internal knowledge sources, Michelangelo UI
Cost tracking UUID propagation and audit-log path used to attribute LLM costs by request or user context. Knowledge Service, Michelangelo Gateway

Data flow

Approved internal documentation is scraped into Spark dataframes, chunked, embedded with an OpenAI embedding model, and pushed to Sia/Terrablob for retrieval. When a user asks a question in Slack, Knowledge Service embeds the query, retrieves relevant chunks from the vector database, sends those chunks as cited sub-contexts to the LLM through Michelangelo Gateway, returns the answer with Slack action buttons, and streams feedback plus metadata through Kafka into Hive dashboards and evaluation pipelines.

3 supporting quotes
“At a high level, we scrape internal data sources like Uber’s internal wiki, Uber’s internal Stack Overflow, engineering requirement documents, and create vectors from these data sources using an Open AI embedding model.”article, stated
“when a user posts a question in a Slack channel, the question gets translated to embeddings. The service searches for relevant embeddings related to the question in a vector database.”article, stated
“When the user leaves their feedback, a Slack plugin picks it up and uses a specific Kafka topic to stream metrics into a Hive table with the feedback and all the relevant metadata.”article, stated

Why this architecture

Uber chose RAG over fine-tuning because it could launch without curated training examples and could keep answers tied to current internal documentation. The surrounding Spark, vector database, feedback, evaluation, and source-citation machinery addresses the production risks of hallucination, stale documents, access control, cost attribution, and continuous tuning.

3 supporting quotes
“Fine-tuning requires curated data with high-quality, diverse examples for the LLM to learn from. It also requires compute resources to keep the model updated with new examples.”article, stated
“In contrast, RAG doesn’t require any diverse examples to begin with. This reduced the time to market for the copilot launch, so we chose this approach for our copilot.”article, stated
“We explicitly added for all the results obtained from the vector database a section called sub-context along with the source URL for that sub-context.”article, stated

Models used: Genie · RAG · OpenAI embedding model · LLM · LLM as a Judge · Apache Spark · PySpark UDFs · LangChain · Sia · Terrablob · Knowledge Service · Michelangelo Gateway · Kafka · Hive · Slack

Scale

Alternatives considered (roads not taken)

Fine-tune an LLM for on-call support

Rejected because: Fine-tuning needed curated high-quality diverse examples and ongoing compute to keep the model updated, while RAG could launch faster from existing documents.

“Fine-tuning requires curated data with high-quality, diverse examples for the LLM to learn from. It also requires compute resources to keep the model updated with new examples.”article, stated
“RAG doesn’t require any diverse examples to begin with. This reduced the time to market for the copilot launch”article, stated

Expose broad internal data sources directly to Slack and OpenAI

Rejected because: Uber limited ingestion to curated sources that were widely available to most engineers to avoid leaking sensitive data through embeddings or Slack answers.

“For data security, we chose the data sources to ingest carefully, as many data sources can’t be exposed in Slack channels.”article, stated
“we pre-curated data sources which are widely available to most Uber engineers and only allowed using those data sources for generating embeddings.”article, stated

Return answers without source-aware sub-contexts

Rejected because: Uber changed prompt construction to provide sub-contexts and source URLs so the LLM would answer from supplied evidence and cite source URLs.

“We asked the LLM to only give answers from the various sub-contexts provided and return the source url to cite the answer.”article, stated
“This seeks to provide a source URL for every answer it returns.”article, stated

Rely only on user answer feedback

Rejected because: Uber added custom evaluations, LLM-as-judge reports, and document-quality evaluation to tune retrieval, generation, and the knowledge base itself.

“They can evaluate hallucinations, answer relevancy, or any other metric that they deem important for their use case.”article, stated
“the ability to evaluate documents and make actionable suggestions to improve document quality is essential for an efficient and effective RAG system.”article, stated

Force every unresolved question through another manual wait cycle

Rejected because: The interaction mode gives users next-step buttons for follow-up, resolution, or human escalation, reducing back-and-forth latency while preserving escalation when Genie cannot help.

“After several rounds of back-and-forth communication, the user’s question eventually gets resolved.”article, stated
“Using those buttons, users can easily ask followup questions, mark questions as resolved, or contact human support.”article, stated

Patterns

rag-retrieval (retrieval)

Genie uses a standard RAG path: internal documents are chunked and embedded, Slack questions are embedded at query time, relevant chunks are retrieved, and the retrieved context becomes the prompt for the LLM answer.

“Those embeddings get stored in a vector database. Then, when a user posts a question in a Slack channel, the question gets translated to embeddings.”article, stated
“The results indexed by embeddings get used as prompts to the LLM to get back a response.”article, stated

eval-driven-development (evaluation)

Uber built user feedback, custom hallucination/relevancy evaluations, LLM-as-judge reports, and document-quality evaluation into the Genie operating loop.

“This evaluation can be used for better tuning of all the relevant RAG components—retrieval and generation.”article, stated
“The LLM returns an evaluation score, together with explanations of the score and actionable suggestions on how to improve the quality of each document.”article, stated

llm-as-judge (evaluation)

Genie evaluation pipelines use LLM-as-judge prompts to score both responses and source-document quality, then publish the metrics and explanations to reports.

“Evaluator fetches specified prompt and runs LLM as a Judge. The specified metrics are extracted and included in the evaluation report”article, stated
“Then the evaluation is processed by calling LLM as the judge. Here, we feed LLM with a custom evaluation prompt.”article, stated

human-in-the-loop-gate (support workflow)

Genie leaves an explicit path back to on-call engineers when the copilot cannot answer, and the feedback options distinguish resolved, partially helpful, wrong, and not-relevant cases.

“If Genie can’t answer their questions, users can easily escalate the issue to on-call support.”article, stated
“Not Relevant: the user needs help from someone on call and Genie can’t assist (like for a code review)”article, stated

privacy-preserving-processing (data governance)

Uber limited embeddings to pre-curated broadly accessible data sources and scoped embeddings to Slack channels to avoid leaking sensitive knowledge sources.

“The embeddings created are only accessible through a particular Slack channel related to the Engwiki space.”article, stated
“we pre-curated data sources which are widely available to most Uber engineers and only allowed using those data sources for generating embeddings.”article, stated

observability-tracing (operations)

Genie propagates UUIDs through Knowledge Service and Michelangelo Gateway into audit logs for cost tracking, and streams Slack feedback metadata through Kafka and Hive into dashboards.

“a UUID gets passed to Knowledge Service, which in turn passes the UUID through the context header to Michelangelo Gateway.”article, stated
“it can be added to an audit log used to track costs by that UUID.”article, stated

Tradeoffs

Initial model strategy

Chose RAG over fine-tuning over fine-tuning an LLM on curated examples.

Rationale: RAG let Uber launch faster from existing internal documents instead of collecting diverse high-quality fine-tuning data and repeatedly retraining.

“For building an on-call copilot, we chose between fine-tuning an LLM model or leveraging Retrieval-Augmented Generation (RAG).”article, stated
“This reduced the time to market for the copilot launch, so we chose this approach for our copilot.”article, stated

Knowledge-source scope

Chose pre-curated broadly accessible sources over embedding every potentially useful internal source.

Rationale: Restricting sources reduced leakage risk at the cost of excluding some information that might have helped answer edge cases.

“For data security, we chose the data sources to ingest carefully, as many data sources can’t be exposed in Slack channels.”article, stated
“pre-curated data sources which are widely available to most Uber engineers”article, stated

Hallucination mitigation

Chose retrieved sub-contexts with source URLs in the prompt over letting the LLM answer from general model knowledge.

Rationale: The cited sub-context approach anchors answers to retrieved internal chunks and makes source provenance visible.

“We explicitly added for all the results obtained from the vector database a section called sub-context along with the source URL for that sub-context.”article, stated
“This seeks to provide a source URL for every answer it returns.”article, stated

Operational feedback path

Chose Slack-native feedback plus separate evaluation pipelines over manual inspection of support answers after the fact.

Rationale: Immediate feedback and custom evaluations create structured data for tuning retrieval, generation, and document quality.

“Users can provide feedback right away in Slack by clicking the relevant button in the Genie’s reply.”article, stated
“This evaluation can be used for better tuning of all the relevant RAG components—retrieval and generation.”article, stated

User interaction design

Chose action buttons for follow-up, resolution, and human support over a one-shot answer-only Slack bot.

Rationale: Buttons make it easier for users to continue the conversation, confirm resolution, or escalate when Genie is not the right responder.

“This mode allows users to ask follow-up questions more conveniently and encourages them to read Genie’s answers more attentively.”article, stated
“Using those buttons, users can easily ask followup questions, mark questions as resolved, or contact human support.”article, stated

Gotchas (what bit them)

RAG quality is capped by source-document quality.

Root cause: If internal documentation is unclear or inaccurate, the LLM cannot reliably produce high-quality answers no matter how strong the generation model is.

Resolution: Add document evaluation that scores source documents and returns actionable suggestions for improving the knowledge base.

“If the quality of the documentation is poor itself, no matter how good the LLM performs, there’s no way to have a good performance.”article, stated
“the ability to evaluate documents and make actionable suggestions to improve document quality is essential for an efficient and effective RAG system.”article, stated

Internal support knowledge is fragmented across multiple systems.

Root cause: Answers are spread across Engwiki, internal Stack Overflow, engineering requirement documents, and other locations, making direct search difficult.

Resolution: Scrape multiple approved sources into a common embedding and vector-search pipeline.

“the information is fragmented across Uber’s internal wiki called Engwiki, internal Stack Overflow, and other locations, making it challenging to find specific answers.”article, stated
“we scrape internal data sources like Uber’s internal wiki, Uber’s internal Stack Overflow, engineering requirement documents, and create vectors from these data sources”article, stated

Hallucination risk persists unless retrieval context is constrained and cited.

Root cause: An LLM can generate misleading information if prompts do not force it to answer from relevant authoritative chunks.

Resolution: Retrieve relevant knowledge, add sub-contexts and source URLs to prompts, and require answers to cite the source URL.

“Accuracy of responses: We ensure that the copilot retrieves relevant knowledge for the question, which prevents the LLM engine from generating incorrect or misleading information”article, stated
“We asked the LLM to only give answers from the various sub-contexts provided and return the source url to cite the answer.”article, stated

Sensitive data sources cannot automatically be embedded or exposed in Slack.

Root cause: Some internal sources are not safe to expose to broad Slack audiences or to the embedding/generation path.

Resolution: Pre-curate only widely accessible sources and scope embeddings to appropriate Slack channels.

“many data sources can’t be exposed in Slack channels.”article, stated
“only allowed using those data sources for generating embeddings.”article, stated

Answer feedback alone is not enough to tune retrieval and generation.

Root cause: Users may care about hallucination, answer relevance, or other use-case-specific metrics that require explicit evaluation workflows.

Resolution: Let users run custom evaluations and join context, responses, Slack metadata, and feedback into evaluation reports.

“They can evaluate hallucinations, answer relevancy, or any other metric that they deem important for their use case.”article, stated
“Genie’s context and responses are retrieved from Hive and joined on any other relevant date, like Slack metadata and user feedback.”article, stated

Support loops can still stall if users cannot easily continue, resolve, or escalate.

Root cause: The original on-call process involved several rounds of waiting for human responses and clarifications.

Resolution: Add interaction buttons for follow-up questions, resolution marking, and contacting human support.

“After several rounds of back-and-forth communication, the user’s question eventually gets resolved.”article, stated
“Using those buttons, users can easily ask followup questions, mark questions as resolved, or contact human support.”article, stated

Evaluation

Genie combines Slack feedback, dashboarded operational metrics, custom user evaluations for hallucination and answer relevance, an LLM-as-judge pipeline over context/responses/metadata, and a document-evaluation app that scores and recommends improvements to knowledge-base documents.

Metrics: Resolved · Helpful · Not Helpful · Not Relevant · hallucination · answer relevancy · document evaluation score · helpfulness rate · engineering hours saved · questions answered

3 supporting quotes
“Users can provide feedback right away in Slack by clicking the relevant button in the Genie’s reply.”article, stated
“They can evaluate hallucinations, answer relevancy, or any other metric that they deem important for their use case.”article, stated
“The specified metrics are extracted and included in the evaluation report, which is available to users in the UI.”article, stated

Outcomes

This is a production internal support copilot at Uber scale: roughly 45,000 monthly Slack support questions motivated the project, the deployed system reached 154 Slack channels, answered over 70,000 questions, achieved a reported 48.9% helpfulness rate, and was estimated to save 13,000 engineering hours.

4 supporting quotes
“Since its launch in September of 2023, Genie has expanded its presence to 154 Slack channels and has answered over 70,000 questions.”article, stated
“Genie boasts a 48.9% helpfulness rate, showcasing its growing effectiveness.”article, stated
“We estimate it’s saved us 13,000 engineering hours so far since its launch.”article, stated
“This mode allows users to ask follow-up questions more conveniently and encourages them to read Genie’s answers more attentively.”article, stated