以编程方式使用文档

LangSmith 使用 PostgreSQL 数据库作为事务工作负载和操作数据(除运行外的几乎所有内容)的主要数据存储。默认情况下,LangSmith 自托管将使用内部 PostgreSQL 数据库。但是,您可以将 LangSmith 配置为使用外部 PostgreSQL 数据库。通过配置外部 PostgreSQL 数据库,您可以更轻松地管理数据库的备份、扩展和其他运维任务。

要求

  • * 一个已配置的 PostgreSQL 数据库,您的 LangSmith 实例可以访问该数据库的网络。我们推荐使用托管 PostgreSQL 服务,例如:
  • * Amazon RDS
  • * Google Cloud SQL
  • * Azure Database for PostgreSQL
  • * 注意:我们仅正式支持 PostgreSQL 版本 >= 14。
  • * 我们支持密码和 IAM/Workload Identity authentication.
  • * 一个拥有 PostgreSQL 数据库管理员权限的用户。该用户将用于创建必要的表、索引和模式。
  • * This user will also need to have the ability to create extensions in the database. We use/will try to install the btree_gin, btree_gist, pgcrypto, citext, ltree,以及 pg_trgm extensions.
  • * 如果使用 public 以外的模式,请确保没有其他已启用扩展的模式,否则必须将其包含在您的搜索路径中。
  • * 对 pgbouncer 和其他连接池的支持基于社区。社区成员报告称 pgbouncer 已与 pool_mode = session 和适合的 ignore_startup_parameters 设置一起使用(截至撰写本文时, search_pathlock_timeout 需要被忽略)。需要注意避免污染连接池;建议具备一定 PostgreSQL 专业知识。LangChain Inc 目前没有对 pgbouncer 或 Amazon RDS Proxy 或任何其他连接池进行正式测试或商业支持的路线图计划,但欢迎社区通过 GitHub issues 进行讨论和协作支持。
  • * 默认情况下,我们推荐使用具有 **至少 2 个 vCPU 和 8GB 内存的实例**。但是,实际需求将取决于您的工作负载和用户数量。我们建议监控您的 PostgreSQL 实例并根据需要进行扩展。

连接字符串

您需要提供 PostgreSQL 数据库的连接字符串。此连接字符串应包含以下信息:

  • * 主机
  • * 端口
  • * 数据库
  • * 用户名
  • * 密码(如果有任何特殊字符,请务必对其进行 URL 编码)- **Note:** 使用 IAM 身份验证时,连接字符串中不需要密码。详见下文。
  • * URL 参数

形式如下:

username:password@host:port/database?<url_params>

连接字符串示例可能如下:

myuser:mypassword@myhost:5432/mydatabase?sslmode=disable

如果没有 URL 参数,连接字符串将如下所示:

myuser:mypassword@myhost:5432/mydatabase

对于 IAM 身份验证,请省略密码并使用身份名称作为用户名:

my-workload-identity@myhost:5432/mydatabase?sslmode=require

配置

拿到连接字符串后,您可以将 LangSmith 实例配置为使用外部 PostgreSQL 数据库。您可以通过修改 values 文件来执行此操作,适用于您的 LangSmith Helm Chart 安装或 .env 文件适用于您的 Docker 安装。

postgres:
  external:
    enabled: true
    connectionUrl: "Your connection url"
# In your .env file
POSTGRES_DATABASE_URI="Your connection url"

配置完成后,您应该能够重新安装您的 LangSmith 实例。如果一切配置正确,您的 LangSmith 实例现在应该正在使用您的外部 PostgreSQL 数据库。

PostgreSQL 的 TLS

Use this section to configure TLS for PostgreSQL connections. For mounting internal/public CAs so LangSmith trusts your PostgreSQL server certificate, see 配置自定义 TLS 证书.

服务器 TLS(单向)

要验证 PostgreSQL 服务器证书:

  • - 使用以下方式提供 CA 证书包 config.customCa.secretNameconfig.customCa.secretKey.
  • - 使用 sslmode=require or sslmode=verify-full以及 sslrootcert=system 添加到您的连接 URL。
config:
  customCa:
    secretName: "langsmith-custom-ca"  # Secret containing your CA bundle
    secretKey: "ca.crt"    # Key in the Secret with the CA bundle
postgres:
  external:
    enabled: true
    connectionUrl: "myuser:mypassword@myhost:5432/mydatabase?sslmode=verify-full&sslrootcert=system"
    customTls: true
apiVersion: v1
kind: Secret
metadata:
  name: langsmith-custom-ca
type: Opaque
stringData:
  ca.crt: |
    -----BEGIN CERTIFICATE-----

    -----END CERTIFICATE-----

带有客户端身份验证的相互 TLS(mTLS)

从 LangSmith helm chart 版本 **0.12.29**开始,我们支持 PostgreSQL 客户端的 mTLS。对于 mTLS 中的服务器端身份验证,除了以下客户端证书配置外,还请使用 服务器 TLS 步骤 (自定义 CA)。

如果您的 PostgreSQL 服务器需要客户端证书身份验证:

  • - 使用您的客户端证书和密钥提供一个 Secret。
  • - 通过以下方式引用它 postgres.external.clientCert.secretName 并使用以下方式指定密钥 certSecretKeykeySecretKey.
  • - 使用 sslmode=verify-fullsslrootcert=system 在您的连接 URL 中。
postgres:
  external:
    enabled: true
    connectionUrl: "myuser:mypassword@myhost:5432/mydatabase?sslmode=verify-full&sslrootcert=system"
    customTls: true
    clientCert:
      secretName: "postgres-mtls-secret"
      certSecretKey: "tls.crt"
      keySecretKey: "tls.key"
apiVersion: v1
kind: Secret
metadata:
  name: postgres-mtls-secret
type: Opaque
stringData:
  tls.crt: |
    -----BEGIN CERTIFICATE-----

    -----END CERTIFICATE-----
  tls.key: |
    -----BEGIN PRIVATE KEY-----

    -----END PRIVATE KEY-----

证书卷的 Pod 安全上下文

为 mTLS 挂载的证书卷受文件访问限制保护。为了确保所有 LangSmith Pod 都能读取证书文件,您必须在 Pod 安全上下文中设置 fsGroup: 1000

您可以通过以下两种方式之一进行配置:

**选项 1:使用 commonPodSecurityContext**

在顶层设置 fsGroup 以将其应用到所有 Pod:

commonPodSecurityContext:
  fsGroup: 1000

选项 2:添加到各个 Pod 的安全上下文

如果您需要更精细的控制,请将 fsGroup 添加到每个 Pod 的安全上下文中。请参阅 mTLS 配置示例 以获取完整参考。

IAM 身份验证

从 LangSmith helm chart 版本 **0.12.34**开始,我们支持 PostgreSQL 的 IAM 身份验证。这允许您使用云提供商的 workload identity 而不是静态密码。

AWS

Amazon RDS IAM 身份验证

Amazon RDS 支持 IAM 数据库身份验证,这允许您使用 AWS IAM 凭证而不是数据库密码对 PostgreSQL 实例进行身份验证。

前提条件

  1. **配置工作负载身份** 在您的 Kubernetes 集群中使用 AWS IRSA or EKS Pod Identity
  2. **启用 IAM 身份验证** 在您的 RDS PostgreSQL 实例上,并授予对您的工作负载身份的访问权限

配置

设置 iamAuthProvider to "aws" 并提供 IAM 兼容的连接字符串(无密码):

postgres:
  external:
    enabled: true
    existingSecretName: "postgres-secret"
    iamAuthProvider: "aws"
apiVersion: v1
kind: Secret
metadata:
  name: postgres-secret
type: Opaque
stringData:
  # IAM connection URL - note no password, username is the IAM identity name
  connection_url: "<iam-identity-name>@<rds-host>:5432/<database>?sslmode=require"

必需的注解

您必须将 AWS IRSA 要求的 ServiceAccount 注解应用到所有连接到 PostgreSQL 的 LangSmith 组件:

Deployments: backend, queue, platformBackend, hostBackend, ingestQueue

Jobs: migrations, authBootstrap, feedbackConfigMigration, feedbackDataMigration, e2eTest

后端服务配置示例:

backend:
  serviceAccount:
    annotations:
      eks.amazonaws.com/role-arn: "arn:aws:iam::<account-id>:role/<role-name>"

queue:
  serviceAccount:
    annotations:
      eks.amazonaws.com/role-arn: "arn:aws:iam::<account-id>:role/<role-name>"

platformBackend:
  serviceAccount:
    annotations:
      eks.amazonaws.com/role-arn: "arn:aws:iam::<account-id>:role/<role-name>"

hostBackend:
  serviceAccount:
    annotations:
      eks.amazonaws.com/role-arn: "arn:aws:iam::<account-id>:role/<role-name>"

ingestQueue:
  serviceAccount:
    annotations:
      eks.amazonaws.com/role-arn: "arn:aws:iam::<account-id>:role/<role-name>"

请参阅 Helm values 参考 以获取可配置服务的完整列表。

GCP

Cloud SQL IAM 身份验证

Cloud SQL 支持 IAM 身份验证,这允许您使用 GCP 服务账户而不是数据库密码进行身份验证。

前提条件

  1. **配置工作负载身份** 在您的 Kubernetes 集群中使用 GCP Workload Identity
  2. **启用 IAM 身份验证** 在您的 Cloud SQL 实例上,并授予对您的工作负载身份的访问权限

配置

设置 iamAuthProvider to "gcp" 并提供 IAM 兼容的连接字符串(无密码):

postgres:
  external:
    enabled: true
    existingSecretName: "postgres-secret"
    iamAuthProvider: "gcp"
apiVersion: v1
kind: Secret
metadata:
  name: postgres-secret
type: Opaque
stringData:
  # IAM connection URL - note no password, username is the service account email
  connection_url: "<service-account>@<project>.iam@<cloud-sql-host>:5432/<database>?sslmode=require"

必需的注解

您必须将 GCP Workload Identity 要求的 ServiceAccount 注解应用到所有连接到 PostgreSQL 的 LangSmith 组件:

Deployments: backend, queue, platformBackend, hostBackend, ingestQueue

Jobs: migrations, authBootstrap, feedbackConfigMigration, feedbackDataMigration, e2eTest

后端服务配置示例:

backend:
  serviceAccount:
    annotations:
      iam.gke.io/gcp-service-account: "<service-account>@<project>.iam.gserviceaccount.com"

queue:
  serviceAccount:
    annotations:
      iam.gke.io/gcp-service-account: "<service-account>@<project>.iam.gserviceaccount.com"

platformBackend:
  serviceAccount:
    annotations:
      iam.gke.io/gcp-service-account: "<service-account>@<project>.iam.gserviceaccount.com"

hostBackend:
  serviceAccount:
    annotations:
      iam.gke.io/gcp-service-account: "<service-account>@<project>.iam.gserviceaccount.com"

ingestQueue:
  serviceAccount:
    annotations:
      iam.gke.io/gcp-service-account: "<service-account>@<project>.iam.gserviceaccount.com"

请参阅 Helm 值参考 获取可配置服务的完整列表。

Azure

支持 Microsoft Entra 身份验证的 Azure Database for PostgreSQL

Azure Database for PostgreSQL 支持 Microsoft Entra 身份验证,这允许您使用 Azure 托管标识进行身份验证,而非数据库密码。

前提条件

  1. **在工作负载标识中配置** 在 Kubernetes 集群中使用 Azure Workload Identity
  2. **启用 Microsoft Entra 身份验证** 在 Azure Database for PostgreSQL 实例上启用 Microsoft Entra 身份验证,并向您的工作负载标识授予访问权限

配置

设置 iamAuthProvider to "azure" 并提供 IAM 兼容的连接字符串(不含密码):

postgres:
  external:
    enabled: true
    existingSecretName: "postgres-secret"
    iamAuthProvider: "azure"
apiVersion: v1
kind: Secret
metadata:
  name: postgres-secret
type: Opaque
stringData:
  # IAM connection URL - note no password, username is the managed identity name
  connection_url: "<managed-identity-name>@<azure-postgres-host>:5432/<database>?sslmode=require"

必需的注解

您必须将 Azure Workload Identity 所需的 ServiceAccount 注解和 Pod 标签应用到所有连接到 PostgreSQL 的 LangSmith 组件:

Deployments: backend, queue, platformBackend, hostBackend, ingestQueue

Jobs: migrations, authBootstrap, feedbackConfigMigration, feedbackDataMigration, e2eTest

后端服务配置示例:

backend:
  serviceAccount:
    annotations:
      azure.workload.identity/client-id: "<managed-identity-client-id>"
  deployment:
    labels:
      azure.workload.identity/use: "true"
  migrations:
    labels:
      azure.workload.identity/use: "true"

queue:
  serviceAccount:
    annotations:
      azure.workload.identity/client-id: "<managed-identity-client-id>"
  deployment:
    labels:
      azure.workload.identity/use: "true"

platformBackend:
  serviceAccount:
    annotations:
      azure.workload.identity/client-id: "<managed-identity-client-id>"
  deployment:
    labels:
      azure.workload.identity/use: "true"

hostBackend:
  serviceAccount:
    annotations:
      azure.workload.identity/client-id: "<managed-identity-client-id>"
  deployment:
    labels:
      azure.workload.identity/use: "true"

ingestQueue:
  serviceAccount:
    annotations:
      azure.workload.identity/client-id: "<managed-identity-client-id>"
  deployment:
    labels:
      azure.workload.identity/use: "true"

请参阅 Helm 值参考 获取可配置服务的完整列表。