本页目录
下面介绍一种验证 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 FormatRespond with just the number:1or0
因为只返回一个 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,从而大幅节省成本