跳到主要内容

Webhook 指南:基于 BLOOM 构建讨论机器人

提示

Webhook 现已对所有用户开放!

本指南演示如何使用 Hugging Face Webhook 构建一个机器人。当 Hub 的讨论中有人发表评论时,机器人会调用 BLOOM(多语言语言模型)的免费推理 API,自动生成回复。

在个人资料中创建 Webhook

首先,在Webhook 设置页面创建一个 Webhook。

  • 输入若干目标仓库,Webhook 将监听这些仓库。
  • 先填一个占位的目标 URL;这样可以查看将发送的事件,并可重放(调试非常有用)。
  • 设置密钥以增强安全性。
  • 订阅社区事件(PR 与讨论),因为我们要构建讨论机器人。

Webhook 设置如下所示:

webhook-creation

创建新的“Bot”用户

本示例中,我们创建一个独立的用户账号,既用于托管 Space,也用于发布评论:

discussion-bot-profile

提示

如果机器人要在 Hub 上与其他用户交互,请清晰地将账号标注为 “Bot”(见上图)。

创建响应 Webhook 的 Space

第三步是监听 Webhook 事件。

最简单的方式是使用 Space。我们使用刚创建的机器人账号,你也可以使用主账号。

Space 代码位于这里

我们用 NodeJS 与 TypeScript 实现,但你也可以使用任意语言或框架。更多 Docker Space 信息请阅读文档

主要的 server.ts 文件在这里

我们逐段说明此文件的运行流程:

app.post("/", async (req, res) => {
if (req.header("X-Webhook-Secret") !== process.env.WEBHOOK_SECRET) {
console.error("incorrect secret");
return res.status(400).json({ error: "incorrect secret" });
}
...

此处监听指向 / 的 POST 请求,并检查 X-Webhook-Secret 头是否与之前设置的密钥一致(需在 Space 设置中配置 WEBHOOK_SECRET)。

	const event = req.body.event;
if (
event.action === "create" &&
event.scope === "discussion.comment" &&
req.body.comment.content.includes(BOT_USERNAME)
) {
...

事件负载为 JSON。我们指定只在以下情况触发机器人:

  • 事件为讨论评论
  • 动作为“创建”,即新增评论
  • 评论内容包含 @discussion-bot,即机器人被提及

满足条件后进入下一步:

	const INFERENCE_URL =
"https://api-inference.huggingface.co/models/bigscience/bloom";
const PROMPT = `Pretend that you are a bot that replies to discussions about machine learning, and reply to the following comment:\n`;

const response = await fetch(INFERENCE_URL, {
method: "POST",
body: JSON.stringify({ inputs: PROMPT + req.body.comment.content }),
});
if (response.ok) {
const output = await response.json();
const continuationText = output[0].generated_text.replace(
PROMPT + req.body.comment.content,
""
);
...

这是最有趣的部分:我们向 BLOOM 的推理 API 发起调用,传入 PROMPT,得到模型生成的续写文本。

最后,将生成的内容作为回复发布到同一讨论中:

	const commentUrl = req.body.discussion.url.api + "/comment";

const commentApiResponse = await fetch(commentUrl, {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.HF_TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ comment: continuationText }),
});

const apiOutput = await commentApiResponse.json();

将 Webhook 与 Space 对接

最后,需要将 Webhook 的 POST 请求指向你的 Space。

先在 Space 的上下文菜单中获取 “Direct URL”。点击 “Embed this Space”,复制 “Direct URL”。

embed this Space direct URL

将 Webhook 的目标 URL 更新为该地址:

webhook settings

效果

discussion-result