AIHero
    Loading
    Updated Sep 11, 2025

    使用 Guardrail 保护 AI 应用

    使用 TypeScript 和 AI SDK,通过快速 LLM 验证保护 AI 应用。

    Matt Pocock
    Matt Pocock
    源代码
    本页目录

    下面介绍一种验证 LLM 应用传入请求的模式,用于确保请求安全。示例使用 TypeScript 和 AI SDK。

    快速模型方案

    最关键的部分位于 checkIsRequestSafe 函数中。核心思路是使用一个速度极快的模型,本例为 Gemini 2.0 Flash Lite。

    const checkIsRequestSafe = async (
    modelMessages: ModelMessage[],
    ) => {
    const guardrailResult = await generateText({
    model: google('gemini-2.0-flash-lite'),
    system: GUARDRAIL_SYSTEM,
    messages: modelMessages,
    });
    // The text will either be '0' or '1'
    const text = guardrailResult.text.trim();
    // If text is exactly '1', the request is safe.
    if (text === '1') {
    return true;
    }
    return false;
    };

    我们把当前为止的全部对话历史消息传给模型,并让它只返回一个 token,从而极快完成判断。这个过程发生在 guardrail 系统提示词.

    ## Response Format
    Respond with just the number:
    1
    or
    0

    因为只返回一个 token,所以运行速度非常快。接着可以执行命令式逻辑:如果文本恰好是 1,说明请求安全,于是可以返回 true.

    替代方案

    很多人在评论中指出,这里不一定必须使用 0 or 1,也可以使用一个单词。因为对 LLM 来说,底层实际生成的都是 token,数字也一样。

    因此,生成单词“safe”和生成单词“one”所需的时间完全相同。不过这是我最终采用的实现,效果很好。

    将文本流式传到前端

    接下来看看 streamTextToWriter 函数。只要需要把任意文本流式传到前端,它都会很有用。

    const streamTextToWriter = (
    writer: UIMessageStreamWriter,
    message: string,
    ) => {
    const id = crypto.randomUUID();
    writer.write({
    type: 'text-start',
    id,
    });
    writer.write({
    type: 'text-delta',
    id,
    delta: message,
    });
    writer.write({
    type: 'text-end',
    id,
    });
    };

    这里会流式发送三个部分: textStart, textDelta and textEnd,并且都使用相同的 id。坦率地说,这种写法相当冗长。我希望 AI SDK 能让它更简单一些,因为我们真正需要做的只是把这条消息流式传到前端。

    继续正常的流式输出

    最后,继续使用 writer 和模型消息进行流式输出。

    const continueStreaming = (
    writer: UIMessageStreamWriter,
    modelMessages: ModelMessage[],
    ) => {
    const streamTextResult = streamText({
    model: google('gemini-2.0-flash'),
    messages: modelMessages,
    });
    writer.merge(streamTextResult.toUIMessageStream());
    };

    这是一次普通的 streamText 调用,并把结果合并到 writer。

    快速 LLM 响应的应用场景

    这种利用极快 LLM 响应来驱动后续逻辑的方式,可以映射到许多不同用例:

    • 可以把它用作路由器,将某些请求交给更聪明的 LLM
    • 也可以把简单请求交给速度极快的 LLM,从而大幅节省成本