Skip to content

秘籍:内容审查

问题: 用户可能会尝试让你的机器人说出攻击性的话(越狱)或生成有害内容。 解决方案: 使用审查 API (Moderation API) 过滤输入和输出。

1. 使用 OpenAI 审查 API

OpenAI 提供了一个免费的端点来检查仇恨、暴力和自残内容。

typescript
import OpenAI from 'openai';

const openai = new OpenAI();

async function checkSafety(input: string) {
  const moderation = await openai.moderations.create({ input });
  const result = moderation.results[0];

  if (result.flagged) {
    const categories = Object.keys(result.categories)
      .filter(key => result.categories[key])
      .join(', ');
      
    throw new Error(`内容违反政策: ${categories}`);
  }
  
  return true;
}

2. 在 API 路由中实现

在调用 LLM 之前 运行检查。

typescript
// app/api/chat/route.ts
export async function POST(req: Request) {
  const { messages } = await req.json();
  const lastMessage = messages[messages.length - 1];

  // 1. 检查输入
  try {
    await checkSafety(lastMessage.content);
  } catch (e) {
    return new Response(e.message, { status: 400 });
  }

  // 2. 生成响应
  const result = await streamText({ ... });
  
  return result.toDataStreamResponse();
}

3. 结构化验证 (Zod)

防止试图破坏 JSON 结构的“提示注入”攻击。

typescript
import { z } from 'zod';

// 定义严格的模式
const UserProfileSchema = z.object({
  username: z.string().min(3).max(20),
  bio: z.string().max(100).refine(val => !val.includes('ignore previous instructions')),
});

检查清单

  • [ ] 使用审查 API 检查用户输入。
  • [ ] 检查 AI 输出(可选,会增加延迟)。
  • [ ] 限制输入长度(最大字符数)以防止 Token 耗尽攻击。