混合 模式将 LangSmith 基础设施分割在 LangChain 的云和您的云之间:
- 控制平面 (LangSmith UI、API 和编排)运行在 LangChain 的云中,由 LangChain 管理。
- 数据平面 (您的 Agent Server 和代理工作负载)运行在您的云中,由您管理。
这将托管界面的便利性与在您自己的环境中运行工作负载的灵活性相结合。
| 组件 | 职责 | 运行位置 | 管理方 |
|---|---|---|---|
| 控制平面 | <ul><li>用于创建部署和修订版本的 UI</li><li>用于管理部署的 API</li><li>可观测性数据存储</li></ul> | LangChain's cloud | LangChain |
| 数据平面 | <ul><li>Operator/listener to reconcile deployments</li><li>Agent Servers (agents/graphs)</li><li>后端服务(Postgres、Redis 等)</li></ul> | Your cloud | You |
在混合模式下运行 LangSmith 时,您使用 LangSmith API 密钥.
工作流程
- 使用
langgraph-clior Studio 在本地测试您的图。 - 使用以下工具构建 Docker 镜像
langgraph buildcommand. - 从以下位置部署您的 Agent Server 控制平面 UI.
架构
计算平台
- Kubernetes:混合支持在任何 Kubernetes 集群上运行数据平面。
到 LangSmith 和控制平面的出口流量
在混合部署模型中,您自托管的数据平面将向控制平面发送网络请求,以轮询需要在该数据平面中实现的更改。来自数据平面部署的追踪也会发送到与控制平面集成的 LangSmith 实例。此到控制平面的流量通过 HTTPS 加密。数据平面使用 LangSmith API 密钥向控制平面进行身份验证。
为了启用此出口流量,您可能需要更新内部防火墙规则或云资源(如安全组)以 允许某些 IP 地址.
Kubernetes 设置
以下步骤描述了如何将您自托管的数据平面连接到托管的 LangSmith 控制平面。
前提条件
1. KEDA 已安装在您的集群上。
helm repo add kedacore https://kedacore.github.io/charts
helm install keda kedacore/keda --namespace keda --create-namespace
- 一个有效的
Ingress控制器已安装在您的集群上。有关为您的部署配置入口的更多信息,请参阅 为安装创建入口。我们强烈建议在生产环境中使用现代的 Gateway API 。 - 如果您计划让监听器监视多个命名空间,您 **MUST** 应使用 Gateway API or an Istio Gateway 而不是 标准入口 资源。标准入口资源只能将流量路由到同一命名空间中的服务,而 Gateway 或 Istio Gateway 可以跨多个命名空间路由流量。
- 您的集群中有多个部署的空间。
Cluster-Autoscaler推荐用于自动配置新节点。 - 您需要启用到两个控制平面 URL 的出口流量。监听器会轮询这些端点以获取部署信息。请使用与您的 LangSmith 区域匹配的配对。
LangSmith 部署控制平面:
LangSmith API:
设置
1. 向我们提供您的 LangSmith 组织 ID。您的 LangSmith 组织将配置为在您的云中部署数据平面。 2. 从 LangSmith UI 创建监听器。该 Listener 数据模型为实际 “监听器”应用程序. 1. 在左侧导航中,选择 Deployments > Listeners. 2. 在页面右上角,选择 + Create Listener. 3. 输入一个唯一的 Compute ID 作为监听器的名称。该 Compute ID 是一个用户定义的标识符,在当前 LangSmith 工作区中的所有监听器中应该是唯一的。该 Compute ID 会在用户创建新部署时显示给最终用户。确保该 Compute ID 为最终用户提供关于其 Agent Server 部署将部署到何处的上下文。例如, Compute ID 可设置为 k8s-cluster-name-dev-01。在此示例中,Kubernetes 集群的名称为 k8s-cluster-name, dev 表示集群保留用于"开发"工作负载,并且 01 是一个数字后缀,用于减少命名冲突。 4. 输入一个或多个 Kubernetes 命名空间。随后,"listener" 应用程序将被配置为部署到这些命名空间中的每一个。 5. 在页面右上角,选择 Submit. 6. 创建 listener 后,复制 listener ID。在 Kubernetes 集群中安装实际的 "listener" 应用程序时(步骤 5),您将使用它。 <aside class="callout"><strong>信息</strong>
重要 从 LangSmith UI 创建 listener 不会在 Kubernetes 集群中安装 "listener" 应用程序。 </aside>
3. A Helm chart 提供了在 Kubernetes 集群中安装必要组件的功能。 - langgraph-dataplane-listener:这是一个监听 LangChain 的 control plane for changes to your deployments and creates/updates downstream CRDs. This is the "listener" 应用程序. - LangGraphPlatform CRD:用于 LangSmith Deployment 的 CRD。这包含管理 LangSmith Deployment 实例的规范。 - langgraph-dataplane-operator:此 operator 处理对您 LangSmith CRD 的更改。 - langgraph-dataplane-redis:Redis 实例由 langgraph-dataplane-listener 用于管理各种任务(主要是创建和删除部署)。 4. 配置您的 langgraph-dataplane-values.yaml file.
config:
langsmithApiKey: "" # API Key of your Workspace
langsmithWorkspaceId: "" # Workspace ID
hostBackendUrl: "https://api.host.langchain.com" # Use the matching regional LangSmith Deployment control plane URL from the table above
smithBackendUrl: "https://api.smith.langchain.com" # Use the matching regional LangSmith API URL from the table above
langgraphListenerId: "" # Listener ID from Step 2f
watchNamespaces: "" # comma-separated list of Kubernetes namespaces that the listener and operator will deploy to
enableLGPDeploymentHealthCheck: true # enable/disable health check step for deployments
ingress:
hostname: "" # specify a hostname that will be configured for all deployments
operator:
enabled: true
createCRDs: true # set this to `false` if the CRD has been previously installed in the current Kubernetes cluster
- config.langsmithApiKey: langgraph-listener 部署使用 langsmithApiKey. - config.langsmithWorkspaceId: langgraph-listener 部署与 LangSmith 工作区中的 Agent Server 部署相关联。换句话说, langgraph-listener 部署只能管理指定 LangSmith 工作区 ID 中的 Agent Server 部署。 - config.langgraphListenerId:除了与 LangSmith 工作区相关联外, langgraph-listener 部署还与一个 listener 相关联。创建新的 Agent Server 部署时,它会自动关联到一个 langgraphListenerId。指定 langgraphListenerId 确保 langgraph-listener 部署只能管理与 langgraphListenerId. - config.watchNamespaces:Kubernetes 命名空间的逗号分隔列表, langgraph-listener 部署将部署到。该列表应与步骤 2d 中指定的命名空间列表相匹配。 - config.enableLGPDeploymentHealthCheck:要禁用 Agent Server 健康检查,请将此设置为 false. - ingress.hostname:作为部署工作流的一部分, langgraph-listener 部署尝试调用 Agent Server 健康检查端点(GET /ok)以验证应用程序是否正确启动。典型设置涉及为 Agent Server 部署创建共享 DNS 记录或域名。这不由 LangSmith 管理。创建后,设置 ingress.hostname 为域名,该域名将用于完成健康检查。 - operator.createCRDs:将此值设置为 false 如果 Kubernetes 集群已有 LangGraphPlatform CRD 已安装。在安装过程中,如果 CRD 已安装,将发生错误。当多个 listener 部署在同一 Kubernetes 集群上时,可能会出现这种情况。 5. 部署 langgraph-dataplane Helm chart。
helm repo add langchain https://langchain-ai.github.io/helm/
helm repo update
helm upgrade -i langgraph-dataplane langchain/langgraph-dataplane --values langgraph-dataplane-values.yaml --wait --debug
6. 如果成功,您将看到三个服务在您的命名空间中启动。
NAME READY STATUS RESTARTS AGE
langgraph-dataplane-listener-6dd4749445-zjmr4 0/1 ContainerCreating 0 26s
langgraph-dataplane-operator-6b88879f9b-t76gk 1/1 Running 0 26s
langgraph-dataplane-redis-0 1/1 Running 0 25s
您的混合基础设施现在已准备好创建部署。
在同一集群中配置其他数据平面
要在同一集群的不同命名空间中创建数据平面,请重复上述步骤并传递一个 -n 选项给 helm upgrade 来指定不同的命名空间。
在同一集群中安装多个数据平面时,遵守以下规则非常重要: 1. 该 config.watchNamespaces 列表不应与其他安装交叉 config.watchNamespaces。例如,如果安装 A 正在监视命名空间 foo,bar,则安装 B 不能监视其中的任何一个 foo or bar。监视同一命名空间的多个运算符或监听器会导致意外行为。这意味着多个 LangSmith 工作区不能部署到同一命名空间!请查看 集群组织 部分以更好地理解这一点。 2. 必须使用 Gateway API or an Istio Gateway。依赖 标准入口 资源可能会与同一集群中其他数据平面创建的 Ingress 对象产生冲突。由于这些情况下的行为取决于具体的入口控制器,这可能导致不可预测或不良后果。
监听器
在混合选项中,一个或多个 “监听器”应用程序 可以根据您的 LangSmith 工作区和 Kubernetes 集群的组织方式运行。
### Kubernetes 集群组织 - 一个或多个监听器可以在 Kubernetes 集群中运行。 - 一个监听器可以部署到该集群中的一个或多个命名空间。 - 多个监听器不能部署到同一命名空间。 - 集群所有者负责规划监听器布局和 Agent Server 部署。
### LangSmith 工作区组织 - 一个工作区可以关联一个或多个监听器。 - 一个监听器只能关联一个工作区。LangSmith 工作区与监听器是一对多关系。 - 一个工作区只能部署到其所有监听器都已部署的 Kubernetes 集群。
使用场景
以下是一些常见的监听器配置(非严格要求):
### 每个 LangSmith 工作区 → 独立的 Kubernetes 集群 - 集群 alpha 运行工作区 A - 集群 beta 运行工作区 B
### 一个集群,每个工作区一个命名空间 - 集群 alpha,命名空间 1 运行工作区 A - 集群 alpha,命名空间 2 运行工作区 B
### 独立集群,共享“开发”集群 - 集群 alpha 运行工作区 A - 集群 beta 运行工作区 B - 集群 dev 运行工作区 A 和 B - 两个工作区各有两个监听器;集群 dev 有两个监听器部署