主题
将追踪数据导出到 BigQuery
使用批量导出到 GCS 将 LangSmith 追踪数据加载到 BigQuery。
INFO
套餐限制适用
对于在 2026 年 8 月 3 日之后注册的客户,批量导出仅在 LangSmith Enterprise 套餐上可用。在 2026 年 8 月 3 日或之前注册的客户,可以在 Plus 或 Enterprise 套餐上使用批量导出,截止到 2027 年 2 月 1 日。
LangSmith 可以将追踪数据以 Parquet 格式导出到 Google Cloud Storage (GCS) 存储桶。然后,你可以将其作为外部表(直接从 GCS 就地查询)或原生表(复制到 BigQuery 存储)加载到 BigQuery。
本指南涵盖:
- 为 LangSmith 设置 GCS 存储桶和 HMAC 凭据。
- 创建批量导出目标和导出作业。
- 将导出的数据加载到 BigQuery。
有关批量导出配置选项的完整详细信息,请参阅批量导出追踪数据和管理批量导出目标。
前置条件
- 你的 LangSmith 追踪项目中的数据。
- 已安装
gcloudCLI。(你也可以使用 Google Cloud 控制台进行设置。)
1. 创建 GCS 存储桶
为 LangSmith 导出创建一个专用的 GCS 存储桶。使用专用存储桶可以更轻松地授予限定范围的权限,而不影响其他数据:
bash
gcloud storage buckets create gs://YOUR_BUCKET_NAME \
--location=US \
--uniform-bucket-level-access选择靠近你的 BigQuery 数据集的区域,以最大限度减少延迟并避免跨区域外发流量费用。
2. 创建服务账户并授予访问权限
创建一个 GCP 服务账户,供 LangSmith 用于将数据写入 GCS:
bash
gcloud iam service-accounts create langsmith-bulk-export \
--display-name="LangSmith Bulk Export"授予该服务账户对你存储桶的写入权限。最低要求的权限是 storage.objects.create。授予 storage.objects.delete 是可选的,但推荐这样做。LangSmith 使用它来清理在目标验证期间创建的临时测试文件。如果缺少此权限,你的存储桶中可能会残留一个 tmp/ 文件夹。
预定义角色 "Storage Object Admin" 涵盖了所有必需和推荐的权限:
bash
gcloud storage buckets add-iam-policy-binding gs://YOUR_BUCKET_NAME \
--member="serviceAccount:langsmith-bulk-export@YOUR_PROJECT.iam.gserviceaccount.com" \
--role="roles/storage.objectAdmin"若要改用最小化的自定义角色,只需授予:
storage.objects.create(必需)storage.objects.delete(可选,用于清理测试文件)storage.objects.get(可选但推荐,用于验证文件大小)storage.multipartUploads.create(可选但推荐,用于大文件上传)
3. 生成 HMAC 密钥
LangSmith 使用兼容 S3 的 XML API 连接到 GCS,这需要 HMAC 密钥,而不是服务账户 JSON 密钥。
为你的服务账户生成 HMAC 密钥:
bash
gcloud storage hmac create \
langsmith-bulk-export@YOUR_PROJECT.iam.gserviceaccount.com保存输出中的 accessId 和 secret。你也可以在 GCP 控制台的 Cloud Storage > Settings > Interoperability > Create a key for a service account 下生成 HMAC 密钥。
4. 创建批量导出目标
在 LangSmith 中创建一个指向你的 GCS 存储桶的目标。将 endpoint_url 设置为 https://storage.googleapis.com 以使用 GCS 兼容 S3 的 API。
你将需要你的 LangSmith API key 和工作区 ID。
bash
curl --request POST \
--url 'https://api.smith.langchain.com/api/v1/bulk-exports/destinations' \
--header 'Content-Type: application/json' \
--header 'X-API-Key: YOUR_API_KEY' \
--header 'X-Tenant-Id: YOUR_WORKSPACE_ID' \
--data '{
"destination_type": "s3",
"display_name": "GCS for BigQuery",
"config": {
"bucket_name": "YOUR_BUCKET_NAME",
"prefix": "YOUR_PREFIX",
"endpoint_url": "https://storage.googleapis.com"
},
"credentials": {
"access_key_id": "YOUR_HMAC_ACCESS_ID",
"secret_access_key": "YOUR_HMAC_SECRET"
}
}'prefix 是存储桶内的一个路径,LangSmith 将在其中写入导出的文件。例如 langsmith-exports 或 data/traces。选择任何适合你存储桶布局的值。
在保存目标之前,LangSmith 会通过执行一次测试写入来验证凭据。如果请求返回 400 错误,请参阅调试目标错误。
保存响应中的 id;你在下一步中会用到它。
临时验证文件
在创建目标期间(以及凭据轮换时),LangSmith 会向 YOUR_PREFIX/tmp/ 写入一个临时 .txt 文件以验证写入权限,然后尝试删除它。删除是尽力而为的:如果服务账户缺少 storage.objects.delete,则该文件不会被删除,tmp/ 文件夹会保留在你的存储桶中。
tmp/ 文件夹不会影响导出,但它会被包含在宽泛的 GCS URI glob 中(例如 gs://YOUR_BUCKET_NAME/YOUR_PREFIX/*)。
5. 创建批量导出作业
创建一个针对特定项目的导出。使用 format_version: v2_beta 以获得 BigQuery 兼容性——它会生成 BigQuery 能够正确处理、带 UTC 时区信息的 timestamp。
你将需要项目 ID(session_id),你可以从 追踪项目列表中的项目视图复制它。
一次性导出:
bash
curl --request POST \
--url 'https://api.smith.langchain.com/api/v1/bulk-exports' \
--header 'Content-Type: application/json' \
--header 'X-API-Key: YOUR_API_KEY' \
--header 'X-Tenant-Id: YOUR_WORKSPACE_ID' \
--data '{
"bulk_export_destination_id": "YOUR_DESTINATION_ID",
"session_id": "YOUR_PROJECT_ID",
"start_time": "2024-01-01T00:00:00Z",
"end_time": "2024-02-01T00:00:00Z",
"format_version": "v2_beta",
"compression": "snappy"
}'计划(周期性)导出:
bash
curl --request POST \
--url 'https://api.smith.langchain.com/api/v1/bulk-exports' \
--header 'Content-Type: application/json' \
--header 'X-API-Key: YOUR_API_KEY' \
--header 'X-Tenant-Id: YOUR_WORKSPACE_ID' \
--data '{
"bulk_export_destination_id": "YOUR_DESTINATION_ID",
"session_id": "YOUR_PROJECT_ID",
"start_time": "2024-01-01T00:00:00Z",
"interval_hours": 24,
"format_version": "v2_beta",
"compression": "snappy"
}'批量导出默认使用 zstandard 压缩。此示例设置 snappy,因为 Snappy 速度快且被 BigQuery 广泛支持。有关所有可用选项,请参阅批量导出追踪数据,包括字段过滤和过滤表达式。
NOTE
在自托管 LangSmith 上,默认值为 gzip。设置 FF_BULK_EXPORT_DEFAULT_COMPRESSION 环境变量可更改默认值。
输出文件结构
导出的文件会以 Hive 分区路径结构存入 GCS:
gs://YOUR_BUCKET_NAME/YOUR_PREFIX/export_id=<uuid>/tenant_id=<uuid>/session_id=<uuid>/resource=runs/year=<year>/month=<month>/day=<day>/<filename>.parquet启用 Hive 分区检测后,路径中的分区列(export_id、tenant_id、session_id、resource、year、month、day)在 BigQuery 中可作为可查询列使用。
6. 将数据加载到 BigQuery
BigQuery 提供两种访问导出数据的方式。两者都要求先授予 BigQuery 服务账户对你 GCS 存储桶的读取权限。请根据你的需求选择:
- 外部表: 数据保留在 GCS 中,BigQuery 就地查询它。BigQuery 中不产生存储费用,但查询性能比原生存储慢。请参阅所需角色。
- 原生表: 数据被复制到 BigQuery 存储中。查询更快,并完全支持 BigQuery 功能,但会产生 BigQuery 存储费用。请参阅所需权限。
创建表
外部表直接从 GCS 查询数据,而无需将其复制到 BigQuery 中。
- 在 BigQuery 控制台中,在 Explorer 窗格中展开你的项目和数据集。
- 点击数据集的 Actions 菜单(三个点),然后选择 Create table。
- 在 Source 下:
- 将 Create table from 设置为 Google Cloud Storage。
- 将文件路径设置为
gs://YOUR_BUCKET_NAME/YOUR_PREFIX/export_id=*。使用export_id=*会将 BigQuery 的范围限定为 Hive 分区的导出目录,并排除 LangSmith 在目标验证期间写入的tmp/文件夹(请参阅临时验证文件)。 - 将 File format 设置为 Parquet。
- 勾选 Source data partitioning,然后:
- 将 Source URI prefix 设置为
gs://YOUR_BUCKET_NAME/YOUR_PREFIX。 - 将 Partition inference mode 设置为 Automatically infer types。
- 将 Source URI prefix 设置为
- 在 Destination 下:
- 选择你的项目和数据集。
- 输入表名,例如
langsmith_runs。 - 将 Table type 设置为 External table。
- 在 Schema 下,启用 Auto-detect。
- 点击 Create table。
分区路径列(export_id、tenant_id、session_id、resource、year、month、day)可作为可查询列使用。在查询中按 year、month 或 day 进行过滤以启用分区裁剪。
凭据轮换
要在不中断进行中的导出的情况下轮换 HMAC 密钥:
在 GCP 中为同一个服务账户生成新的 HMAC 密钥。
使用新凭据调用 PATCH 端点:
bashcurl --request PATCH \ --url 'https://api.smith.langchain.com/api/v1/bulk-exports/destinations/YOUR_DESTINATION_ID' \ --header 'Content-Type: application/json' \ --header 'X-API-Key: YOUR_API_KEY' \ --header 'X-Tenant-Id: YOUR_WORKSPACE_ID' \ --data '{ "credentials": { "access_key_id": "NEW_HMAC_ACCESS_ID", "secret_access_key": "NEW_HMAC_SECRET" } }'LangSmith 会在保存前通过一次测试写入来验证新凭据。在此验证期间,你的存储桶中可能会出现一个新的
tmp/文件(请参阅临时验证文件)。保持旧 HMAC 密钥处于活动状态,直到所有进行中的导出运行完成。在过渡窗口期间,两组凭据同时有效。
一旦确认没有进行中的运行在使用旧 HMAC 密钥,就在 GCP 中删除它们。
有关完整详细信息,请参阅轮换目标凭据。
故障排查
| 症状 | 可能原因 | 修复 |
|---|---|---|
创建目标时出现 400 Access denied | HMAC 凭据缺少写入权限 | 验证服务账户在存储桶上具有 storage.objects.create |
400 Key ID you provided does not exist | HMAC access ID 无效 | 在 GCP 中重新生成 HMAC 密钥 |
400 Invalid endpoint | 端点 URL 格式错误 | 精确使用 https://storage.googleapis.com |
| BigQuery 表显示没有行 | 导出尚未完成 | 使用 GET /api/v1/bulk-exports/{export_id} 检查导出状态 |
| BigQuery 分区裁剪不起作用 | 源 URI 前缀不正确 | 确保源 URI 前缀在第一个分区键之前结束,例如 gs://BUCKET/PREFIX |
BigQuery 拾取了 tmp/ 文件 | 文件路径 glob 过于宽泛 | 在文件路径中使用 export_id=* 而非 * |
有关其他错误代码和导出状态详情,请参阅监控和排查批量导出问题。