思考加密 - Amazon Bedrock

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

思考加密

完整思考内容加密,并在签名字段中返回。此字段用于确保在传递回 API 时,Claude 生成了思考单元。流式处理响应时,通过 content_block_delta 事件中的 signature_delta,在 content_block_stop 事件即将发生前添加签名。

注意

只有在将工具与延伸思考结合使用时,才严格需要发送回思考单元。否则,您可以忽略之前回合中的思考单元,如果已经将思考单元传递回去,则可以让 API 为您删除它们。

如果发送回思考单元,为了保持一致性并避免潜在问题,我们建议将收到的所有内容都按原样发送回。

Claude 3.7 Sonnet 中的思考编校

注意

以下信息专门适用于 Claude 3.7 Sonnet。Claude 4 模型对思考的处理方式不同,不会生成编校后的思考单元。

在 Claude 3.7 Sonnet 中,以下情况适用:

  • 有时,我们的安全系统会标记 Claude 的内部推理。发生这种情况时,我们会加密部分或全部思考单元,然后将其作为 redacted_thinking 单元返回给您。redacted_thinking 单元在传递回 API 时会进行解密,使得 Claude 可以继续响应而不丢失上下文。

  • thinkingredacted_thinking 单元在响应中的文本单元之前返回。

在通过 Claude 3.7 Sonnet 构建使用延伸思考的面向客户的应用程序时,请考虑以下几点:

  • 请注意,经过编校的思考单元包含人类不可读的加密内容。

  • 您可以考虑提供一个简单的说明,例如:“出于安全考虑,Claude 的一些内部推理已被自动加密。这不会影响响应的质量。”

  • 如果您向用户展示思考单元,则可以在保留正常思考单元的同时筛选掉已编校的单元。

  • 有一点需要说明,使用延伸思考功能时,偶尔会导致某些推理被加密。

  • 实施相应的错误处理措施,以便在不破坏 UI 的情况下妥善地管理经过编校的思考。

以下示例显示了正常思考单元和经过编校的思考单元:

{ "content": [ { "type": "thinking", "thinking": "Let me analyze this step by step...", "signature":"WaUjzkypQ2mUEVM36O2TxuC06KN8xyfbJwyem2dw3URve/op91XWHOEBLLqIOMfFG/UvLEczmEsUjavL...." }, { "type": "redacted_thinking", "data":"EmwKAhgBEgy3va3pzix/LafPsn4aDFIT2Xlxh0L5L8rLVyIwxtE3rAFBa8cr3qpP..." }, { "type": "text", "text": "Based on my analysis..." } ] }
提示

在输出中可以看到,经过编校的思考单元表现出预期的行为。模型仍然可以使用此经过编校的推理来为其响应提供信息,同时保持安全护栏。

如果您需要测试应用程序对经过编校的思考的处理,可以使用这个特殊的测试字符串作为提示:ANTHROPIC_MAGIC_STRING_TRIGGER_REDACTED_THINKING_46C9A13E193C177646C7398A98432ECCCE4C1253D5E2D82641AC0E52CC2876CB

在多回合对话中,将 thinkingredacted_thinking 单元传回 API 时,对于最后一个助手回合,您必须包含完整的未修改单元来传递回 API。这对于维护模型的推理流至关重要。我们建议始终将所有思考单元传回给 API。有关详细信息,请参阅延伸思考结合工具使用

以下示例使用 InvokeModelWithResponseStream API,演示使用经过编校的思考词元时的请求和响应结构。

启用流式处理时,您会通过 thinking_delta 事件接收思考内容。以下是系统如何处理对思考使用流式处理的情况:

请求

{ "anthropic_version": "bedrock-2023-05-31", "max_tokens": 24000, "thinking": { "type": "enabled", "budget_tokens": 16000 }, "messages": [ { "role": "user", "content": "What is 27 * 453?" } ] }

响应

event: message_start data: {"type": "message_start", "message": {"id": "msg_01...", "type": "message", "role": "assistant", "content": [], "model": "claude-3-7-sonnet-20250219", "stop_reason": null, "stop_sequence": null}} event: content_block_start data: {"type": "content_block_start", "index": 0, "content_block": {"type": "thinking", "thinking": ""}} event: content_block_delta data: {"type": "content_block_delta", "index": 0, "delta": {"type": "thinking_delta", "thinking": "Let me solve this step by step:\n\n1. First break down 27 * 453"}} event: content_block_delta data: {"type": "content_block_delta", "index": 0, "delta": {"type": "thinking_delta", "thinking": "\n2. 453 = 400 + 50 + 3"}} // Additional thinking deltas... event: content_block_delta data: {"type": "content_block_delta", "index": 0, "delta": {"type": "signature_delta", "signature": "EqQBCgIYAhIM1gbcDa9GJwZA2b3hGgxBdjrkzLoky3dl1pkiMOYds..."}} event: content_block_stop data: {"type": "content_block_stop", "index": 0} event: content_block_start data: {"type": "content_block_start", "index": 1, "content_block": {"type": "text", "text": ""}} event: content_block_delta data: {"type": "content_block_delta", "index": 1, "delta": {"type": "text_delta", "text": "27 * 453 = 12,231"}} // Additional text deltas... event: content_block_stop data: {"type": "content_block_stop", "index": 1} event: message_delta data: {"type": "message_delta", "delta": {"stop_reason": "end_turn", "stop_sequence": null}} event: message_stop data: {"type": "message_stop"}