前言

参考官方文档:

架构概述

LangSmith 可以在您控制的云环境中通过 Kubernetes(推荐)或 Docker 运行。

LangSmith 应用程序由几个组件组成,包括 5 个 LangSmith 服务器和 3 个有状态服务:

  • LangSmith 前端
  • LangSmith 后端
  • LangSmith平台后端
  • LangSmith 实验室
  • LangSmith 队列
  • LangSmith ACE(任意代码执行)后端
  • ClickHouse
  • Postgres
  • Redis

img

要访问 LangSmith UI 并发送 API 请求,您需要公开 LangSmith Frontend 服务。根据您的安装方式,这可以是负载均衡器或主机上公开的端口。

存储服务

LangSmith Self-Hosted 默认捆绑所有存储服务。LangSmith 可以配置为使用所有存储服务的外部版本。在生产环境中,我们强烈建议使用外部存储服务。

  • ClickHouse

    • 是一个用于联机分析处理 (OLAP) 的高性能、面向列的 SQL 数据库管理系统 (DBMS)。
    • LangSmith 使用 ClickHouse 作为跟踪和反馈(大容量数据)的主要数据存储。
  • PostgreSQL

    • 是一个功能强大的开源对象关系数据库系统,它使用并扩展了 SQL 语言,并结合了许多可以安全存储和扩展最复杂数据工作负载的功能
    • LangSmith 使用 Postgres 作为事务工作负载和操作数据(除了跟踪和反馈之外的几乎所有数据)的主要数据存储。
  • Redis

    • 是一个功能强大的内存键值数据库,可持久化存储于磁盘上。
    • 通过将数据保存在内存中,Redis 可为缓存等操作提供高性能。
    • LangSmith 使用 Redis 来支持排队/缓存操作。

服务

  • LangSmith前端:
    • 前端使用 Nginx 来提供 LangSmith 的 UI 服务,并将 API 请求路由到其他服务器。
    • 这是应用程序的入口点,也是唯一必须向用户公开的组件。
  • LangSmith后端
    • 后端是 API 请求的主要入口点,负责处理应用程序的大部分业务逻辑。
    • 这包括处理来自前端和 SDK 的请求、准备用于提取的跟踪信息,以及支持 Hub API。
  • LangSmith队列
    • 队列处理传入的跟踪和反馈,以确保它们被异步地提取并保存到跟踪和反馈数据存储中,
    • 处理数据完整性检查并确保成功插入数据存储,处理数据库错误或暂时无法连接到数据库等情况下的重试。
  • LangSmith 平台后端
    • 平台后端是一项内部服务,主要处理身份验证和其他高容量任务。
    • 用户无需直接与此服务交互。
  • LangSmith Playgroun
    • Playground 是一项服务,用于将请求转发到各种 LLM API,以支持 LangSmith Playground 功能。
    • 它还可以用于连接您自己的自定义模型服务器。
  • LangSmith ACE(任意代码执行)后端
    • ACE 后端是一项在安全环境中执行任意代码的服务,用于支持在 LangSmith 中运行自定义代码。

K8s部署LangSmith

本指南将指导您完成将 LangSmith 部署到 Kubernetes 集群的过程。我们将使用 Helm 安装 LangSmith 及其依赖项。

Terraform 模块

官方将发布 Terraform 模块,帮助 LangSmith 配置资源。您可以在官方的公共 Terraform 仓库中找到这些模块。

例如,您可以在modules/aws/langsmith我们公共 Terraform 仓库的文件夹中找到用于创建 AWS 资源的 LangSmith 模块。

前置条件

确保您已准备好以下工具/物品。部分物品标记为可选:

  1. 正常运行并且可以通过kubectl访问的k8s集群,集群应满足以下最低要求
    • 建议至少满足总16C64G的资源
      • 需要根据组织规模/使用情况调整langsmith所有不同服务的资源请求/限制(request/limit)
      • 建议使用集群自动缩放器来根据资源使用情况处理节点的扩缩容
      • 建议设置指标服务,以便可以启用自动扩缩容
      • 必须至少为Clickhouse准备一个node,其最低规格是4C16G
    • k8s集群应存在可用的动态PV
      • 将使用PostgreSQL数据库、Redis缓存和ClickHouse数据库来存储跟踪信息。这些服务需要持久存储。
      • 基础安装假设没有外部数据库,并将尝试在您的集群内安装这些服务。为了实现持久性,我们将尝试为这些服务配置卷。
      • 如果在集群中使用 PV,强烈建议在生产环境中设置备份。
      • 为了获得更佳性能,我们强烈建议使用 SSD 支持的存储类别。我们建议 7000 IOPS 和 1000 MiB/s 的吞吐量。
      • 在 EKS 上,您可能需要确保已ebs-csi-driver安装并配置动态配置。有关更多信息,请参阅EBS CSI 驱动程序文档。

您可以通过运行以下命令来验证这一点:

1
kubectl get storageclass

输出应显示至少一个存储类,其配置器支持动态配置。例如:

1
2
NAME            PROVISIONER                 RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
gp2 (default) ebs.csi.eks.amazonaws.com Delete WaitForFirstConsumer true 161d

我们强烈建议使用支持卷扩展的存储类。

这是因为跟踪可能需要大量磁盘空间,并且您的卷可能需要随着时间的推移调整大小。

有关存储类的更多信息,请参阅Kubernetes 文档。

  1. Helm

  2. LangSmith 许可证密钥

    • 您可以从您的 Langchain 代表处获取此信息。如需了解更多信息,请联系sales@langchain.dev 。
  3. Api Key Salt

    • 这是您可以生成的密钥。它应该是一串随机字符。

    • 您可以使用以下命令生成它:

1
openssl rand -base64 32
  1. JWT Secret(可选,但用于基本身份验证)

    • 这是您可以生成的密钥。它应该是一串随机字符。

    • 您可以使用以下命令生成它:

1
openssl rand -base64 32
  1. 出口至https://beacon.langchain.com(如果不是在离线模式下运行)

  2. 配置

    • langsmith_config.yaml文件中存在多个配置选项,更多信息可以参考:“配置”

    • 如果您是 Kubernetes 或 Helm 的新手,我们建议您从 Helm Chart 存储库的示例目录中的示例配置之一开始:LangSmith helm chart examples

    • 您可以在 Helm Chart 存储库文件中的values.yaml文件里,查看配置选项的完整列表: LangSmith Helm Chart

配置helm Charts

  1. 使用上一步中的配置,创建一个新的文件:langsmith_config.yaml
  2. 您至少需要设置以下配置选项(使用基本身份验证)
1
2
3
4
5
6
7
8
9
config:
langsmithLicenseKey: "<your license key>"
apiKeySalt: "<your api key salt>"
authType: mixed
basicAuth:
enabled: true
initialOrgAdminEmail: "admin@langchain.dev" # Change this to your admin email address
initialOrgAdminPassword: "secure-password" # Must be at least 12 characters long and have at least one lowercase, uppercase, and symbol
jwtSecret: <your jwt salt> # A random string of characters used to sign JWT tokens for basic auth.

部署到K8s集群

  1. 验证您是否可以连接到 Kubernetes 集群(注意:我们强烈建议安装到空的命名空间)
    • 执行kubectl get pods,输出应该类似于:
1
2
kubectl get pods                                                                                                                                                                     ⎈ langsmith-eks-2vauP7wf 21:07:46
No resources found in default namespace.

命名空间

如果您使用的命名空间不是默认命名空间,则需要使用标志在helm和命令中指定命名空间。kubectl-n <namespace>

  1. 确保已添加 Langchain Helm repo。(如果使用本地图表,请跳过此步骤)
1
2
helm repo add langchain https://langchain-ai.github.io/helm/
"langchain" has been added to your repositories
  1. 查找 Chart 的最新版本。您可以在Helm Chart 存储库中找到可用的版本。

    • 通常建议使用最新版本。

    • 你也可以运行helm search repo langchain/langsmith --versions来查看可用的版本。输出将如下所示:

1
2
3
4
5
langchain/langsmith                      0.10.52              0.10.132           Helm chart to deploy the langsmith application ...
langchain/langsmith 0.10.51 0.10.129 Helm chart to deploy the langsmith application ...
langchain/langsmith 0.10.50 0.10.125 Helm chart to deploy the langsmith application ...
langchain/langsmith 0.10.49 0.10.125 Helm chart to deploy the langsmith application ...
langchain/langsmith 0.10.48 0.10.124 Helm chart to deploy the langsmith application ...
  1. 执行helm install langsmith langchain/langsmith --values langsmith_config.yaml --version <version> -n <namespace> --wait --debug

    • 替换<namespace>为您要部署 LangSmith 的命名空间。

    • 替换<version>为上一步中要安装的 LangSmith 版本。大多数用户应该安装最新版本。

helm install命令运行并成功完成后,您应该看到类似如下的输出:

1
2
3
4
5
6
NAME: langsmith
LAST DEPLOYED: Fri Sep 17 21:08:47 2021
NAMESPACE: langsmith
STATUS: deployed
REVISION: 1
TEST SUITE: None

这可能需要几分钟才能完成,因为它将创建几个 Kubernetes 资源并运行几个作业来初始化数据库和其他服务。

  1. 运行kubectl get pods 输出现在看起来应该是这样的(请注意,确切的 pod 名称可能会根据您使用的版本和配置而有所不同):
1
2
3
4
5
6
7
langsmith-backend-6ff46c99c4-wz22d       1/1     Running   0          3h2m
langsmith-frontend-6bbb94c5df-8xrlr 1/1 Running 0 3h2m
langsmith-hub-backend-5cc68c888c-vppjj 1/1 Running 0 3h2m
langsmith-playground-6d95fd8dc6-x2d9b 1/1 Running 0 3h2m
langsmith-postgres-0 1/1 Running 0 9h
langsmith-queue-5898b9d566-tv6q8 1/1 Running 0 3h2m
langsmith-redis-0 1/1 Running 0 9h

验证部署

  1. 执行kubectl get services,输出应该类似于:
1
2
3
4
5
6
7
NAME                    TYPE           CLUSTER-IP       EXTERNAL-IP                                                               PORT(S)        AGE
langsmith-backend ClusterIP 172.20.140.77 <none> 1984/TCP 35h
langsmith-frontend LoadBalancer 172.20.253.251 <external ip> 80:31591/TCP 35h
langsmith-hub-backend ClusterIP 172.20.112.234 <none> 1985/TCP 35h
langsmith-playground ClusterIP 172.20.153.194 <none> 3001/TCP 9h
langsmith-postgres ClusterIP 172.20.244.82 <none> 5432/TCP 35h
langsmith-redis ClusterIP 172.20.81.217 <none> 6379/TCP 35h
  1. Curl 服务langsmith-frontend的外部ip:
1
2
curl <external ip>/api/tenants
[{"id":"00000000-0000-0000-0000-000000000000","has_waitlist_access":true,"created_at":"2023-09-13T18:25:10.488407","display_name":"Personal","config":{"is_personal":true,"max_identities":1},"tenant_handle":"default"}]%
  1. 在浏览器上访问langsmith-frontend服务的外部 IP

LangSmith 的 UI 应该是可见的/可操作的

img

使用LangSmith

现在LangSmith正在运行,您可以开始使用它来跟踪您的代码。您可以在自托管使用指南中找到有关如何使用自托管LangSmith的更多信息。

您的 LangSmith 实例现在正在运行,但可能尚未完全设置。

如果您使用了其中一个基本配置,您将为您创建一个默认的管理员用户帐户。您可以使用在langsmith_gonfig.yaml文件中指定的电子邮件地址和密码登录。

下一步,强烈建议您与基础设施管理员合作:

  • 为您的 LangSmith 实例设置 DNS 以便更轻松地访问
  • 配置 SSL 以确保提交给 LangSmith 的跟踪在传输过程中加密
  • 使用单点登录配置LangSmith以保护您的LangSmith实例
  • 将 LangSmith 连接到外部 Postgres 和 Redis 实例