How Uber Built a Genie to Answer Questions Correctly

TL;DR · AI 摘要
How Uber Built a Genie to Answer Questions Correctly ByteByteGo Oct 19, 2026 Webinar How to stop rewriting your agent’s...
核心要点
- 主题聚焦:How Uber Built a Genie to Answer Questions Corre
- 来源:ByteByteGo Newsletter,建议结合原文判断细节。
- AI 分析暂不可用,本条为保底评分与摘要。
Uber如何构建Genie系统以正确回答问题
ByteByteGo
2026年10月19日
[网络研讨会] 如何停止反复重写代理代码(赞助)
目前,你就是代理的上下文引擎。你编写规则文件、维护技能,并将Slack线程中遗漏的内容粘贴进去。
但人工整理的上下文信息会过时。当存在冲突答案时,代理无法判断哪个是正确的。这会导致更高的token费用和更长的审核时间。
10月28日(免费)加入我们直播,了解以下内容:
- AI成熟度的8个阶段以及团队容易陷入的困境
- 上下文引擎如何在代理编写代码前整理上下文并解决冲突
- 实时演示:相同编程任务中节省的token数量及代码生成以外的应用场景
- 奖励:2个今天即可使用的开源工具
立即注册
Genie是Uber内部用于回答工程支持问题的AI助手。它在Uber文档中查找相关信息,使用语言模型解释这些信息,并为工程师提供继续对话或请求人工帮助的方式。
Genie的有趣之处在于Uber如何将多种能力整合,构建出一个无缝融入工程师工作流程的实用支持系统。
在本文中,我们将了解Genie如何准备知识、检索信息并生成答案。以下是本文内容:
- Genie试图解决的问题
- Genie的功能
- Genie获取知识的方式
- Genie如何从知识库中查找特定信息
- Genie如何处理用户问题
- 典型的Genie工作流程是怎样的
- Genie如何确保答案正确
- 如果Genie无法回答某些问题
- Genie如何收集反馈
- Uber如何评估Genie的性能
免责声明:本文基于来自多个来源公开分享的信息。文末有参考文献。如发现任何不准确之处,请在评论区指出。
Genie试图解决的问题
问题始于工程团队如何相互支持。
在大型软件驱动的公司中,许多团队构建其他开发人员用于完成工作的平台。一个平台可能提供各种活动的工具,如软件部署、数据处理或与机器学习工作流交互。使用这些平台的其他团队开发人员不可避免地需要帮助配置、处理错误或理解不熟悉的功能。
在典型设置中,负责管理平台的团队会指派一名工程师在特定时间段内处理 incoming 问题。这种责任通常涉及提供值班支持。虽然值班工作确实可能涉及紧急的生产事故,但Genie试图解决的问题更侧重于平台团队通过Slack频道为开发人员提供的日常技术支持。
例如,产品团队的开发人员可能会询问如何配置平台功能。值班工程师阅读问题后请求更多细节。提问者回应后,需要再次等待。最终,值班工程师找到相关文档或解释所需步骤。即使是一个相对简单的问题,也可能涉及多轮对话和等待。
Uber报告称,其内部支持渠道每月收到约45,000个问题。在如此大的数量下,重复问题消耗了平台团队本可用于更有价值工作的大量工程时间。
许多回答这些问题所需的信息已经存在。然而,这些信息通常分散在Engwiki(Uber的内部工程维基)或其内部Stack Overflow等平台及其他文档中。寻找正确的信息变得如此困难,以至于人们更倾向于直接询问他人。
Genie的设计目标是通过开发者已经寻求帮助的Slack频道,使这些现有知识得以利用。
Genie的功能是什么?
Genie将信息检索与解释说明相结合。
大型语言模型(LLM)可以生成可读的解释并回答技术问题。然而,其通用训练数据并不自动包含Uber的私有平台、内部流程或文档的相关知识。
因此,Uber需要一种将语言模型与内部知识库连接的方式。两种方法对此有所帮助:微调(fine-tuning)和检索增强生成(RAG)。
微调是指通过为特定目的选择的示例,对现有模型进行进一步训练。Uber表示,这种方法需要收集大量高质量且多样化的训练示例,并配备足够的计算资源,以便随着新示例的出现更新基础模型。
另一方面,RAG在提问时提供相关信息。系统首先在知识库中搜索,检索出有用的内容段落,然后将这些段落与问题一并提供给LLM。模型利用所有这些信息生成回答。
例如,假设开发者询问如何在内部平台更改某个设置。RAG系统会搜索该平台的文档,找到解释该设置的段落,并将其提供给模型。模型将检索到的信息转化为适合问题的回答。
Uber选择RAG作为Genie的方案,因为它可以基于现有文档快速启动,无需先收集微调数据集。尽管如此,仍需要大量工作来收集、准备和评估文档。此外,这意味着只需更新外部知识库即可提升Genie可访问的信息质量,而无需每次文档变更都重新训练模型。
Genie如何获取所需知识
知识准备与回答问题的过程是分开的。在Genie能够检索有用信息之前,Uber必须将其分散的文档转化为可搜索的集合。这一准备工作通过ETL管道实现。
ETL代表提取(extract)、转换(transform)和加载(load)。
- 提取是指从内部来源获取内容。
- 转换是指为检索准备这些内容,包括将其拆分为片段并生成数值表示。
- 加载是指将处理后的数据提供给搜索基础设施。
Uber工程团队使用Apache Spark执行这项工作。作为参考,Spark是一个跨多个工作者处理数据的系统,允许将大规模准备工作拆分为更小的独立任务。
该管道通过Engwiki和Uber内部Stack Overflow等来源提供的接口获取内容,并将结果存入Spark DataFrame。可以将其想象为一个带有行和列的表格。
在此阶段,一行包含诸如文档来源URL、文本内容和附加元数据等信息。此处的元数据是描述文档的信息,而非文档内容本身。
保留源 URL 与文本的关联关系在整个系统中都非常重要。这是因为 Genie 最终需要将答案与支持它的原始文档建立联系。在准备阶段保留这种关联关系,可以简化后续的来源归属工作。
Genie 如何查找特定信息
嵌入向量使 Genie 能够在其知识库中搜索相关语义。在 Uber 收集完所有文档后,下一个挑战是找到与用户问题相关的段落。
系统首先将文档分割成更小的片段,称为块(chunk)。例如,一份长文档可能包含安装说明、配置选项和故障排除指南。然而,关于某个配置选项的问题可能只需要文档中的一小部分内容。通过分块处理,这些较小的段落可以作为独立的检索候选对象。
Uber 使用 LangChain 对其维基内容进行分块处理。随后,它使用 OpenAI 的嵌入模型为每个块生成嵌入向量。嵌入向量是一组数字列表,用于表示文本语义的某些方面。嵌入模型的设计使得相关文本的表示可以通过相似性搜索找到。这有助于系统在问题和文档使用不同措辞时仍能找到相关信息。例如,一个问题可能提到“任务耗时过长”,而相关文档则讨论“执行时间限制”。这些短语只是示例,但它们展示了当精确关键词不匹配时,搜索相关语义为何能带来突破性改进。
生成的数据显示每个块与其嵌入向量和源信息相关联。原始文本仍然至关重要。嵌入向量只是帮助搜索系统定位段落。段落本身则为语言模型提供可读的信息。
Uber 通过 Spark 执行自定义 Python 函数生成嵌入向量。这使嵌入生成能够融入与文档收集和准备相同的处理流程中。
Genie 如何处理用户问题
Uber 准备搜索基础设施以响应问题。生成嵌入向量会产生可搜索的数据,但这些数据仍需传递到处理实时请求的系统中。这通过 Pusher 阶段实现。
此处使用了两个内部系统:
- Sia:这是 Uber 的内部向量数据库解决方案。向量数据库支持搜索嵌入等数值表示。
- Terrablob:这是 Uber 的二进制大对象存储,用于存储流水线和提供服务基础设施使用的数据和文件。
一个引导任务将数据导入 Sia,随后 Spark 任务构建并合并一个索引,以组织数据以便高效搜索。
生成的索引数据存储在 Terrablob 中。称为“叶子”的服务机器会下载基础索引并同步快照数据。当请求到达时,这些叶子节点会针对加载的索引处理搜索请求。
这将构建可搜索知识的工作与回答具体问题的工作分离开来。
- 文档准备和索引构建通过摄入流水线完成。
- 实时请求使用提供给服务机器的索引。
典型的 Genie 工作流程是怎样的
每个问题在生成回答前都会先进行检索。一旦知识库准备就绪,Genie 即可回答问题。实现这一功能的核心后端组件是 Uber 的知识服务。
以下是其工作原理:
- 当有人在 Slack 上提出问题时,Genie 机器人会将问题发送至知识服务。该服务会将问题转换为嵌入向量。
- 随后在向量数据库中搜索与该嵌入向量相关的文档片段。
- 搜索结果会返回带有来源信息的相关段落。这些段落会与用户的问题和回答指令一起作为材料发送给 LLM。
- 接下来,模型生成回答,并通过 Genie 返回至 Slack。
该流程中存在两个明确的模型职责。
嵌入模型生成支持检索的数值表示。另一方面,LLM 会阅读检索到的文本并生成书面回答。
这种差异在处理故障时很有用。Genie 可能检索到不合适的段落,也可能检索到有用段落但仍生成不充分的回答。改进系统需要检查这两个阶段。
Genie 如何确保答案正确
Uber 为模型生成答案设定了明确的边界。LLM 可能会生成看似合理但错误或缺乏支持的陈述。这种行为通常被称为幻觉。在内部支持系统中,虚构的指令可能会误导开发人员。
Uber 部分通过构建模型输入的方式来解决这个问题。
每个检索结果都会作为独立的子上下文呈现,并附带其来源 URL。子上下文只是在更大提示中明确标识的支持材料片段。模型被指示使用提供的子上下文进行回答,并提供来源 URL 作为引用。这为模型提供了明确的证据来源,也使用户能够查阅支持文档。例如,如果多个段落讨论配置过程的不同部分,保留每个段落的来源有助于生成的解释保持可追溯性。
这些措施降低了不支持答案的风险,但来源链接并不能保证每个陈述都正确。检索到的段落必须相关,底层文档必须准确,模型必须忠实地表示内容。这就是为什么评估仍然是架构中不可或缺的部分。
Uber 还限制了 Genie 可访问的知识范围。团队预先选择了对 Uber 开发者广泛可用的来源,因为某些内部信息不适合通过模型处理或 Slack 回复进行公开。
如果 Genie 无法回答某些问题
对话中包含明确的人工支持路径。首次回答后,支持交互通常会继续。用户可能需要澄清,发现建议的信息未能完全解决其情况,或需要文档无法提供的操作。
Uber 重新设计了 Genie 的交互流程以应对这些可能性。其回答包含操作按钮,允许用户提出后续问题、标记问题已解决或联系人工支持。
如果 Genie 缺乏足够的信息来回答问题,它会告知用户并引导他们联系负责平台的值班开发人员。当用户将对话升级至人工支持时,人工开发人员将接管对话,而 Genie 会保持静默。这种方式可以在工程师处理问题时保持对话的聚焦性。
这一功能非常重要,因为成功的支持不仅仅是生成一段文字。用户需要了解下一步该怎么做。即使一个答案只能部分解决问题,只要它能顺畅地引导出澄清说明或人工协助,仍然具有价值。
Genie 如何收集反馈
用户反馈用于衡量答案的效果。Uber 直接在 Slack 中收集反馈,用户可以选择响应类别:
- 已解决:答案完全解决了问题。
- 有帮助:答案提供了一些帮助,但仍需要更多协助。
- 无帮助:答案错误或未解决用户的问题。
- 不相关:请求需要人工协助,而 Genie 无法提供帮助,例如代码审查。
这些类别的区分非常重要。部分帮助与完全解决存在差异,同样,错误答案与超出文档助手能力范围的请求也有区别。
当用户提交反馈时,Slack 插件会将其与相关元数据一并收集。它通过 Kafka 主题(作为事件流)将这些信息发送至 Hive 表,以便未来进行存储和分析。Uber 随后会在仪表板上展示这些生成的指标。
这会记录 Genie 在实际使用中的表现。如果没有这样的记录,系统可能回答了许多问题,但其操作人员却无法了解这些答案是否真正帮助了任何人。
Uber 如何评估 Genie 的性能
Uber 会同时评估 Genie 的答案及其背后的文档。用户反馈直接证明了 Genie 的实用性。然而,Uber 还支持对幻觉和答案相关性等特性进行自定义评估。
对于这些评估,独立的管道会从 Hive 中检索 Genie 的记录上下文和响应。它会将这些信息与 Slack 元数据和用户反馈等相关内容结合,然后为评估者准备数据。
评估者采用“语言模型作为评判者”的方法。这意味着语言模型会收到一个评估提示,告诉它如何评估材料。其任务是根据选定的标准检查现有答案。例如,评估提示可以询问答案是否解决了问题,以及其主张是否得到了提供的上下文支持。
评估结果会被处理成指标,并发布在可通过界面访问的报告中。Uber 表示,这些评估有助于规划检索和生成步骤的改进。
评估还可以扩展到源文档本身。这是设计中特别有用的部分,因为答案质量取决于可用于检索的材料。如果文档不清晰、不完整或不准确,即使成功检索到它,也可能导致糟糕的支持体验。
Uber 的文档评估流程将每个文档表示为 Spark 数据框中的一行。它将文档和自定义评估提示发送给大型语言模型(LLM)评判者。模型返回一个评分、对评分的解释以及改进文档的可操作建议。这些结果会发布在一份报告中,该报告也可通过 Michelangelo 接口访问。例如,某篇文档可能描述了一个流程但未明确先决条件。改进该文档可以为 Genie 提供更优质的检索和解释材料,同时也有助于直接阅读文档的开发人员。
总结来说,两种评估流程检查系统的不同部分。答案评估检查 Genie 在特定交互中生成的内容。文档评估检查未来答案将从中构建的知识质量。
结论
Genie 于 2023 年 9 月上线。一年内,Uber 报告有 154 个 Slack 频道使用 Genie。在此期间,超过 7 万个问题得到了解答。总体帮助率达到了 48.9%,相当于完整解决率,节省了约 13000 小时的工程时间。
这种成本追踪是通过跟踪系统中的调用实现的。在多个支持渠道上运行基于模型的服务也需要对其成本的可见性。Uber 通过在请求流程中携带标识符来提供这种可见性。
当 Slack 客户端或其他平台调用知识服务时,它会传递一个 UUID。知识服务将此标识符作为请求元数据转发至 Michelangelo 网关。该标识符可以包含在审计日志中,并用于追踪相关成本。
Genie 是一款前沿的机器人,旨在简化值班管理、优化事件响应并提升团队协作。它有潜力彻底改变用户和任何平台的值班开发人员在相应平台 Slack 频道内互动和参与的整个体验。
参考文献:
- Genie:Uber 的 Gen AI 值班助手
- 了解 Michelangelo:Uber 的机器学习平台