默认情况下,LangSmith 将运行输入、输出、错误、清单、附加信息和事件存储在 ClickHouse 中。如果您愿意,也可以将这些信息存储在 Blob 存储中,这有几个显著的好处。为了在生产部署中获得最佳效果,我们强烈建议使用 Blob 存储,它提供以下好处:
- 在高追踪环境中,输入、输出、错误、清单、附加信息和事件可能会使数据库大小急剧膨胀。
- 如果使用 LangSmith 托管的 ClickHouse,您可能希望将敏感信息存储在您环境中的 Blob 存储中。为了解决这个问题,LangSmith 支持将运行输入、输出、错误、清单、附加信息、事件和附件存储在外部 Blob 存储系统中。
对于特定云平台的设置,请选择您的平台:有关完整的特定云平台设置和架构指南,请参阅 AWS、GCP 或 Azure。
Azure Blob 存储在 Helm chart 版本 0.8.9 及更高版本中可用。从 Helm chart 版本 0.10.43 开始,Azure 支持删除追踪项目。原生 GCS Blob 存储引擎支持(使用 engine: "GCS")在 Helm chart 版本 0.13.29 及更高版本中可用。对于早期版本,GCS 通过设置 engine: "S3" 并使用 HMAC 凭据,通过 S3 兼容 API 进行支持。
-
访问有效的 Blob 存储服务
-
您的 Blob 存储中的一个存储桶/目录,用于存储数据。我们强烈建议为 LangSmith 数据创建一个单独的存储桶/目录。
- 如果您使用 TTL,您需要设置生命周期策略来删除旧数据。有关更多信息,请参阅配置 TTL。这些策略应与您在 LangSmith 配置中设置的 TTL 保持一致,否则可能会导致数据丢失。有关如何设置生命周期规则,请参阅 Blob 存储的 TTL 配置。
-
允许 LangSmith 服务访问存储桶/目录的凭据
- 您需要向您的 LangSmith 实例提供访问存储桶/目录所需的凭据。有关更多信息,请阅读下面的身份验证部分。
-
如果使用 S3 或 GCS,您的 Blob 存储服务的 API URL
- 这将是 LangSmith 用于访问您的 Blob 存储系统的 URL
- 对于 Amazon S3,这将是 S3 端点的 URL。类似于:
https://s3.amazonaws.com 或 https://s3.us-west-1.amazonaws.com(如果使用区域端点)。
- 对于 Google Cloud Storage,这将是 GCS 端点的 URL。类似于:
https://storage.googleapis.com
身份验证
Amazon S3
要向 Amazon S3 进行身份验证,您需要创建一个 IAM 策略,授予对您的存储桶的以下权限。{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::your-bucket-name",
"arn:aws:s3:::your-bucket-name/*"
]
}
]
}
一旦您有了正确的策略,有三种方式可以向 Amazon S3 进行身份验证:
-
服务账户的 IAM 角色 (IRSA)(推荐):您可以为您的 LangSmith 实例创建一个 IAM 角色,并将策略附加到该角色。这是在生产环境中向 Amazon S3 进行身份验证的推荐方式。
- 您需要创建一个附加了策略的 IAM 角色。
- 您需要允许 LangSmith 服务账户承担该角色。
langsmith-queue、langsmith-backend、langsmith-platform-backend 和 langsmith-ingest-queue 服务账户需要能够承担该角色。
如果您使用自定义发布名称,服务账户名称会有所不同。您可以通过在集群中运行 kubectl get serviceaccounts 来找到服务账户名称。
- 您需要将角色 ARN 提供给 LangSmith。您可以通过在 Helm Chart 安装中为
queue、backend、platform-backend 和 ingest-queue 服务添加 eks.amazonaws.com/role-arn: "<role_arn>" 注解来实现。
-
访问密钥和密钥:您可以向 LangSmith 提供访问密钥和密钥。这是向 Amazon S3 进行身份验证的最简单方式。但是,由于安全性较低,不建议在生产环境中使用。
- 您需要创建一个附加了策略的用户。然后您可以为该用户配置访问密钥和密钥。
-
VPC 端点访问:您可以通过 VPC 端点启用对 S3 存储桶的访问,这允许流量从您的 VPC 安全地流向您的 S3 存储桶。
- 您需要配置一个 VPC 端点,并将其配置为允许访问您的 S3 存储桶。
- 您可以参考我们的公共 Terraform 模块以获取配置此内容的指导和示例。
KMS 加密头支持
从 LangSmith Helm chart 版本 0.11.24 开始,您可以传递 KMS 加密密钥头,并通过提供其 ARN 来强制写入使用特定的 KMS 密钥。要启用此功能,请在 Helm chart 中设置以下值:config:
blobStorage:
kmsEncryptionEnabled: true
kmsKeyArn: <your_kms_key_arn>
Google Cloud Storage
要向 Google Cloud Storage 进行身份验证,您需要创建一个具有访问存储桶所需权限的 service account。您的服务账户需要 Storage Admin 角色或具有等效权限的自定义角色。这可以限定在 LangSmith 将要使用的存储桶范围内。一旦您配置了服务账户,您需要为该服务账户生成一个 HMAC key。此密钥和密钥将用于向 Google Cloud Storage 进行身份验证。从 Helm chart 版本 0.13.29 开始,您可以直接将 Blob 存储引擎设置为 "GCS"。这支持两种身份验证方法:
- GCP 工作负载身份(推荐):将
accessKey 和 accessKeySecret 留空。LangSmith 将使用应用默认凭据。您需要将工作负载身份注解添加到 backend、platform-backend、queue 和 ingest-queue 服务账户。
- HMAC 密钥:将
accessKey 和 accessKeySecret 设置为您的 GCS HMAC 凭据。
对于这两种方法,请将 apiURL 设置为 https://storage.googleapis.com,并将 bucketName 设置为您的 GCS 存储桶名称。对于 0.13.29 之前的 Helm chart 版本,GCS 通过设置 engine: "S3" 并使用 HMAC 凭据,通过 S3 兼容 API 进行支持。 Azure Blob Storage
要向 Azure Blob Storage 进行身份验证,您需要使用以下方法之一授予 LangSmith 工作负载访问您的容器的权限(按优先级列出):
- 存储账户和访问密钥
- 连接字符串
- 工作负载身份(推荐)、托管身份或
DefaultAzureCredential 支持的环境变量。当上述任一选项的配置不存在时,这是默认的身份验证方法。
- 要使用工作负载身份,请将标签
azure.workload.identity/use: true 添加到 queue、backend、platform-backend 和 ingest-queue 部署中。此外,将 azure.workload.identity/client-id 注解添加到相应的服务账户,该注解应为现有 Azure AD 应用程序的客户端 ID 或用户分配的托管身份的客户端 ID。有关更多详细信息,请参阅 Azure 文档。
某些部署可能需要使用服务 URL 覆盖而不是默认服务 URL(https://<storage_account_name>.blob.core.windows.net/)来进一步自定义连接配置。例如,要使用不同的 Blob 存储域(例如政府或中国),此覆盖是必需的。
CH 搜索
默认情况下,LangSmith 仍会将搜索令牌存储在 ClickHouse 中。如果您使用 LangSmith 托管的 Clickhouse,您可能希望禁用此功能,以避免将潜在敏感信息发送到 ClickHouse。您可以在 Blob 存储配置中执行此操作。
创建存储桶并获取必要的凭据后,您可以配置 LangSmith 以使用您的 Blob 存储系统。
config:
blobStorage:
enabled: true
engine: "S3" # 或 "GCS" 或 "Azure"。区分大小写。
chSearchEnabled: true # 如果您想禁用 CH 搜索,请设置为 false(推荐用于 LangSmith 托管的 Clickhouse)
bucketName: "your-bucket-name"
apiURL: "Your connection url"
accessKey: "Your access key" # 可选。仅在使用 S3 访问密钥和密钥时需要
accessKeySecret: "Your access key secret" # 可选。仅在使用访问密钥和密钥时需要
# 以下 Blob 存储配置值适用于 Azure,需要 blobStorage.engine = "Azure"。否则请省略。
azureStorageAccountName: "Your storage account name" # 可选。仅在使用存储账户和访问密钥时需要。
azureStorageAccountKey: "Your storage account access key" # 可选。仅在使用存储账户和访问密钥时需要。
azureStorageContainerName: "your-container-name" # 必需
azureStorageConnectionString: "" # 可选。
azureStorageServiceUrlOverride: "" # 可选
backend: # 可选,仅在 AWS 上使用服务账户的 IAM 角色、GKE 上的工作负载身份或 AKS 上的工作负载身份时需要
deployment: # 仅限 Azure
labels:
azure.workload.identity/use: true
serviceAccount:
annotations:
azure.workload.identity/client-id: "<client_id>" # 仅限 Azure
eks.amazonaws.com/role-arn: "<role_arn>" # 仅限 AWS
iam.gke.io/gcp-service-account: "<gsa_name>@<project_id>.iam.gserviceaccount.com" # 仅限 GCP
platformBackend: # 可选,仅在 AWS 上使用服务账户的 IAM 角色、GKE 上的工作负载身份或 AKS 上的工作负载身份时需要
deployment: # 仅限 Azure
labels:
azure.workload.identity/use: true
serviceAccount:
annotations:
azure.workload.identity/client-id: "<client_id>" # 仅限 Azure
eks.amazonaws.com/role-arn: "<role_arn>" # 仅限 AWS
iam.gke.io/gcp-service-account: "<gsa_name>@<project_id>.iam.gserviceaccount.com" # 仅限 GCP
queue: # 可选,仅在 AWS 上使用服务账户的 IAM 角色、GKE 上的工作负载身份或 AKS 上的工作负载身份时需要
deployment: # 仅限 Azure
labels:
azure.workload.identity/use: true
serviceAccount:
annotations:
azure.workload.identity/client-id: "<client_id>" # 仅限 Azure
eks.amazonaws.com/role-arn: "<role_arn>" # 仅限 AWS
iam.gke.io/gcp-service-account: "<gsa_name>@<project_id>.iam.gserviceaccount.com" # 仅限 GCP
ingestQueue: # 可选,仅在 AWS 上使用服务账户的 IAM 角色、GKE 上的工作负载身份或 AKS 上的工作负载身份时需要
deployment: # 仅限 Azure
labels:
azure.workload.identity/use: true
serviceAccount:
annotations:
azure.workload.identity/client-id: "<client_id>" # 仅限 Azure
eks.amazonaws.com/role-arn: "<role_arn>" # 仅限 AWS
iam.gke.io/gcp-service-account: "<gsa_name>@<project_id>.iam.gserviceaccount.com" # 仅限 GCP
如果使用访问密钥和密钥,您也可以提供一个包含身份验证信息的现有 Kubernetes secret。这比直接在配置中提供访问密钥和密钥更受推荐。有关预期的 secret 密钥,请参阅生成的 secret 模板。
TTL 配置
如果在 LangSmith 中使用 TTL 功能,您还需要为 Blob 存储配置 TTL 规则。存储在 Blob 存储上的追踪信息存储在特定的前缀路径上,该路径决定了数据的 TTL。当追踪的保留期延长时,其对应的 Blob 存储路径会更改,以确保与新的延长保留期匹配。
使用以下 TTL 前缀:
ttl_s/:短期(基础)TTL,配置为 14 天。
ttl_l/:长期(扩展)TTL,默认配置为 400 天。
自定义工作区级别保留前缀
如果您使用工作区级别扩展保留,LangSmith 会将 Blob 数据写入 ttl_XXd/ 形式的前缀,其中 XX 是为该工作区配置的天数。例如,如果工作区配置了 90 天的扩展保留,则该工作区的 Blob 数据将写入 ttl_90d/ 前缀。
您必须为每个在工作区中配置的自定义保留期创建一个生命周期规则。常见示例:
ttl_90d/ — 90 天保留
ttl_180d/ — 180 天保留
ttl_365d/ — 365 天保留
如果缺少针对已配置保留期的生命周期规则,则该前缀下的 Blob 数据将永远不会被自动删除。确保在配置新的工作区保留期时添加匹配的生命周期规则。
例如,如果您有配置了 90 天和 180 天扩展保留的工作区,您需要在默认的 ttl_s 和 ttl_l 规则之外添加以下生命周期规则:
rule {
id = "ttl-90d"
prefix = "ttl_90d/"
enabled = true
expiration {
days = 90
}
}
rule {
id = "ttl-180d"
prefix = "ttl_180d/"
enabled = true
expiration {
days = 180
}
}
lifecycle_rule {
condition {
age = 90
matches_prefix = ["ttl_90d"]
}
action {
type = "Delete"
}
}
lifecycle_rule {
condition {
age = 180
matches_prefix = ["ttl_180d"]
}
action {
type = "Delete"
}
}
rule {
name = "ttl-90d"
enabled = true
type = "Lifecycle"
filters {
prefix_match = ["my-container/ttl_90d"]
blob_types = ["blockBlob"]
}
actions {
base_blob {
delete_after_days_since_creation_greater_than = 90
}
snapshot {
delete_after_days_since_creation_greater_than = 90
}
version {
delete_after_days_since_creation_greater_than = 90
}
}
}
rule {
name = "ttl-180d"
enabled = true
type = "Lifecycle"
filters {
prefix_match = ["my-container/ttl_180d"]
blob_types = ["blockBlob"]
}
actions {
base_blob {
delete_after_days_since_creation_greater_than = 180
}
snapshot {
delete_after_days_since_creation_greater_than = 180
}
version {
delete_after_days_since_creation_greater_than = 180
}
}
}
如果您在 LangSmith 配置中自定义了 TTL,则需要调整 Blob 存储配置中的 TTL 以匹配。
Amazon S3 生命周期规则
如果使用 S3 作为 Blob 存储,您需要设置一个匹配上述前缀的过滤生命周期配置。您可以在 Amazon 文档中找到相关信息。例如,如果您使用 Terraform 管理 S3 存储桶,您将设置如下内容:rule {
id = "short-term-ttl"
prefix = "ttl_s/"
enabled = true
expiration {
days = 14
}
}
rule {
id = "long-term-ttl"
prefix = "ttl_l/"
enabled = true
expiration {
days = 400
}
}
Google Cloud Storage 生命周期规则
您需要为您使用的 GCS 存储桶设置生命周期条件。您可以在 Google 文档中找到相关信息,特别是使用 matchesPrefix。例如,如果您使用 Terraform 管理 GCS 存储桶,您将设置如下内容:lifecycle_rule {
condition {
age = 14
matches_prefix = ["ttl_s"]
}
action {
type = "Delete"
}
}
lifecycle_rule {
condition {
age = 400
matches_prefix = ["ttl_l"]
}
action {
type = "Delete"
}
}
Azure Blob 存储生命周期管理
您需要在容器上配置生命周期管理策略,以使匹配上述前缀的对象过期。例如,如果您使用 Terraform 管理 Blob 存储容器,您将设置如下内容:resource "azurerm_storage_management_policy" "example" {
storage_account_id = "my-storage-account-id"
rule {
name = "base"
enabled = true
type = "Lifecycle"
filters {
prefix_match = ["my-container/ttl_s"]
blob_types = ["blockBlob"]
}
actions {
base_blob {
delete_after_days_since_creation_greater_than = 14
}
snapshot {
delete_after_days_since_creation_greater_than = 14
}
version {
delete_after_days_since_creation_greater_than = 14
}
}
}
rule {
name = "extended"
enabled = true
type = "Lifecycle"
filters {
prefix_match = ["my-container/ttl_l"]
blob_types = ["blockBlob"]
}
actions {
base_blob {
delete_after_days_since_creation_greater_than = 400
}
snapshot {
delete_after_days_since_creation_greater_than = 400
}
version {
delete_after_days_since_creation_greater_than = 400
}
}
}
}
将这些文档连接到 Claude、VSCode 等,通过 MCP 获取实时答案。