داشبورد توسعه‌دهنده
پرسش از هوش مصنوعی
پرسش از هوش مصنوعی

بهترین شیوه‌های ایمنی

سیستم‌های هوش مصنوعی production به ایمنی لایه‌ای نیاز دارند: کنترل ورودی، moderation، ردیابی سوءاستفاده در سطح کاربر، بررسی خروجی و مسیر گزارش مشکل توسط کاربران. راهنمایی‌های ایمنی OpenAI با AvalAI هم‌خوان است، چون AvalAI شکل درخواست سازگار با OpenAI را از طریق https://api.avalai.ir/v1 پشتیبانی می‌کند.

لایه‌بندی Guardrailها

  • حذف زودهنگام secrets: Guardrails AvalAI را فعال کنید تا کلیدهای API، توکن‌ها و credentialها پیش از رسیدن محتوا به مدل شناسایی و حذف شوند.
  • محدوده اسکن را بشناسید: Guardrails فیلدهای سازگار مانند messages، input و prompt را در routeهایی مانند /v1/chat/completions، /v1/responses، /v1/messages و /v1/completions اسکن می‌کند.
  • باز هم secret نفرستید: Guardrails ریسک را کم می‌کند، اما اپلیکیشن production نباید credential، کلید خصوصی یا داده حساس مشتری را به مدل ارسال کند مگر واقعا لازم باشد.
json
{
  "messages": [
    {
      "role": "user",
      "content": "سؤال من درباره API اینجاست..."
    }
  ],
  "guardrails": [
    "hide-secrets"
  ]
}

دفاع در برابر Prompt Injection و سوءاستفاده از ابزار

Prompt injection زمانی رخ می‌دهد که متن نامطمئن تلاش می‌کند دستورهای شما را override کند یا tool callهای downstream را به مسیر ناخواسته ببرد. ورودی کاربر، سند بازیابی‌شده، متن صفحه وب، خروجی ابزار و فایل آپلودشده را نامطمئن فرض کنید مگر اینکه اپلیکیشن شما آن را اعتبارسنجی کرده باشد.

  • متن نامطمئن را داخل instructions نگذارید: محتوای کاربر یا retrieval را در input یا محتوای message بفرستید، نه در دستورهای developer/system با اولویت بالا.
  • داده را از دستور جدا کنید: snippetهای retrieval را به‌عنوان reference material برچسب بزنید و به مدل بگویید دستورهای داخل آن متن را اجرا نکند.
  • مرز ساختاریافته بسازید: برای handoff بین مرحله‌های workflow از خروجی‌های ساختاریافته استفاده کنید تا مهاجم نتواند فرمان آزاد را در متن میانی پنهان کند.
  • Tool call را دو بار اعتبارسنجی کنید: argumentها را قبل از اجرا و خروجی ابزار را پیش از بازگرداندن به مدل بررسی کنید. برای side effectهایی مثل write، refund، delete، shell command یا تغییر دیتابیس، approval انسانی لازم بگذارید.
  • ابزار least-privilege ارائه دهید: اگر hosted tool یا MCP برای route انتخابی شما در AvalAI فعال نیست، قابلیت را در backend خودتان نگه دارید و فقط یک function tool محدود با parameterهای validateشده در اختیار مدل بگذارید.
  • مسیرهای خصمانه را eval کنید: prompt injection، jailbreak، سند مخرب و tool call ناامن را به ارزیابی‌ها اضافه کنید و قبل از تغییر prompt، مدل، retrieval یا schema ابزار اجرا کنید.

نظارت ورودی و خروجی

  • از /v1/moderations استفاده کنید: ورودی کاربر را پیش از generation و خروجی مدل را پیش از نمایش به کاربر طبقه‌بندی کنید. omni-moderation-latest از متن و تصویر پشتیبانی می‌کند؛ aliasهای متن‌محور شامل text-moderation-latest و text-moderation-stable هستند.
  • امتیازها را سیگنال بدانید: ابتدا flagged را بررسی کنید، سپس categories، category_scores و category_applied_input_types را برای routing، audit log و صف بررسی انسانی استفاده کنید.
  • Inline moderation در صورت پشتیبانی: endpointهای سازگار با OpenAI مانند /v1/responses و /v1/chat/completions ممکن است شیء سطح بالای moderation را بپذیرند و امتیاز ورودی و خروجی را کنار پاسخ بدهند. اگر پشتیبانی AvalAI برای route انتخابی فعال نیست، /v1/moderations را جداگانه فراخوانی کنید.
  • در streaming با احتیاط عمل کنید: امتیازهای inline moderation برای محتوای تولیدشده فقط پس از کامل شدن کل خروجی آماده می‌شوند، نه همراه deltaهای جزئی stream.
  • مرز toolها را بشناسید: moderation می‌تواند argumentهای tool call و خروجی tool را وقتی در محتوای گفتگو آمده‌اند پوشش دهد؛ اما نام tool، توضیحات tool، schemaهای tool یا schemaهای response format را moderation نمی‌کند.
  • منتظر ارتقای مدل باشید: اگر آستانه سفارشی بر اساس category_scores دارید، آن را دوره‌ای ارزیابی کنید چون مدل‌های moderation ممکن است بهتر شوند.
گردش‌کارچه زمانی استفاده شودالگوی AvalAI
moderation مستقلوقتی می‌خواهید متن یا تصویر را بدون تولید پاسخ طبقه‌بندی کنیدپیش یا پس از generation، POST /v1/moderations را فراخوانی کنید
moderation همراه generationوقتی پاسخ مدل و امتیازهای moderation را با هم لازم داریددر صورت فعال بودن، moderation: {"model": "omni-moderation-latest"} را به /v1/responses یا /v1/chat/completions اضافه کنید
بررسی انسانیوقتی خروجی پرریسک، مرزی یا business-critical استدرخواست را همراه flagged، امتیاز دسته‌ها، hash شناسه کاربر و متن مکالمه وارد صف review کنید

طراحی تجربه‌های حساس به سن

اگر محصول شما ممکن است توسط افراد زیر ۱۸ سال استفاده شود، پیش از launch safeguardهای اختصاصی اضافه کنید و فقط به رفتار مدل تکیه نکنید. راهنمای under-18 OpenAI baseline خوبی است، اما در deploymentهای AvalAI باید route انتخابی، provider، وضعیت نگه‌داری داده و الزامات قانونی محلی را هم جداگانه verify کنید.

  • مخاطب را مشخص کنید: تعیین کنید محصول فقط برای بزرگسالان است، کاربران با سن ترکیبی دارد، یا مخصوص minors است؛ سپس نیاز age-gating یا age-assurance را مستند کنید.
  • توضیح مناسب سن بدهید: شفاف بگویید کاربر با AI تعامل دارد، سیستم چه کارهایی را می‌تواند یا نمی‌تواند انجام دهد، و مشکل ناایمن یا آزاردهنده چطور گزارش می‌شود.
  • کنترل محتوا را سخت‌گیرانه‌تر کنید: از moderation، فهرست موضوعات مجاز/غیرمجاز، محدودیت کوتاه‌تر generation و escalation انسانی برای دسته‌های پرریسک استفاده کنید.
  • داده کاربران جوان را محافظت کنید: داده شخصی غیرضروری جمع‌آوری نکنید، شناسه خام کودک یا نوجوان را نفرستید، و پیش از پردازش داده regulated مربوط به minors مسیر retention/compliance تأییدشده داشته باشید.
  • قوانین حریم خصوصی کودک را زود بررسی کنید: اگر محصول شما ممکن است به کودکان خدمت بدهد، بررسی کنید قانون محلی یا policy مشتری پردازش داده شخصی برای کاربران زیر سن مشخص را ممنوع می‌کند یا نه، و این الزام‌ها را فقط به prompt واگذار نکنید.
  • نظارت و escalation را تعریف کنید: مشخص کنید چه کسی گفتگوهای پرریسک را review می‌کند، زمان پاسخ چقدر است و چه زمانی دسترسی باید محدود یا تعلیق شود.

برای سناریوهای strict retention یا داده regulated، پیش از پذیرش ترافیک production این بخش را با کنترل داده‌ها ترکیب کنید.

استفاده از Safety Identifier

برای محصولاتی که کاربران نهایی جداگانه با مدل تعامل دارند، یک safety_identifier پایدار و حفظ‌کننده حریم خصوصی ارسال کنید. نام کاربری، ایمیل یا شناسه داخلی کاربر را hash کنید؛ برای previewهای ناشناس از session ID استفاده کنید. Safety identifier به صورت خودکار بین APIها یا sessionها منتقل نمی‌شود، پس مقدار پایدار را در هر درخواست مرتبط ارسال کنید.

python
import hashlib
import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["AVALAI_API_KEY"],
    base_url="https://api.avalai.ir/v1",
)


def safety_identifier(raw_user_id: str) -> str:
    return hashlib.sha256(raw_user_id.encode("utf-8")).hexdigest()[:64]


response = client.chat.completions.create(
    model="gpt-5.5",
    messages=[{"role": "user", "content": "این یک تست ایمنی است."}],
    max_completion_tokens=50,
    safety_identifier=safety_identifier("user_123"),
)

print(response.choices[0].message.content)
javascript
import crypto from "node:crypto";
import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.AVALAI_API_KEY,
  baseURL: "https://api.avalai.ir/v1",
});

const safetyIdentifier = crypto
  .createHash("sha256")
  .update("user_123")
  .digest("hex")
  .slice(0, 64);

const response = await client.chat.completions.create({
  model: "gpt-5.5",
  messages: [{ role: "user", content: "این یک تست ایمنی است." }],
  max_completion_tokens: 50,
  safety_identifier: safetyIdentifier,
});

console.log(response.choices[0].message.content);
bash
curl https://api.avalai.ir/v1/chat/completions \
  -H "Authorization: Bearer $AVALAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-5.5",
    "messages": [
      { "role": "user", "content": "این یک تست ایمنی است." }
    ],
    "max_completion_tokens": 50,
    "safety_identifier": "9f86d081884c7d659a2feaa0c55ad015"
  }'
نسخه Responses API با همان الگوی safety identifier.

وقتی مدل انتخابی از /v1/responses پشتیبانی می‌کند، این نسخه را استفاده کنید. messages به input منتقل می‌شود، max_completion_tokens به max_output_tokens تبدیل می‌شود و متن نهایی از response.output_text خوانده می‌شود.

python
import hashlib
import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["AVALAI_API_KEY"],
    base_url="https://api.avalai.ir/v1",
)

safety_identifier = hashlib.sha256(b"user_123").hexdigest()[:64]

response = client.responses.create(
    model="gpt-5.5",
    instructions="You are a helpful assistant.",
    input="این یک تست ایمنی است.",
    max_output_tokens=50,
    safety_identifier=safety_identifier,
)

print(response.output_text)
javascript
import crypto from "node:crypto";
import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.AVALAI_API_KEY,
  baseURL: "https://api.avalai.ir/v1",
});

const safetyIdentifier = crypto
  .createHash("sha256")
  .update("user_123")
  .digest("hex")
  .slice(0, 64);

const response = await client.responses.create({
  model: "gpt-5.5",
  instructions: "You are a helpful assistant.",
  input: "این یک تست ایمنی است.",
  max_output_tokens: 50,
  safety_identifier: safetyIdentifier,
});

console.log(response.output_text);
bash
curl https://api.avalai.ir/v1/responses \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $AVALAI_API_KEY" \
  -d '{
    "model": "gpt-5.5",
    "input": "این یک تست ایمنی است.",
    "instructions": "You are a helpful assistant.",
    "max_output_tokens": 50,
    "safety_identifier": "9f86d081884c7d659a2feaa0c55ad015"
  }'
  • messagesinput
  • پیام سیستمی → instructions یا آیتم developer
  • choices[0].message.contentresponse.output_text
  • usersafety_identifier برای پایش سوءاستفاده؛ برای bucket کردن cache از prompt_cache_key جداگانه استفاده کنید.

محافظت از کلیدها و نشست‌ها

  • کلید لو رفته را فورا بچرخانید: اگر کلید AvalAI لاگ شد، commit شد، در client app قرار گرفت یا مشکوک به سوءاستفاده بود، آن را revoke کنید و پیش از ادامه ترافیک کلید تازه بسازید.
  • Safety ID را خصوصی نگه دارید: شناسه hashشده یا opaque بفرستید، نه ایمیل، شماره تلفن، کد ملی یا کلید اصلی خام دیتابیس.
  • ایمنی را به observability وصل کنید: request_id، safety_identifier، نتیجه moderation، مدل، route و اقدام نهایی کاربرمحور را ذخیره کنید تا بررسی سوءاستفاده بدون افشای داده شخصی خام قابل ردیابی باشد.
  • نشست‌های Realtime مدیریت جداگانه می‌خواهند: safety identifierها خودکار بین APIها یا sessionها منتقل نمی‌شوند. برای routeهای سازگار با Realtime، همان hash پایدار کاربر را از طریق parameter، header یا metadata سمت سرور که آن route پشتیبانی می‌کند bind کنید.

Red Teaming و ارزیابی

  • ورودی‌های نماینده و خصمانه را تست کنید: استفاده عادی، prompt injection، خروج از موضوع، payload خراب و تلاش برای شکستن مرزهای خط‌مشی را پوشش دهید.
  • eval و red teaming را کنار هم داشته باشید: eval رفتار مورد انتظار را می‌سنجد؛ red teaming سوءاستفاده، jailbreak و تعامل‌های پرریسک غیرمنتظره را بررسی می‌کند.
  • Promptfoo را در نظر بگیرید: OpenAI از Promptfoo به عنوان گزینه متن‌باز برای workflowهای LLM red teaming نام می‌برد. فقط روی سیستم‌ها و دارایی‌هایی تست کنید که مالک آن هستید یا مجوز تست دارید.
  • Playbook انتشار داشته باشید: برای dataset تست smoke، harness دوگانه Chat/Responses و checklist triage متناسب با AvalAI، Red Teaming برای اپلیکیشن‌های هوش مصنوعی را ببینید.

کنترل انسانی و محصولی

  • Human-in-the-loop: برای خروجی‌های پرریسک، به‌ویژه پزشکی، حقوقی، مالی، امنیتی یا code generation، بازبینی انسانی را الزامی کنید.
  • ورودی و خروجی را محدود کنید: dropdown، شناسه‌های validateشده، retrieval از محتوای مورد اعتماد و max_output_tokens محدود را به generation کاملا آزاد ترجیح دهید.
  • مشتری خود را بشناسید: برای محصولات پرریسک login اجباری کنید و برای use caseهای مستعد سوءاستفاده verification قوی‌تر را در نظر بگیرید.
  • مسیر گزارش مشکل بدهید: راهی پایش‌شده برای گزارش خروجی ناایمن، نادرست یا سوءاستفاده‌آمیز فراهم کنید.
  • محدودیت‌ها را شفاف بگویید: به کاربران بگویید سیستم کجا ممکن است خطا کند، کجا بررسی انسانی لازم است و تصمیم‌های moderation چگونه قابل اعتراض هستند.

منابع مرتبط