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

为自托管模型启用日志记录

  • Tier: Premium, Ultimate
  • Add-on: GitLab Duo Enterprise
  • Offering: GitLab Self-Managed

通过为 GitLab Duo 自托管版本启用详细日志记录,您可以更有效地监控自托管模型的性能并调试问题。

启用日志记录

先决条件:

  • 您必须是管理员。
  • 您必须拥有 Premium 或 Ultimate 订阅。
  • 您必须拥有 GitLab Duo Enterprise 插件。

要启用日志记录:

  1. 在左侧边栏底部,选择 管理员
  2. 选择 GitLab Duo
  3. 在 GitLab Duo 部分,选择 更改配置
  4. 启用 AI 日志 下,选择 捕获有关 AI 相关活动和请求的详细信息
  5. 选择 保存更改

现在您可以在您的 GitLab 安装中访问日志。

您 GitLab 安装中的日志

日志记录设置旨在保护敏感信息,同时保持系统操作的透明性,由以下组件组成:

  • 捕获对 GitLab 实例请求的日志。
  • 日志控制。
  • llm.log 文件。

捕获对 GitLab 实例请求的日志

application.jsonproduction_json.logproduction.log 等文件中的日志记录会捕获对 GitLab 实例的请求:

  • 过滤请求:我们记录这些文件中的请求,但确保敏感数据(如输入参数)被过滤。这意味着虽然捕获了请求元数据(例如请求类型、端点和响应状态),但实际的输入数据(例如查询参数、变量和内容)不会被记录,以防止敏感信息泄露。

  • 示例 1:在代码建议完成请求的情况下,日志记录捕获请求详细信息,同时过滤敏感信息:

    {
      "method": "POST",
      "path": "/api/graphql",
      "controller": "GraphqlController",
      "action": "execute",
      "status": 500,
      "params": [
        {"key": "query", "value": "[FILTERED]"},
        {"key": "variables", "value": "[FILTERED]"},
        {"key": "operationName", "value": "chat"}
      ],
      "exception": {
        "class": "NoMethodError",
        "message": "undefined method `id` for {:skip=>true}:Hash"
      },
      "time": "2024-08-28T14:13:50.328Z"
    }

    如所示,虽然错误信息和请求的一般结构被记录,但敏感输入参数被标记为 [FILTERED]

  • 示例 2:在代码建议完成请求的情况下,日志记录也捕获请求详细信息,同时过滤敏感信息:

    {
      "method": "POST",
      "path": "/api/v4/code_suggestions/completions",
      "status": 200,
      "params": [
        {"key": "prompt_version", "value": 1},
        {"key": "current_file", "value": {"file_name": "/test.rb", "language_identifier": "ruby", "content_above_cursor": "[FILTERED]", "content_below_cursor": "[FILTERED]"}},
        {"key": "telemetry", "value": []}
      ],
      "time": "2024-10-15T06:51:09.004Z"
    }

    如所示,虽然请求的一般结构被记录,但敏感输入参数(如 content_above_cursorcontent_below_cursor)被标记为 [FILTERED]

日志控制

您通过 Duo 设置页面开启和关闭 AI 日志 来控制这些日志的子集。关闭 AI 日志会禁用特定操作的日志记录。

llm.log 文件

AI 日志 启用时,通过您的 GitLab 自托管实例发生的代码生成和 Chat 事件会被捕获到 llm.log 文件 中。未启用时,日志文件不会捕获任何内容。代码补全日志直接在 AI 网关中捕获。这些日志不会传输到 GitLab,仅在您的 GitLab 自托管基础设施上可见。

您的 AI 网关容器中的日志

要指定 AI 网关生成日志的位置,请运行:

docker run -e AIGW_GITLAB_URL=<your_gitlab_instance> \
 -e AIGW_GITLAB_API_URL=https://<your_gitlab_domain>/api/v4/ \
 -e AIGW_LOGGING__TO_FILE="aigateway.log" \
 -v <your_file_path>:"aigateway.log"
 <image>

如果不指定文件名,日志将流式传输到输出,也可以使用 Docker 日志进行管理。 有关更多信息,请参阅 Docker 日志文档

此外,AI 网关执行的输出可以帮助调试问题。要访问它们:

  • 使用 Docker 时:

    docker logs <container-id>
  • 使用 Kubernetes 时:

    kubectl logs <container-name>

要将这些日志摄取到日志解决方案中,请参阅您的日志提供程序文档。

日志结构

当发出 POST 请求时(例如到 /chat/completions 端点),服务器会记录请求:

  • Payload
  • Headers
  • Metadata

1. 请求 payload

JSON payload 通常包含以下字段:

  • messages: 消息对象的数组。
    • 每个消息对象包含:
      • content: 表示用户输入或查询的字符串。
      • role: 表示消息发送者的角色(例如 user)。
  • model: 指定要使用的模型的字符串(例如 mistral)。
  • max_tokens: 指定响应中要生成的最大 token 数量的整数。
  • n: 指定要生成的完成数量的整数。
  • stop: 字符串数组,表示生成文本的停止序列。
  • stream: 布尔值,指示是否应流式传输响应。
  • temperature: 控制输出随机性的浮点数。
示例请求
{
    "messages": [
        {
            "content": "<s>[SUFFIX]None[PREFIX]# # build a hello world ruby method\n def say_goodbye\n    puts \"Goodbye, World!\"\n  end\n\ndef main\n  say_hello\n  say_goodbye\nend\n\nmain",
            "role": "user"
        }
    ],
    "model": "mistral",
    "max_tokens": 128,
    "n": 1,
    "stop": ["[INST]", "[/INST]", "[PREFIX]", "[MIDDLE]", "[SUFFIX]"],
    "stream": false,
    "temperature": 0.0
}

2. 请求 headers

请求 headers 提供有关发出请求的客户端的额外上下文。关键 headers 可能包括:

  • Authorization: 包含 API 访问的 Bearer token。
  • Content-Type: 指示资源的媒体类型(例如 JSON)。
  • User-Agent: 有关发出请求的客户端软件的信息。
  • X-Stainless- headers: 提供有关客户端环境额外元数据的各种 headers。
示例请求 headers
{
    "host": "0.0.0.0:4000",
    "accept-encoding": "gzip, deflate",
    "connection": "keep-alive",
    "accept": "application/json",
    "content-type": "application/json",
    "user-agent": "AsyncOpenAI/Python 1.51.0",
    "authorization": "Bearer <TOKEN>",
    "content-length": "364"
}

3. 请求 metadata

metadata 包含描述请求上下文的各个字段:

  • requester_metadata: 有关请求者的额外 metadata。
  • user_api_key: 用于请求的 API key(匿名化)。
  • api_version: 正在使用的 API 版本。
  • request_timeout: 请求的超时持续时间。
  • call_id: 调用的唯一标识符。
示例 metadata
{
    "user_api_key": "<ANONYMIZED_KEY>",
    "api_version": "1.48.18",
    "request_timeout": 600,
    "call_id": "e1aaa316-221c-498c-96ce-5bc1e7cb63af"
}

示例响应

服务器返回结构化的模型响应。例如:

Response: ModelResponse(
    id='chatcmpl-5d16ad41-c130-4e33-a71e-1c392741bcb9',
    choices=[
        Choices(
            finish_reason='stop',
            index=0,
            message=Message(
                content=' Here is the corrected Ruby code for your function:\n\n```ruby\ndef say_hello\n  puts "Hello, World!"\nend\n\ndef say_goodbye\n    puts "Goodbye, World!"\nend\n\ndef main\n  say_hello\n  say_goodbye\nend\n\nmain\n```\n\nIn your original code, the method names were misspelled as `say_hell` and `say_gobdye`. I corrected them to `say_hello` and `say_goodbye`. Also, there was no need for the prefix',
                role='assistant',
                tool_calls=None,
                function_call=None
            )
        )
    ],
    created=1728983827,
    model='mistral',
    object='chat.completion',
    system_fingerprint=None,
    usage=Usage(
        completion_tokens=128,
        prompt_tokens=69,
        total_tokens=197,
        completion_tokens_details=None,
        prompt_tokens_details=None
    )
)

您的推理服务提供商中的日志

GitLab 不管理您的推理服务提供商生成的日志。请参阅您的推理服务提供商文档,了解如何使用他们的日志。

GitLab 和 AI 网关环境中的日志行为

GitLab 通过使用 llm.log 为 AI 相关活动提供日志记录功能,该文件捕获输入、输出和其他相关信息。但是,日志记录行为取决于 GitLab 实例和 AI 网关是自托管还是云连接

默认情况下,日志不包含 LLM 提示输入和响应输出,以支持 AI 功能数据的数据保留策略

日志记录场景

GitLab 自托管版和自托管 AI 网关

在此配置中,GitLab 和 AI 网关都由客户托管。

  • 日志行为:启用完整日志记录,所有提示、输入和输出都记录到实例上的 llm.log

  • AI 日志 启用时,会记录额外的调试信息,包括:

    • 预处理后的提示。
    • 最终提示。
    • 额外上下文。
  • 隐私:由于 GitLab 和 AI 网关都是自托管:

    • 客户完全控制数据处理。
    • 敏感信息的日志记录可以根据客户的意愿启用或禁用。

    当 AI 功能使用 GitLab AI 第三方供应商模型时,即使在 AI 日志启用 的情况下,GitLab 托管的 AI 网关中也不会生成详细日志。这可以防止敏感信息意外泄露。

GitLab 自托管版和 GitLab 管理的 AI 网关(云连接)

在此场景中,客户托管 GitLab,但依赖 GitLab 管理的 AI 网关进行 AI 处理。

  • 日志行为:发送到 AI 网关的提示和输入不会在云连接的 AI 网关中记录,以防止敏感信息(如个人身份信息 PII)的暴露。
  • 扩展日志记录:即使 AI 日志启用,GitLab 管理的 AI 网关中也不会生成详细日志,以避免敏感信息意外泄露。
    • 在此设置中,日志记录保持最小化,扩展日志记录功能默认禁用。
  • 隐私:此配置旨在确保敏感数据不会在云环境中被记录。

AI 日志

AI 日志 控制是否记录额外的调试信息,包括提示和输入。此配置对于监控和调试 AI 相关活动至关重要。

按部署设置的行为

  • GitLab 自托管版和自托管 AI 网关
    • 该设置启用对自托管实例和 AI 网关上的 llm.log 的详细日志记录,捕获 AI 模型的输入和输出。
    • 对于云连接的 AI 网关,日志记录保持禁用状态,以保护敏感数据,即使功能使用 GitLab 第三方供应商模型也是如此。
  • GitLab 自托管版和 GitLab 管理的 AI 网关
    • 该设置启用对您的 GitLab 自托管实例上 llm.log 的详细日志记录。
    • 该设置不会激活 GitLab 管理的 AI 网关的扩展日志记录。对于云连接的 AI 网关,日志记录保持禁用状态,以保护敏感数据。

云连接 AI 网关中的日志记录

为防止敏感信息的潜在数据泄露,在使用云连接的 AI 网关时,故意禁用了扩展日志记录(包括提示和输入)。防止 PII 的泄露是首要任务。

在 AI 网关和 GitLab 之间交叉引用日志

属性 correlation_id 被分配给每个请求,并在响应请求的不同组件之间传递。有关更多信息,请参阅使用相关 ID 查找日志的文档

相关 ID 可以在您的 AI 网关和 GitLab 日志中找到。但是,它不会出现在您的模型提供商日志中。

相关主题