Skip to main content
LangSmith 提供了一个协作界面,用于创建、测试和迭代提示词。 虽然你可以动态获取提示词在运行时从 LangSmith 拉取到你的应用程序中,但你可能更倾向于将提示词与自己的数据库或版本控制系统同步。为了支持这种工作流程,LangSmith 允许你通过 webhook 接收提示词更新的通知。 为什么要与 GitHub 同步提示词?
  • 版本控制: 在熟悉的系统中,将你的提示词与应用程序代码一起进行版本管理。
  • CI/CD 集成: 当关键提示词发生更改时,触发自动化的预发布或生产环境部署。
提示词 Webhook 示意图

前提条件

在开始之前,请确保你已设置好以下内容:
  1. GitHub 账户: 一个标准的 GitHub 账户。
  2. GitHub 仓库: 创建一个新的(或选择一个现有的)仓库,用于存储你的 LangSmith 提示词清单。这可以是与你的应用程序代码相同的仓库,也可以是专门用于提示词的仓库。
  3. GitHub 个人访问令牌 (PAT):
    • LangSmith webhook 不会直接与 GitHub 交互——它们会调用一个由创建的中间服务器。
    • 此服务器需要一个 GitHub PAT 来进行身份验证并向你的仓库提交代码。
    • 必须包含 repo 范围(对于公共仓库,public_repo 就足够了)。
    • 前往 GitHub > 设置 > 开发者设置 > 个人访问令牌 > 令牌(经典)
    • 点击 生成新令牌(经典)
    • 为其命名(例如 “LangSmith Prompt Sync”),设置过期时间,并选择所需的范围。
    • 点击 生成令牌立即复制它——它不会再次显示。
    • 安全地存储令牌,并将其作为环境变量提供给你的服务器。

理解 LangSmith “提示词提交”和 webhook

在 LangSmith 中,当你保存对提示词的更改时,你实际上是在创建一个新版本或一个“提示词提交”。这些提交可以触发 webhook。 webhook 将发送一个包含新提示词清单的 JSON 负载。
重要的是要理解,用于提示词提交的 LangSmith webhook 通常是在工作区级别触发的。这意味着如果任何在你的 LangSmith 工作区内的提示词被修改并保存了“提示词提交”,webhook 就会触发并发送该提示词的更新清单。负载可以通过提示词 ID 来识别。你的接收服务器在设计时应考虑到这一点。

实现用于接收 webhook 的 FastAPI 服务器

为了在提示词更新时有效处理来自 LangSmith 的 webhook 通知,需要一个中间服务器应用程序。该服务器将充当 LangSmith 发送的 HTTP POST 请求的接收者。在本指南中,我们将概述创建一个简单的 FastAPI 应用程序来履行此职责。 这个公开可访问的服务器将负责:
  1. 接收 Webhook 请求: 监听传入的 HTTP POST 请求。
  2. 解析负载: 从请求体中提取并解释 JSON 格式的提示词清单。
  3. 提交到 GitHub: 以编程方式在你指定的 GitHub 仓库中创建一个新的提交,包含更新后的提示词清单。这确保了你的提示词保持版本控制,并与 LangSmith 中的更改同步。
对于部署,可以使用 Render.com(提供合适的免费套餐)、Vercel、Fly.io 或其他云提供商(AWS、GCP、Azure)等平台来托管 FastAPI 应用程序并获取公共 URL。 服务器的核心功能将包括一个用于接收 webhook 的端点、解析清单的逻辑,以及与 GitHub API 的集成(使用个人访问令牌进行身份验证)来管理提交。
main.py此服务器将监听来自 LangSmith 的传入 webhook,并将接收到的提示词清单提交到你的 GitHub 仓库。
此服务器的关键方面:
  • 配置 (.env): 它期望一个包含你的 GITHUB_TOKENGITHUB_REPO_OWNERGITHUB_REPO_NAME.env 文件。你也可以自定义 GITHUB_FILE_PATH(默认:LangSmith_prompt_manifest.json)和 GITHUB_BRANCH(默认:main)。
  • GitHub 交互: commit_manifest_to_github 函数处理获取当前文件 SHA(用于更新它)然后提交新清单内容的逻辑。
  • Webhook 端点 (/webhook/commit): 这是你的 LangSmith webhook 将指向的 URL 路径。
  • 错误处理: 包含了 GitHub API 交互的基本错误处理。
将此服务器部署到你选择的平台(例如 Render)并记下其公共 URL(例如 https://prompt-commit-webhook.onrender.com)。

在 LangSmith 中配置 webhook

一旦你的 FastAPI 服务器部署完毕并拥有了其公共 URL,你就可以在 LangSmith 中配置 webhook:
  1. 导航到你的 LangSmith 工作区。
  2. 转到 提示词 部分。在这里你将看到你的提示词列表。 LangSmith 提示词部分
  3. 在提示词页面的右上角,点击 + Webhook 按钮。
  4. 你将看到一个用于配置 webhook 的表单: LangSmith Webhook 配置模态框
    • Webhook URL: 输入你部署的 FastAPI 服务器端点的完整公共 URL。对于我们示例服务器,这将是 https://prompt-commit-webhook.onrender.com/webhook/commit
    • Headers (可选):
      • 你可以添加自定义头信息,LangSmith 将在每个 webhook 请求中发送这些信息。
  5. 测试 Webhook: LangSmith 提供了一个“发送测试通知”按钮。使用此按钮向你的服务器发送一个示例负载。检查你的服务器日志(例如在 Render 上)以确保它接收并成功处理了请求(或用于调试任何问题)。
  6. 保存 webhook 配置。

工作流程实际运行

工作流程图显示:用户在 LangSmith 中保存提示词,LangSmith 向 FastAPI 服务器发送 webhook,该服务器与 GitHub 交互以更新文件 现在,一切就绪,以下是发生的过程:
  1. 提示词修改: 用户(开发人员或非技术团队成员)在 LangSmith UI 中修改一个提示词并保存,创建一个新的“提示词提交”。
  2. Webhook 触发: LangSmith 检测到这个新的提示词提交并触发配置的 webhook。
  3. HTTP 请求: LangSmith 向你的 FastAPI 服务器的公共 URL(例如 https://prompt-commit-webhook.onrender.com/webhook/commit)发送一个 HTTP POST 请求。此请求的正文包含整个工作区的 JSON 提示词清单。
  4. 服务器接收负载: 你的 FastAPI 服务器端点接收该请求。
  5. GitHub 提交: 服务器从请求体中解析 JSON 清单。然后,它使用配置的 GitHub 个人访问令牌、仓库所有者、仓库名称、文件路径和分支来:
    • 检查清单文件是否已存在于指定分支的仓库中,以获取其 SHA(这对于更新现有文件是必要的)。
    • 使用最新的提示词清单创建一个新的提交,如果文件已存在则更新它,如果不存在则创建它。提交消息将表明这是来自 LangSmith 的更新。
  6. 确认: 你应该会看到新的提交出现在你的 GitHub 仓库中。 清单已提交到 GitHub
你现在已经成功地将你的 LangSmith 提示词与 GitHub 同步了!

超越简单的提交

我们的示例 FastAPI 服务器执行了整个提示词清单的直接提交。然而,这只是一个起点。你可以扩展服务器的功能以执行更复杂的操作:
  • 细粒度提交: 解析清单,并将更改提交到单个提示词文件,如果你更喜欢在仓库中采用更细粒度的结构。
  • 触发 CI/CD: 除了(或除了)提交之外,让服务器触发一个 CI/CD 流水线(例如 Jenkins、GitHub Actions、GitLab CI)来部署预发布环境、运行测试或构建新的应用程序版本。
  • 更新数据库/缓存: 如果你的应用程序从数据库或缓存加载提示词,则直接更新这些存储。
  • 通知: 向 Slack、电子邮件或其他通信渠道发送有关提示词更改的通知。
  • 选择性处理: 根据 LangSmith 负载中的元数据(如果可用,例如哪个特定提示词被更改或由谁更改),你可以应用不同的逻辑。