Hub 文档

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

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

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

Webhook 现在已公开可用!

这是一份简短指南,介绍如何使用 Hugging Face Webhook 构建一个机器人,该机器人使用免费的 Inference API,以 BLOOM(一种多语言语言模型)生成的回复来回复 Hub 上的讨论评论。

在你的用户个人资料中创建 Webhook

首先,让我们从你的 设置中创建一个 Webhook。

  • 输入你的 Webhook 将监听的一些目标仓库。
  • 你现在可以输入一个虚拟的 Webhook URL,但是定义你的 webhook 将让你查看将发送给它的事件(你可以重放它们,这对于调试很有用)。
  • 输入一个密钥,因为它会更安全。
  • 订阅社区(PR 和讨论)事件,因为我们正在构建一个讨论机器人。

你的 Webhook 将看起来像这样

webhook-creation

创建一个新的 Bot 用户个人资料

在本指南中,我们创建一个单独的用户帐户来托管 Space 并发布评论

discussion-bot-profile

当创建一个将与 Hub 上的其他用户互动的机器人时,我们要求你清楚地将帐户标记为“Bot”(请参阅个人资料屏幕截图)。

创建一个将对你的 Webhook 做出反应的 Space

第三个步骤实际上是监听 Webhook 事件。

一种简单的方法是为此使用 Space。我们使用了我们创建的用户帐户,但如果你愿意,也可以从你的主用户帐户执行此操作。

Space 的代码在这里

我们使用 NodeJS 和 Typescript 来实现它,但任何语言或框架都可以同样出色地工作。在此处阅读有关 Docker Spaces 的更多信息here

主要的 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。在这里,我们指定仅在以下情况下运行我们的 Webhook:

  • 事件涉及讨论评论
  • 事件是创建,即已发布新评论
  • 评论的内容包含 @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 模型调用 Inference 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 的“直接 URL”。单击“嵌入此 Space”并复制“直接 URL”。

embed this Space direct URL

更新你的 webhook 以将请求发送到该 URL

webhook settings

结果

discussion-result

< > 在 GitHub 上更新