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 实例 - 支持 GitLab 所有类型的单体应用
- CustomersDot - 允许客户通过增加座位数购买和升级订阅,并添加/编辑支付记录。它还管理自托管许可证。
- AI 网关 - 为调用模型提供统一接口的系统。部署在 Google Cloud Run 上(使用 Runway)。
- 扩展程序
- 语言服务器(为 VS Code、Windows 版 Visual Studio 2022 和 Neovim 提供 Code Suggestions 功能)
- VS Code
- JetBrains
- Windows 版 Visual Studio 2022
- Neovim
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 项目提案模板 作为您想法的一部分,并包含所需的新工具。
模型
以下模型已获批准使用:
- Google 的 Vertex AI 和 模型花园
- Anthropic 模型
- 建议审阅者
嵌入
有关 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(或云连接器)遥测数据是一个困难且尚未解决的问题。