为自托管模型启用日志记录
- Tier: Premium, Ultimate
- Add-on: GitLab Duo Enterprise
- Offering: GitLab Self-Managed
通过为 GitLab Duo 自托管版本启用详细日志记录,您可以更有效地监控自托管模型的性能并调试问题。
启用日志记录
先决条件:
- 您必须是管理员。
- 您必须拥有 Premium 或 Ultimate 订阅。
- 您必须拥有 GitLab Duo Enterprise 插件。
要启用日志记录:
- 在左侧边栏底部,选择 管理员。
- 选择 GitLab Duo。
- 在 GitLab Duo 部分,选择 更改配置。
- 在 启用 AI 日志 下,选择 捕获有关 AI 相关活动和请求的详细信息。
- 选择 保存更改。
现在您可以在您的 GitLab 安装中访问日志。
您 GitLab 安装中的日志
日志记录设置旨在保护敏感信息,同时保持系统操作的透明性,由以下组件组成:
- 捕获对 GitLab 实例请求的日志。
- 日志控制。
llm.log文件。
捕获对 GitLab 实例请求的日志
在 application.json、production_json.log 和 production.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_cursor和content_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 第三方供应商模型也是如此。
- 该设置启用对自托管实例和 AI 网关上的
- GitLab 自托管版和 GitLab 管理的 AI 网关:
- 该设置启用对您的 GitLab 自托管实例上
llm.log的详细日志记录。 - 该设置不会激活 GitLab 管理的 AI 网关的扩展日志记录。对于云连接的 AI 网关,日志记录保持禁用状态,以保护敏感数据。
- 该设置启用对您的 GitLab 自托管实例上
云连接 AI 网关中的日志记录
为防止敏感信息的潜在数据泄露,在使用云连接的 AI 网关时,故意禁用了扩展日志记录(包括提示和输入)。防止 PII 的泄露是首要任务。
在 AI 网关和 GitLab 之间交叉引用日志
属性 correlation_id 被分配给每个请求,并在响应请求的不同组件之间传递。有关更多信息,请参阅使用相关 ID 查找日志的文档。
相关 ID 可以在您的 AI 网关和 GitLab 日志中找到。但是,它不会出现在您的模型提供商日志中。