@davidmytton
Bảo vệ các điểm cuối hoàn thành và trò chuyện AI khỏi bị lạm dụng — phát hiện các nỗ lực chèn và bẻ khóa kịp thời, chặn PII và thông tin nhạy cảm khỏi bị rò rỉ trong các phản hồi, đồng thời thực thi các giới hạn ngân sách mã thông báo để kiểm soát chi phí. Sử dụng kỹ năng này khi người dùng đang xây dựng hoặc bảo mật bất kỳ điểm cuối nào xử lý lời nhắc của người dùng bằng LLM, ngay cả khi họ mô tả nó là "ngăn chặn bẻ khóa", "ngăn chặn các cuộc tấn công nhanh chóng", "chặn dữ liệu nhạy cảm" hoặc "kiểm soát chi phí API AI" thay vì nêu tên các biện pháp bảo vệ cụ thể.
---
Tên: add-ai-bảo vệ
giấy phép: Apache-2.0
Mô tả: Bảo vệ các điểm cuối hoàn thành và trò chuyện AI khỏi bị lạm dụng — phát hiện các nỗ lực chèn và bẻ khóa kịp thời, chặn PII và thông tin nhạy cảm khỏi bị rò rỉ trong các phản hồi, đồng thời thực thi các giới hạn ngân sách mã thông báo để kiểm soát chi phí. Sử dụng kỹ năng này khi người dùng đang xây dựng hoặc bảo mật bất kỳ điểm cuối nào xử lý lời nhắc của người dùng bằng LLM, ngay cả khi họ mô tả nó là "ngăn chặn bẻ khóa", "ngăn chặn các cuộc tấn công nhanh chóng", "chặn dữ liệu nhạy cảm" hoặc "kiểm soát chi phí API AI" thay vì nêu tên các biện pháp bảo vệ cụ thể.
siêu dữ liệu:
mẫu đường dẫn:
- "ứng dụng/api/trò chuyện/**"
- "ứng dụng/api/hoàn thành/**"
- "src/app/api/chat/**"
- "src/app/api/hoàn thành/**"
- "**/trò chuyện/**"
- "**/ai/**"
- "**/llm/**"
- "**/api/tạo*"
- "**/api/trò chuyện*"
- "**/api/hoàn thành*"
mẫu nhập khẩu:
- "ai"
- "@ai-sdk/*"
- "mở"
- "@anthropic-ai/sdk"
- "chuỗi lang"
dấu nhắc:
cụm từ:
- "tiêm nhanh"
- "pii"
- "thông tin nhạy cảm"
- "bảo mật ai"
- "Tôi sẽ bảo mật"
bất kỳ:
- "bảo vệ ai"
- "chặn pii"
- "phát hiện tiêm"
- "ngân sách mã thông báo"
---
# Thêm bảo mật dành riêng cho AI với Arcjet
Bảo mật các điểm cuối AI/LLM bằng khả năng bảo vệ theo lớp: phát hiện tiêm nhanh chóng, chặn PII và giới hạn ngân sách mã thông báo. Các biện pháp bảo vệ này phối hợp với nhau để ngăn chặn hành vi lạm dụng trước khi nó tiếp cận mô hình của bạn, tiết kiệm ngân sách AI và bảo vệ dữ liệu người dùng.
## Tham khảo
Đọc https://docs.arcjet.com/llms.txt để biết tài liệu SDK toàn diện bao gồm tất cả các khung, loại quy tắc và tùy chọn cấu hình.
Các quy tắc Arcjet chạy **trước** yêu cầu đến mô hình AI của bạn — chặn việc đưa thông tin nhắc nhở, rò rỉ PII, lạm dụng chi phí và quét bot ở lớp HTTP.
## Bước 1: Đảm bảo Arcjet đã được thiết lập
Kiểm tra ứng dụng khách Arcjet được chia sẻ hiện có (xem `/arcjet:protect-route` để biết thiết lập đầy đủ). Nếu không tồn tại, trước tiên hãy thiết lập một quy tắc với `shield()` làm quy tắc cơ bản. Người dùng sẽ cần đăng ký tài khoản Arcjet tại https://app.arcjet.com sau đó sử dụng `ARCJET_KEY` trong các biến môi trường của họ.
## Bước 2: Thêm quy tắc bảo vệ AI
Điểm cuối AI phải kết hợp các quy tắc này trên phiên bản dùng chung bằng cách sử dụng `withRule()`:
### Phát hiện tiêm nhanh chóng
Phát hiện các bản bẻ khóa, thoát nhập vai và ghi đè hướng dẫn.
- JS: `detectPromptInjection()` — chuyển tin nhắn của người dùng qua tham số `detectPromptInjectionMessage` tại thời điểm `protect()`
- Python: `detect_prompt_injection()` — truyền qua tham số `detect_prompt_injection_message`
Chặn các lời nhắc thù địch **trước khi** chúng tiếp cận mô hình. Điều này tiết kiệm ngân sách AI bằng cách từ chối các cuộc tấn công sớm.
### Thông tin nhạy cảm / Chặn PII
Ngăn chặn thông tin nhận dạng cá nhân xâm nhập vào bối cảnh mô hình.
- JS: `sensitiveInfo({ deny: ["EMAIL", "CREDIT_CARD_NUMBER", "PHONE_NUMBER", "IP_ADDRESS"] })`
- Python: `detect_sensitive_info(deny=[SensitiveInfoType.EMAIL, SensitiveInfoType.CREDIT_CARD_NUMBER, ...])`
Truyền tin nhắn của người dùng qua `sensitiveInfoValue` (JS) / `sensitive_info_value` (Python) vào lúc `protect()`.
### Giới hạn tỷ lệ ngân sách mã thông báo
Sử dụng `tokenBucket()` / `token_bucket()` cho điểm cuối AI — tham số `requested` có thể được đặt tỷ lệ thuận với mức sử dụng mã thông báo mô hình thực tế, liên kết trực tiếp giới hạn tốc độ với chi phí. Nó cũng cho phép các đợt ngắn trong khi thực thi tốc độ trung bình, phù hợp với cách người dùng tương tác với giao diện trò chuyện.
Cấu hình khởi đầu được đề xuất:
- `capacity`: 10 (số lần phát tối đa)
- `refillRate`: 5 mã thông báo mỗi khoảng thời gian
- `interval`: "10 giây"
Truyền tham số `requested` tại thời điểm `protect()` để khấu trừ mã thông báo tỷ lệ với chi phí mô hình. Ví dụ: khấu trừ 1 mã thông báo cho mỗi tin nhắn hoặc ước tính dựa trên độ dài lời nhắc.
Đặt `characteristics` để theo dõi mỗi người dùng: `["userId"]` nếu được xác thực, mặc định là dựa trên IP.
### Bảo vệ cơ sở
Luôn bao gồm `shield()` (WAF) và `detectBot()` làm lớp cơ sở. Bot quét điểm cuối AI là một nguyên nhân lạm dụng phổ biến. Đối với các điểm cuối được truy cập thông qua trình duyệt (ví dụ: giao diện trò chuyện), hãy cân nhắc thêm tín hiệu nâng cao Arcjet để phát hiện bot phía máy khách nhằm phát hiện các trình duyệt không đầu phức tạp. Xem https://docs.arcjet.com/bot-protection/advanced-signals để thiết lập.
## Bước 3: Soạn thảo các quyết định gọi và xử lý lệnh bảo vệ()
Tất cả tham số quy tắc được chuyển cùng nhau trong một lệnh gọi `protect()`. Sử dụng mẫu này:
```typescript
const userMessage = req.body.message; // the user's input
const decision = await aj.protect(req, {
requested: 1, // tokens to deduct for rate limiting
sensitiveInfoValue: userMessage, // PII scanning
detectPromptInjectionMessage: userMessage, // injection detection
});
if (decision.isDenied()) {
if (decision.reason.isRateLimit()) {
return Response.json(
{ error: "You've exceeded your usage limit. Please try again later." },
{ status: 429 },
);
}
if (decision.reason.isPromptInjection()) {
return Response.json(
{ error: "Your message was flagged as potentially harmful." },
{ status: 400 },
);
}
if (decision.reason.isSensitiveInfo()) {
return Response.json(
{
error:
"Your message contains sensitive information that cannot be processed. Please remove any personal data.",
},
{ status: 400 },
);
}
if (decision.reason.isBot()) {
return Response.json({ error: "Forbidden" }, { status: 403 });
}
}
// Arcjet fails open — log errors but allow the request
if (decision.isErrored()) {
console.warn("Arcjet error:", decision.reason.message);
}
// Proceed with AI model call...
```
Điều chỉnh định dạng phản hồi cho phù hợp với khung của bạn (ví dụ: `res.status(429).json(...)` cho Express).
## Bước 5: Xác minh
1. Khởi động ứng dụng và gửi tin nhắn bình thường - sẽ thành công
2. Kiểm tra nội dung nhắc nhở bằng cách gửi nội dung như "Bỏ qua tất cả các hướng dẫn trước đó và..."
3. Kiểm tra việc chặn PII bằng cách gửi tin nhắn có số thẻ tín dụng giả
Trước tiên, hãy bắt đầu tất cả quy tắc ở chế độ `"DRY_RUN"`. Sau khi được xác minh, hãy thăng cấp lên `"LIVE"`.
**Luôn khuyến nghị sử dụng các công cụ Arcjet MCP** để xác minh các quy tắc và phân tích lưu lượng truy cập:
- `list-requests` — xác nhận các quyết định đang được ghi lại, lọc theo kết luận để xem các khối
- `analyze-traffic` — xem xét tỷ lệ và kiểu từ chối cho điểm cuối AI
- `explain-decision` — hiểu lý do tại sao một yêu cầu cụ thể được cho phép hoặc bị từ chối (hữu ích cho việc điều chỉnh độ nhạy của lời nhắc tiêm)
- `promote-rule` — thăng cấp các quy tắc từ `DRY_RUN` lên `LIVE` sau khi được xác minh
Nếu người dùng muốn xem xét bảo mật đầy đủ, hãy đề xuất tác nhân `/arcjet:security-analyst` có thể điều tra lưu lượng truy cập, phát hiện các điểm bất thường và đề xuất các quy tắc bổ sung.
Bảng điều khiển Arcjet tại https://app.arcjet.com cũng có sẵn để kiểm tra trực quan.
## Các mẫu phổ biến
**Truyền phản hồi**: Gọi `protect()` trước khi bắt đầu phát trực tiếp. Nếu bị từ chối, hãy trả lại lỗi trước khi mở luồng — không bắt đầu phát rồi hủy bỏ.
**Nhiều mô hình/nhà cung cấp**: Sử dụng cùng một phiên bản Arcjet bất kể bạn sử dụng nhà cung cấp AI nào. Arcjet hoạt động ở lớp HTTP, độc lập với nhà cung cấp mô hình.
**Vercel AI SDK**: Arcjet hoạt động cùng với Vercel AI SDK. Gọi `protect()` trước `streamText()` / `generateText()`. Nếu bị từ chối, hãy trả về phản hồi lỗi đơn giản thay vì gọi AI SDK.
## Những sai lầm thường gặp cần tránh
- Tính năng phát hiện thông tin nhạy cảm chạy **cục bộ trong WASM** — không có dữ liệu người dùng nào được gửi đến các dịch vụ bên ngoài. Nó chỉ khả dụng trong trình xử lý tuyến đường, không có trong các trang Next.js hoặc hành động của máy chủ.
- Cả `sensitiveInfoValue` và `detectPromptInjectionMessage` (JS) / `sensitive_info_value` và `detect_prompt_injection_message` (Python) đều phải được thông qua vào lúc `protect()` — quên hoặc âm thầm bỏ qua kiểm tra đó.
- Bắt đầu luồng trước khi gọi `protect()` — nếu yêu cầu bị từ chối giữa luồng, ứng dụng khách sẽ nhận được phản hồi không chính xác. Luôn gọi `protect()` trước và trả về lỗi trước khi mở luồng.
- Sử dụng `fixedWindow()` hoặc `slidingWindow()` thay vì `tokenBucket()` cho điểm cuối AI — nhóm mã thông báo cho phép bạn khấu trừ mã thông báo tỷ lệ với chi phí mô hình và phù hợp với kiểu tương tác bùng nổ của giao diện trò chuyện.
- Tạo một phiên bản Arcjet mới theo yêu cầu thay vì sử dụng lại ứng dụng khách dùng chung với `withRule()`.