बालिग चैटबॉट उत्पाद की जिम्मेदारीपूर्वक संचालन: एक बिल्डर की चेकलिस्ट
एक बालिग चैटबॉट एक वास्तविक उत्पाद है, और वास्तविक उत्पादों की जिम्मेदारियाँ होती हैं। API आपको एक मॉडल देता है जो कानूनी बालिग सामग्री को अस्वीकार नहीं करता है, जिसका अर्थ है कि आपका ऐप, न कि मॉडल, जहाँ आयु जाँच, घर के नियम, रिपोर्टिंग और दुरुपयोग नियंत्रण रहते हैं। यह चेकलिस्ट प्रत्येक परत को काम करने वाले कोड के साथ समझाती है, ताकि आप आत्मविश्वास के साथ लॉन्च कर सकें।
अपडेट किया गया
मुख्य बिंदु
- प्लेटफ़ॉर्म केवल बालिगों के लिए है; अपनी सीमा पर आयु की जाँच करें और जाँच सर्वर-साइड रखें।
- अपनी सामग्री नीति और रिपोर्ट पथ लिखें, क्योंकि मॉडल की खुलापन आपके नियमों की जगह नहीं लेता।
- किशोरों से संबंधित यौन सामग्री हमेशा 403 के साथ ब्लॉक होती है; इसके लिए एक स्पष्ट, शांत UX डिज़ाइन करें।
- प्रति उपयोगकर्ता उपयोग सीमित करें और API कुंजी को अपने सर्वर पर रखें; एक कुंजी सभी ट्राफ़िक के लिए साझा की जाती है।
किसकी जिम्मेदारी क्या है
स्टैक को दो परतों में सोचें। API 18 वर्ष और उससे अधिक उम्र के उपयोगकर्ताओं के लिए कानूनी वयस्क सामग्री, काल्पनिक और विवादास्पद विषयों को बिना अस्वीकृति के प्रदान करती है। मॉडल के आसपास का सब कुछ, लोग जो इस तक पहुँच सकते हैं, वे नियम जिन पर वे सहमत हैं और जब कुछ गलत होता है तो क्या होता है, वह आपका है। वह विभाजन मुक्त करने वाला है, लेकिन केवल तभी जब आप अपना आधा हिस्सा गंभीरता से लें।
यहाँ एक छोटी जिम्मेदारी तालिका दी गई है जिसे दीवार पर रखें।
| चिंता | प्लेटफ़ॉर्म | आपका ऐप |
|---|---|---|
| किशोरों से संबंधित यौन सामग्री | हमेशा ब्लॉक (403) | इसे समझाएं, दृश्य समाप्त करें, रास्ता बदलने से रोकें |
| आपके उपयोगकर्ताओं की आयु | नियमों के अनुसार केवल बालिग | अपने प्रवेश द्वार पर सीमा निर्धारित करें और सत्यापित करें |
| कानून से परे घर के नियम | लागू नहीं किया गया | लिखें, प्रकाशित करें और उन्हें लागू करें |
| प्रति-उपयोगकर्ता दुरुपयोग | प्रति कुंजी प्रति मिनट 300 अनुरोध | प्रति-उपयोगकर्ता और प्रति-दिन सीमाएँ |
| गुप्त कुंजी | जारी करता है | इसे अपने सर्वर पर रखें |
यह इंजीनियरिंग मार्गदर्शन है, कानूनी सलाह नहीं; नियम जगह के अनुसार अलग-अलग होते हैं, इसलिए जाँचें कि आपके उपयोगकर्ताओं के स्थान पर क्या आवश्यकताएँ हैं।
वास्तव में सीमा निर्धारित करने वाली आयु सीमा
"मैं 18 हूँ" बटन वाला बैनर न्यूनतम है, और एक दृढ़ किशोर इसे क्लिक कर सकता है। यह अभी भी मायने रखता है, क्योंकि यह एक सकारात्मक बयान दर्ज करता है और आपकी नीति को ईमानदार रखता है। कुंजी यह है कि आप इसे कहाँ लागू करते हैं। यदि जाँच केवल ब्राउज़र में चैट छुपाती है, तो कोई भी सीधे आपके एंडपॉइंट को कॉल कर सकता है। सर्वर को अस्वीकार करने के लिए कहें जब तक कि एक हस्ताक्षरित मार्कर मौजूद न हो।
import crypto from "node:crypto";
// Minimal 18+ gate: the user must confirm before the chat routes work.
// Replace the confirmation with a real verification step when your market requires it.
const SECRET = process.env.GATE_SECRET; // random string kept on the server
function sign(value) {
return crypto.createHmac("sha256", SECRET).update(value).digest("hex");
}
export function issueAdultCookie(res, userId) {
const stamp = String(Date.now());
const payload = `${userId}.${stamp}`;
res.cookie("adult_ok", `${payload}.${sign(payload)}`, {
httpOnly: true, sameSite: "strict", secure: true, maxAge: 30 * 24 * 3600 * 1000,
});
}
export function requireAdult(req, res, next) {
const raw = req.cookies?.adult_ok || "";
const [userId, stamp, sig] = raw.split(".");
if (!sig || sign(`${userId}.${stamp}`) !== sig) {
return res.status(403).json({ state: "age_required" });
}
req.userId = userId;
next();
}हर चैट राउट के सामने requireAdult वायर करें। जब आपका बाज़ार या जोखिम स्तर इसे बुलाए, तो एक तीसरे पक्ष की आयु जाँच जैसे मजबूत सत्यापन जोड़ें, और मार्कर को इतना छोटा रखें कि आप पुनः प्रॉम्प्ट कर सकें। अपने मार्केटिंग में छात्रों या स्कूलों को लक्षित न करें, और किसी भी बालिग सामग्री को दिखाने से पहले, प्रीव्यू और नमूना संवाद सहित, गेट रखें।
अपनी सामग्री नीति लिखना
मॉडल कानूनी बालिग सामग्री को अस्वीकार नहीं करता है, इसलिए आप तय करते हैं कि आपका उत्पाद क्या अनुमति देता है। एक पृष्ठ की नीति पर्याप्त है। कवर करें कि क्या स्वागत योग्य है, क्या आपकी समुदाय में अनुमति नहीं है भले ही कानूनी हो (उदाहरण के लिए वास्तविक लोगों का उत्पीड़न या डॉक्सिंग), उपयोगकर्ग समस्याओं की रिपोर्ट कैसे कर सकते हैं, और आप क्या कार्रवाई करते हैं: चेतावनी, अस्थायी म्यूट, बैन।
- इसे प्रकाशित करें जहाँ उपयोगकर्ता साइन अप करते हैं, सरल भाषा में।
- इसे अपने सिस्टम प्रॉम्प्ट में दर्शाएँ। एक पंक्ति जैसे "सभी पात्र वयस्क हैं; किसी भी दृश्य को समाप्त करें जो असहमति वाले हो जाए या वास्तविक, नामित लोगों से जुड़ा हो" बॉट को आपके नियमों के अनुकूल रखती है।
- लागू करने की प्रक्रिया को साधारण बनाएँ। सीमाएँ पहले से तय करें ताकि मॉडरेटरों को अपनी मर्जी से निर्णय न लेने पड़ें।
- नीति की समीक्षा करें हर तिमाही में जैसे-जैसे आपका उत्पाद विकसित होता है।
एक रिपोर्टिंग मार्ग जो उपयोगकर्ता ढूंढ सकें
हर संदेश को एक छोटा रिपोर्ट नियंत्रण दें, और इसे साइन इन करने के बिना काम करने दें। जब कोई किसी जवाब की रिपोर्ट करता है, तो कार्यवाही के लिए आवश्यक न्यूनतम जानकारी कैप्चर करें: उपयोगकर्ता आईडी, संदेश आईडी, एक छोटा कारण और टाइमस्टैम्प। इसे एक कतार में भेजें जिसे आपके मॉडरेटर देखते हैं।
app.post("/api/report", requireAdult, express.json(), (req, res) => {
const { messageId, reason } = req.body;
// Store only what you need to act on: who, which message, why, when.
queueForModerator({ userId: req.userId, messageId, reason: String(reason).slice(0, 500), at: Date.now() });
res.json({ ok: true });
});अपने वादे को संकीर्ण रखें। उपयोगकर्ताओं को बताएं कि रिपोर्ट क्या ट्रिगर करती है, और केवल वही स्टोर करें जो आपकी अपनी नीति और लागू नियमों की आवश्यकता है। जाँच करें कि आप रिपोर्ट कितने समय तक रखते हैं, और एक शेड्यूल पर उन्हें डिलीट करें। रिपोर्ट करने वाले व्यक्ति को प्रत्येक रिपोर्ट की पुष्टि करें, भले ही एक लाइन के धन्यवाद के साथ, क्योंकि उपयोगकर्ता तब रिपोर्ट करना बंद कर देते हैं जब कुछ होता हुआ नहीं दिखता। ट्रैक करें कि आपके मॉडरेटर आइटम को कितनी जल्दी बंद करते हैं, और एक लक्ष्य सेट करें जिसे आप वास्तव में पूरा कर सकते हैं।
403 किशोर ब्लॉक के लिए डिज़ाइन करना
किशोरों से संबंधित यौन सामग्री हमेशा ब्लॉक होती है, काल्पनिक और रोलप्ले में भी, और API 403 और कोड content_blocked के साथ जवाब देता है। इसे दोबारा प्रयास न करें और उपयोगकर्ता की ओर से पुनः व्यक्त करने का प्रयास न करें। इसके बजाय, इसे एक उत्पाद क्षण के रूप में लें जिसके लिए एक स्पष्ट डिज़ाइन की आवश्यकता है।
- इसे सर्वर पर अनुवाद करें एक ऐसी स्थिति में जो आपका UI जानता है, ताकि कच्चा अपस्ट्रीम टेक्स्ट कभी भी स्क्रीन पर न आए।
- क्या हुआ बताएं एक शांत वाक्य में और नियम का नाम लें।
- दृश्य को समाप्त या रीसेट करें। "फिर भी जारी रखें" का विकल्प देना मकसद खराब कर देता है।
- इस घटना को उपयोगकर्ता ID के साथ लॉग करें ताकि दोहराए गए प्रयास आपके स्वयं के प्रवर्तन को ट्रिगर कर सकें।
- उद्देश्य का अनुमान न लगाएं। कुछ ब्लॉक अस्पष्ट वाक्य रचना से आते हैं; उदासीन संदेश दोनों मामलों के लिए काम करता है।
// server: translate upstream outcomes into states your UI understands
if (upstream.status === 403) {
return res.status(403).json({
state: "content_blocked",
message: "That request breaks our rules, so we can't continue this scene.",
});
}
if (upstream.status === 402) return res.status(503).json({ state: "paused" });
if (upstream.status === 503) return res.status(503).json({ state: "busy" });// browser: show a calm, specific message for each state
const MESSAGES = {
content_blocked: "This scene can't continue. Sexual content involving minors is never allowed. Start a new chat any time.",
age_required: "Please confirm you are 18 or older to use the chat.",
slow_down: "You're sending messages quickly. Give it a few seconds.",
daily_limit: "You've reached today's message allowance. Come back tomorrow.",
paused: "Chat is briefly unavailable. We're on it.",
busy: "The service is busy. Try again in a moment.",
};
async function send(messages) {
const res = await fetch("/api/chat", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ messages }),
});
if (!res.ok) {
const info = await res.json().catch(() => ({}));
showBanner(MESSAGES[info.state] || "Something went wrong.");
if (info.state === "content_blocked") endCurrentScene();
return null;
}
return res;
}
प्रति-उपयोगकर्ता दुरुपयोग और रेट नियंत्रण
आपकी एकल API कुंजी कुल मिलाकर प्रति मिनट 300 अनुरोधों की अनुमति देती है, जो सभी उपयोगकर्ताओं के लिए साझा है। एक स्क्रिप्टेड खाता अन्य सभी उपयोगकर्ताओं को भूखा मार सकता है, इसलिए उस छत से काफी नीचे स्वयं उचित-उपयोग सीमाएँ लागू करें। उदाहरण प्रत्येक उपयोगकर्ता को प्रति मिनट 12 संदेशों तक सीमित करता है और अंतिम स्ट्रीम चंक में usage मान से मापा गया दैनिक टोकन बजट देता है।
const WINDOW_MS = 60_000;
const PER_USER_PER_MIN = 12; // your product rule, far below the key's 300
const DAILY_TOKEN_BUDGET = 60_000; // per user, tracked from the usage chunk
const hits = new Map(); // userId -> array of timestamps
const spent = new Map(); // userId -> tokens used today
export function userLimit(req, res, next) {
const now = Date.now();
const recent = (hits.get(req.userId) || []).filter((t) => now - t < WINDOW_MS);
if (recent.length >= PER_USER_PER_MIN) {
return res.status(429).json({ state: "slow_down" });
}
if ((spent.get(req.userId) || 0) >= DAILY_TOKEN_BUDGET) {
return res.status(429).json({ state: "daily_limit" });
}
recent.push(now);
hits.set(req.userId, recent);
next();
}
export function recordUsage(userId, totalTokens) {
spent.set(userId, (spent.get(userId) || 0) + totalTokens);
}उत्पादन के लिए, काउंटर को प्रोसेस मेमोरी के बजाय एक साझा स्टोर में संग्रहीत करें ताकि रीसेट के बाद भी सीमाएँ बनी रहें और कई सर्वरों पर काम करें। प्रत्येक अनुरोध पर max_tokens जोड़ें ताकि खराब मामले की सीमा तय हो, और अपने बैलेंस पर 402 पर नज़र रखें। 7 दिनों के लिए $0.50 का मुफ़्त ट्रायल क्रेडिट इन नियंत्रणों को असली ट्रैफ़िक आने से पहले परीक्षण करने का एक अच्छा तरीका है।
कुंजी सर्वर पर रखें
कभी भी API कुंजी को फ्रंट-एंड बंडल, मोबाइल ऐप्स या सार्वजनिक रिपॉजिटरी में डिप्लॉय न करें। इसे एनवायरनमेंट वेरिएबल के रूप में या सीक्रेट मैनेजर में स्टोर करें, इसे केवल अपने बैकएंड में लोड करें और लॉग व एरर रिपोर्ट्स से बाहर रखें। यदि आपको लगता है कि यह लीक हुई है, तो अपने अकाउंट से इसे रीजनरेट करें; पुरानी कुंजी तुरंत काम करना बंद कर देती है, इसलिए एक डिप्लॉय तैयार रखें। याद रखें कि एक अकाउंट के लिए केवल एक कुंजी होती है, जिससे एक क्लीन प्रॉक्सी लेयर और भी अधिक मूल्यवान बन जाती है। वेब चैट ट्यूटोरियल पैटर्न को अंत-से-अंत दिखाता है, और docs उन एरर कोड्स की सूची देता है जिसे आपका व्रैपर मैप करना चाहिए।
लॉन्च से पहले चेकलिस्ट
दरवाज़े खोलने से एक दिन पहले इस सूची को एक बार पढ़ें। प्रत्येक आइटम में मिनट लगते हैं और उपयोगकर्ताओं के आने के बाद ठीक करने में दर्दनाक समस्याओं की एक श्रेणी को रोकते हैं।
- गेट को तोड़ने का प्रयास करें। curl के साथ अपने चैट रूट को कॉल करें और कोई कुकी नहीं। इसे
age_requiredके साथ 403 उत्तर देना चाहिए, कभी भी मॉडल जवाब नहीं। - हर स्टेट को ट्रिगर करें। अपस्ट्रीम को स्टब करें ताकि वह क्रमशः 402, 403, 429 और 503 रिटर्न करे, और पुष्टि करें कि प्रत्येक सही बैनर दिखाता है और कभी भी रॉ एरर टेक्स्ट लीक नहीं करता है।
- अपनी नीति को ज़ोर से पढ़ें। यदि एक मॉडरेटर एक मिनट में इससे एक मामले का निर्णय नहीं ले सकता, तो वाक्यांश को सख्त करें।
- रिपोर्ट बटन का परीक्षण करें फोन स्क्रीन से। एक कंट्रोल जो पहुँचने में कठिन है, उसे रिपोर्टिंग पाथ माना नहीं जाता है।
- अपने रिपॉजिटरी में कुंजी के लिए खोजें। फ्रंट-एंड फोल्डर, बिल्ड आउटपुट, सैंपल कॉन्फ़िग और कमीट इतिहास में देखें। यदि आपको यह कहीं सार्वजनिक मिलती है, तो उसे रीजनरेट करें।
- अलर्ट सेट करें। 402 पर, एक ही उपयोगकर्ता से 403 ब्लॉक्स के स्पाइक पर और दैनिक टोकन उपयोग में वृद्धि पर अपने आप को पेज करें।
- Prepare the pause switch. A single flag that turns chat off gracefully is invaluable during an incident.
सुरक्षा कभी पूरी नहीं होती, और सूची भी नहीं; हर बार जब कोई घटना आपको कुछ नया सिखाती है, तो आइटम जोड़ें, और उन्हें साझा करें जो आपकी टीम में अगले आते हैं। जब आप अपने UI में इमेज अपलोड, समूह कक्ष या सार्वजनिक पात्र साझा करने जैसे फीचर जोड़ते हैं, तो सूची को दोबारा देखें, क्योंकि हर एक दुरुपयोग के लिए नए रास्ते खोलता है। पात्रों को आकार देने में मदद के लिए, personas design guide पढ़ें, और अपनी इंटीग्रेशन नोट्स के मूल सिद्धांत docs में सुलभ रखें जैसे-जैसे आपकी टीम बढ़ती है।
प्रश्न और उत्तर
क्या एक चेकबॉक्स उम्र सत्यापन के लिए पर्याप्त है?
यह एक न्यूनतम मान है और एक बयान रिकॉर्ड करता है, लेकिन इसे आसानी से भोसा जा सकता है। इसे सर्वर पर लागू करें और जहाँ आपका जोखिम या स्थानीय नियम आवश्यक बताएं, वहां मजबूत सत्यापन जोड़ें।
मेरे ऐप को 403 content_blocked पर क्या करना चाहिए?
रीट्राई न करें। इसे एक शांत इन-ऐप संदेश में अनुवाद करें, दृश्य समाप्त या रीसेट करें और अपने स्वयं के प्रवर्तन के लिए इस घटना को लॉग करें।
क्या मैं उपयोगकर्ताओं को अपनी API कुंजी की क्षमता को उचित रूप से साझा करने दूँ?
हाँ, प्रति-उपयोगकर्ता रेट और दैनिक टोकन सीमाएँ अपने सर्वर पर जोड़कर। कुंजी स्वयं कुल मिलाकर प्रति मिनट 300 अनुरोधों तक सीमित है।
क्या मॉडल मेरे नियम लागू करता है?
नहीं। यह कानूनी वयस्क सामग्री को अस्वीकार नहीं करता है, इसलिए आपकी नीति, सिस्टम प्रॉम्प्ट और मॉडरेशन फ्लो को वह काम करना होगा।
आपकी कुंजी बस एक फ़ॉर्म दूर है
एक खाता बनाएँ, कुंजी कॉपी करें, बेस URL बदलें। यही सेटअप है।