Help us learn about your current experience with the documentation. Take the survey.

AI 架构

本文档描述了 GitLab Duo AI 功能共享的架构。有关该架构的历史动机和目标,请参见 AI 网关架构设计文档

引言

下图展示了 GitLab 中不同组件交互的简化视图。

@startuml
!theme cloudscape-design
skinparam componentStyle rectangle

package Clients {
  [IDEs, 代码编辑器, 语言服务器] as IDE
  [GitLab Web 前端] as GLWEB
}

[GitLab.com] as GLCOM
[自托管/专用版] as SMI
[CustomersDot API] as CD
[AI 网关] as AIGW

package Models {
  [第三方模型 (Anthropic, VertexAI)] as THIRD
  [GitLab 本机模型] as GLNM
}

Clients -down-> GLCOM : REST/Websockets
Clients -down-> SMI : REST/Websockets
Clients -down-> AIGW : 代码补全直接连接
SMI -right-> CD : 许可证 + JWT 同步
GLCOM -down-> AIGW : 提示词 + 遥测数据 + JWT (REST)

SMI -down-> AIGW : 提示词 + 遥测数据 + JWT (REST)
AIGW -up-> GLCOM : JWKS 公钥同步
AIGW -up-> CD : JWKS 公钥同步
AIGW -down-> Models : 提示词
@enduml
  • AI 抽象层 - 每个 GitLab 实例(自托管、GitLab.com 等)都包含一个 AI 抽象层,它为在单体应用中实现新 AI 功能提供了一个框架。该层向请求添加上下文信息,并进行请求的前置/后置处理。

系统

GitLab.com 与自托管/专用版访问 AI 网关的差异

  • GitLab.com
    • GitLab.com 实例自行签发由私钥签名的 JWT 认证令牌。
  • 其他类型实例
    • 自托管和专用版定期与 CustomersDot 同步其许可证和 AI 访问令牌。
    • 自托管和专用版实例将流量路由到适当的 AI 网关。

基于 SaaS 的 AI 抽象层

GitLab 运行基于云的 AI 架构。我们将允许获得许可的 GitLab 自托管实例通过 AI 网关访问它。详细信息请参见 设计文档

主要原因有两个:最佳 AI 模型通常依赖于此目的设计的专用硬件,因此位于云端;而运营能够大规模运行 AI 且性能合适的自托管基础设施是一项重大任务。我们正在积极 跟踪对 AI 感兴趣的自托管客户

AI 网关

AI 网关(以前称为 模型网关)是一个独立服务,将为所有 GitLab 用户(无论他们使用哪种实例:自托管、专用版或 GitLab.com)提供 AI 功能访问。基于 SaaS 的 AI 抽象层将过渡到连接到此网关,而不是直接访问云提供商。

从 GitLab-rails 调用 AI 网关可以使用 抽象层。默认情况下,这些操作通过 Sidekiq 作业异步执行,以防止 Puma 中的长时间请求。由于 Sidekiq 会增加延迟,因此应将其用于非延迟敏感的操作。

在撰写本文时,抽象层仍直接调用 AI 提供商。史诗 11484 建议更改这一点。

当某个操作对延迟敏感时,我们可以决定直接调用 AI 网关。这避免了 Sidekiq 带来的延迟。我们对 code_suggestions 已经这样做了,它们由嵌套在 /api/v4/code_suggestions 中的 API 端点处理。对于任何新添加的端点,我们应该将它们嵌套在 /api/v4/ai_assisted 命名空间内。这样做会自动将 GitLab.com 上的请求路由到 ai-assisted 集群,将该工作负载与常规 API 隔离,并在需要时更容易扩展。

支持的技术

作为 AI 工作组的一部分,我们一直在调查各种技术并对它们进行审核。以下是已审查并批准在 GitLab 应用程序中使用的工具列表。

也可以使用其他模型或技术,但在使用前需要经过审核流程。请使用 AI 项目提案模板 作为您想法的一部分,并包含所需的新工具。

模型

以下模型已获批准使用:

嵌入

有关 GitLab 嵌入的更多信息,请参阅我们的 AI 嵌入架构

代码建议

代码建议正被集成到 GitLab-Rails 仓库中,这将统一代码建议与使用抽象层的 AI 功能之间的架构,并提供 自托管支持 以支持其他 AI 功能。

下表记录了代码建议当前提供的功能,以及随着统一过程这些功能的变化情况:

主题 详情 当前发生位置 未来发生位置
请求处理
从 IDE(VS Code、GitLab Web IDE、MS Visual Studio 2022 for Windows、IntelliJ、JetBrains、VIM、Emacs、Sublime)接收请求,包括光标前后代码 GitLab Rails GitLab Rails
验证当前用户身份,确认他们有权在此项目中使用代码建议 GitLab Rails + AI 网关 GitLab Rails + AI 网关
通过 TreeSitter 预处理请求以添加上下文,例如包含导入语句 AI 网关 未确定
将请求路由到 AI 提供商 AI 网关 AI 网关
将响应返回给 IDE GitLab Rails GitLab Rails
记录请求,包括时间戳、响应时间、模型等 两者 两者
遥测数据
IDE 中用户的接受或拒绝行为 AI 网关 两者
每日唯一用户数 GitLab Rails, AI 网关 未确定
错误率、模型使用情况、响应时间、IDE 使用情况 AI 网关 两者
各语言的建议数量 AI 网关 两者
监控 两者 两者
模型路由
目前我们不使用此功能,但代码建议能够根据流量百分比支持路由到多个模型 AI 网关 两者
内部模型
目前未维护,能够在自己的实例中运行模型,在 Triton 中运行,并将请求路由到自己的模型 AI 网关 AI 网关

自托管支持

GitLab 自托管的代码建议作为 云连接器 MVC 的一部分引入。

有关此项目的技术解决方案的更多信息,请参见 云连接器架构文档

我们的意图是将此解决方案演变为在云连接器产品伞下为其他 AI 功能提供服务。

代码建议延迟

代码建议的接受率对延迟高度敏感。在使用 AI 助手编写代码时,用户只会暂停很短的时间,然后继续手动输入一段代码。一旦用户按下后续按键,现有建议就会失效,并且需要向代码建议端点发出新请求。反过来,此请求也会对延迟高度敏感。

在最坏的情况下,如果有足够的延迟,IDE 可能会发出一系列请求,每个请求都会在被用户忽略之前发送出去。这对用户没有任何价值,同时仍然会给我们的服务带来负载。

请参阅我们围绕如何计划迭代此功能延迟的讨论 此处

架构的未来变更

  • 我们计划在不同地区部署 AI 网关,以改善延迟(请参阅 ed 史诗 AI 网关的多区域支持)。
  • 我们希望集中遥测数据。然而,截至目前,集中化 AI(或云连接器)遥测数据是一个困难且尚未解决的问题。