LangSmith 可以将追踪数据导出到 Google Cloud Storage (GCS) 存储桶,格式为 Parquet。从那里,您可以将其加载到 BigQuery 作为外部表(在 GCS 中原地查询)或本机表(复制到 BigQuery 存储中)。
本指南涵盖:
- - 为 LangSmith 设置 GCS 存储桶和 HMAC 凭据。
- - 创建批量导出目标位置和导出作业。
- - 将导出的数据加载到 BigQuery。
有关批量导出配置选项的完整详细信息,请参阅 批量导出追踪数据 和 管理批量导出目标位置.
前提条件
- - 您的 LangSmith 中的数据 追踪项目.
- -
gcloud已安装 CLI。(您也可以使用 Google Cloud 控制台进行设置。)
1. 创建 GCS 存储桶
为 LangSmith 导出创建一个专用 GCS 存储桶。使用专用存储桶可以更轻松地授予有限范围的权限,而不会影响其他数据:
gcloud storage buckets create gs://YOUR_BUCKET_NAME \
--location=US \
--uniform-bucket-level-access
选择靠近 BigQuery 数据集的区域,以最大程度地减少延迟并避免跨区域出口费用。
2. 创建服务账号并授予访问权限
创建一个 LangSmith 将用于向 GCS 写入数据的 GCP 服务账号:
gcloud iam service-accounts create langsmith-bulk-export \
--display-name="LangSmith Bulk Export"
授予服务账号对您的存储桶的写入访问权限。所需的最小权限是 storage.objects.create。授予 storage.objects.delete 是可选的,但推荐使用。LangSmith 使用它来清理目标位置验证期间创建的临时测试文件。如果此权限缺失, tmp/ 文件夹可能会留在您的存储桶中。
“存储对象管理员”预定义角色包含所有必需和推荐的权限:
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 密钥:
gcloud storage hmac create \
langsmith-bulk-export@YOUR_PROJECT.iam.gserviceaccount.com
保存输出中的 accessId 和 secret 。您也可以在 GCP 控制台中的 **Cloud Storage → 设置 → 互操作性 → 为服务账号创建密钥**.
4. 创建批量导出目标位置
在 LangSmith 中创建一个指向您的 GCS 存储桶的目标位置。设置 endpoint_url to https://storage.googleapis.com 以使用 GCS S3 兼容 API。
您将需要您的 LangSmith API 密钥 和 工作区 ID.
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 or data/traces。选择任何适合您存储桶布局的值。
LangSmith 通过执行测试写入来验证凭据,然后再保存目标。如果请求返回 400 错误,请参阅 调试目标错误.
保存 id 从响应中;您将在下一步需要它。
临时验证文件
在目标创建期间(和 凭据轮换)期间,LangSmith 会写入一个临时 .txt 文件到 YOUR_PREFIX/tmp/ 来验证写访问权限,然后尝试删除它。删除是尽力而为的:如果服务账号缺少 storage.objects.delete,则不会删除该文件,并且 tmp/ 文件夹将保留在您的存储桶中。
tmp/ 文件夹不会影响导出,但它将包含在广泛的 GCS URI 通配符中(例如, gs://YOUR_BUCKET_NAME/YOUR_PREFIX/*).
5. 创建批量导出任务
创建一个针对特定项目的导出。使用 format_version: v2_beta 以实现 BigQuery 兼容性——它生成 UTC 时区感知的时间戳,BigQuery 可以正确处理。
您将需要项目 ID(session_id),您可以从 **追踪项目** 列表中复制.
一次性导出:
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"
}'
计划(重复)导出:
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"
}'
Snappy 压缩快速且被 BigQuery 广泛支持。有关所有可用选项,请参阅 批量导出追踪数据,包括字段过滤和过滤表达式。
输出文件结构
导出的文件使用 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
路径中的分区列(export_id, tenant_id, session_id, resource, year, month, day)在启用 Hive 分区检测时可用作 BigQuery 中的可查询列。
6. 将数据加载到 BigQuery
BigQuery 提供两种访问导出数据的方式。两种方式都需要先授予 BigQuery 服务账号对您 GCS 存储桶的读取权限。请根据您的需求选择:
- 外部表: 数据保留在 GCS 中,BigQuery 直接在原位置查询。BigQuery 中没有存储费用,但查询性能比原生存储慢。请参阅 所需角色.
- 原生表: 数据被复制到 BigQuery 存储中。查询速度更快,完全支持 BigQuery 功能,但会产生 BigQuery 存储费用。请参阅 所需权限.
创建表
External table
外部表直接从 GCS 查询数据,无需复制到 BigQuery。
1. 在 BigQuery 控制台中,在 **资源管理器** pane. 1. 点击数据集的 **操作** 菜单(三个点)并选择 **创建表**. 1. 在 **源**: - 下设置 **从以下位置创建表** to **Google Cloud Storage**. - 将文件路径设置为 gs://YOUR_BUCKET_NAME/YOUR_PREFIX/export_id=*。使用 export_id=* 将 BigQuery 限定为 Hive 分区导出目录,并排除 tmp/ LangSmith 在目标验证期间写入的文件夹(请参阅 临时验证文件). - 设置 **文件格式** to **Parquet**. 1. 勾选 **源数据分区**,然后: - 设置 **源 URI 前缀** to gs://YOUR_BUCKET_NAME/YOUR_PREFIX. - 设置 **分区推理模式** to **自动推断类型**. 1. 在 **目标**: - 下选择您的项目和数据集。 - 输入表名,例如 langsmith_runs. - 设置 **表类型** to **外部表**. 1. 在 **架构**下,启用 **Auto-detect**. 1. 点击 **创建表**.
分区路径列(export_id, tenant_id, session_id, resource, year, month, day)可作为可查询列使用。在 year, month, or day 上筛选以启用分区剪枝。
Native table
原生表将 Parquet 数据传输到 BigQuery 存储中,以实现完整的查询性能。
- 转到 数据传输页面 在 Google Cloud 控制台中并选择 **+ 创建传输**.
- 对于 **源类型**,选择 **Google Cloud Storage**.
- 输入 **传输名称**。如有必要,您可以随时访问并编辑传输。
- 选择 **计划选项**。如果您不想重复导出,可以选择 **按需** 并手动触发导出。
1. 在 BigQuery 控制台中,在 **资源管理器** pane. 1. 点击数据集的 **操作** 菜单(三个点)并选择 **创建表**. 1. 在 **源**: - 下设置 **从以下位置创建表** to **Google Cloud Storage**. - 设置文件路径为 gs://YOUR_BUCKET_NAME/YOUR_PREFIX/export_id=*。使用 export_id=* 排除了 tmp/ LangSmith 在目标验证期间写入的文件夹(请参阅 临时验证文件). - 设置 **文件格式** to **Parquet**. 1. 勾选 **源数据分区**,然后: - 设置 **源 URI 前缀** to gs://YOUR_BUCKET_NAME/YOUR_PREFIX. - 设置 **分区推断模式** to **自动推断类型**. 1. 在 **目标**: - 下,选择您的项目和数据集。 - 输入表名,例如 langsmith_runs. - 设置 **表类型** to **原生表**. 1. 在 **高级选项**下,设置 **写入偏好** to **仅在为空时写入** 用于新表。 1. 点击 **创建表**.
BigQuery 运行加载作业来复制数据。Hive 分区列作为常规列出现在表中。有关可用的数据列完整列表,请参阅 可导出字段.
凭证轮换
如需轮换 HMAC 密钥而不中断活动中的导出:
- **在 GCP 中为同一服务账号生成新的 HMAC 密钥** 。
- **调用 PATCH 端点** 并提供新凭证:
curl --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 访问 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=* 在文件路径中而不是 * |
有关其他错误代码和导出状态详细信息,请参阅 监控和排查批量导出.