Hub documentation

Hướng dẫn Webhook: xây dựng bot Discussion với phản hồi từ LLM

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Hướng dẫn Webhook: xây dựng bot Discussion với phản hồi từ LLM

Dưới đây là hướng dẫn ngắn về cách sử dụng Hugging Face Webhooks để xây dựng một bot trả lời các bình luận trong Discussion trên Hub bằng phản hồi được tạo bởi một LLM do bạn lựa chọn thông qua Hugging Face Inference Providers.

Tạo Webhook của bạn trong hồ sơ người dùng

Đầu tiên, hãy tạo một Webhook từ cài đặt của bạn.

  • Nhập một vài kho mục tiêu mà Webhook của bạn sẽ lắng nghe.
  • Bạn có thể đặt một URL Webhook giả cho hiện tại, nhưng việc định nghĩa webhook của bạn sẽ cho phép bạn xem các sự kiện sẽ được gửi đến nó (và bạn có thể phát lại chúng, điều này sẽ hữu ích cho việc gỡ lỗi).
  • Nhập một bí mật vì cách này sẽ an toàn hơn.
  • Đăng ký các sự kiện Cộng đồng (PR & thảo luận), vì chúng tôi đang xây dựng một bot Thảo luận.

Webhook của bạn sẽ có dạng như sau:

webhook-creation

Tạo hồ sơ người dùng Bot mới

Trong hướng dẫn này, chúng ta tạo một tài khoản người dùng riêng để lưu trữ một Space và đăng bình luận:

discussion-bot-profile

Khi tạo một bot sẽ tương tác với các người dùng khác trên Hub, chúng tôi yêu cầu bạn gắn nhãn rõ ràng cho tài khoản là “Bot” (xem ảnh chụp hồ sơ).

Tạo một Space sẽ phản hồi với Webhook của bạn

Bước thứ ba thực chất là lắng nghe các sự kiện Webhook.

Một cách đơn giản là sử dụng một Space cho việc này. Chúng tôi sử dụng tài khoản người dùng đã tạo, nhưng bạn cũng có thể thực hiện từ tài khoản người dùng chính của mình nếu muốn.

Mã nguồn của Space nằm ở đây.

Chúng tôi đã sử dụng NodeJS và TypeScript để triển khai, nhưng bất kỳ ngôn ngữ hoặc framework nào cũng sẽ hoạt động hiệu quả tương đương. Đọc thêm về Docker Spaces tại đây.

File server.ts chính nằm ở đây

Hãy cùng xem xét những gì xảy ra trong tệp này:

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" });
	}
	...

Ở đây, chúng ta lắng nghe các yêu cầu POST được gửi đến /, sau đó kiểm tra xem header X-Webhook-Secret có bằng với bí mật (secret) mà chúng ta đã định nghĩa trước đó hay không (bạn cũng cần đặt bí mật WEBHOOK_SECRET trong cài đặt của Space để có thể xác minh nó).

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

Payload của sự kiện được mã hóa dưới dạng JSON. Ở đây, chúng ta chỉ định rằng Webhook của chúng ta sẽ chỉ được chạy khi:

  • sự kiện liên quan đến một bình luận thảo luận
  • sự kiện là một sự tạo mới, tức là một bình luận mới đã được đăng
  • nội dung bình luận chứa @discussion-bot, tức là bot của chúng ta vừa được nhắc đến trong một bình luận.

Trong trường hợp đó, chúng ta sẽ tiếp tục sang bước tiếp theo:

	const CHAT_API_URL =
		"https://huggingface.co/proxy/router.huggingface.co/v1/chat/completions";
	const SYSTEM_PROMPT = `You are a helpful bot that replies to discussions about machine learning. Keep your responses concise and friendly.`;

	const response = await fetch(CHAT_API_URL, {
		method: "POST",
		headers: {
			"Authorization": `Bearer ${process.env.HF_TOKEN}`,
			"Content-Type": "application/json",
		},
		body: JSON.stringify({
			model: "moonshotai/Kimi-K2.6",
			messages: [
				{ role: "system", content: SYSTEM_PROMPT },
				{ role: "user", content: req.body.comment.content },
			],
			max_tokens: 500,
		}),
	});
	if (response.ok) {
		const output = await response.json();
		const continuationText = output.choices[0].message.content;
		...

Đây là phần thú vị nhất: sử dụng Hugging Face Inference Providers, chúng ta gọi một mô hình mã mở (moonshotai/Kimi-K2.6) với một system prompt và bình luận của người dùng. Mô hình tạo ra một phản hồi, mà chúng ta trích xuất từ choices[0].message.content.

Bạn có thể chọn bất kỳ model nào từ danh sách các model khả dụng — chỉ cần thay đổi trường model.

Cuối cùng, chúng ta sẽ đăng nó dưới dạng một phản hồi trong cùng một luồng thảo luận:

	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();

Cấu hình Webhook của bạn để gửi các sự kiện đến Space của bạn

Cuối cùng nhưng không kém phần quan trọng, bạn cần cấu hình Webhook của mình để gửi các yêu cầu POST đến Space của bạn.

Trước tiên, hãy lấy “direct URL” của Space từ menu ngữ cảnh. Nhấp vào “Embed this Space” và sao chép “Direct URL”.

embed this Space direct URL

Cập nhật webhook của bạn để gửi yêu cầu đến URL đó:

webhook settings

Kết quả

discussion-result

Update on GitHub