加载中

当您需要 Claude 生成结构化数据(如 JSON、Python 代码或项目符号列表)时,您经常会遇到一个常见问题:Claude 想要提供帮助,并在您的内容周围添加解释性文本。虽然这通常很好,但有时您只需要原始数据,不需要其他任何内容。

设想您正在构建一个生成 AWS EventBridge 规则的网络应用。用户输入描述,点击生成,并期望看到可以立即复制使用的干净 JSON。如果 Claude 将 JSON 包装在带有解释性文本的 markdown 代码块中返回,用户就无法简单地复制整个响应——他们必须手动选择仅 JSON 部分。

默认响应的问题

默认情况下,当您要求 Claude 生成 JSON 时,您可能会得到类似这样的内容:

markdown
```json
\{
  "source": ["aws.ec2"],
  "detail-type": ["EC2 Instance State-change Notification"],
  "detail": \{
    "state": ["running"]
  \}
\}
```

This rule captures EC2 instance state changes when instances start running.

JSON 是正确的,但它被包装在 markdown 格式中,并包含解释性文本。对于用户需要复制原始 JSON 的网络应用来说,这会在用户体验中造成摩擦。

解决方案:助手消息预填充 + 停止序列

您可以将助手消息预填充与停止序列结合使用,以获得您想要的确切内容。其工作原理如下:

python
messages = []

add_user_message(messages, "Generate a very short event bridge rule as json")
add_assistant_message(messages, "```json")

text = chat(messages, stop_sequences=["```"])

这种技术的工作原理是:

  1. 用户消息告诉 Claude 要生成什么
  2. 预填充的助手消息使 Claude 认为它已经开始了一个 markdown 代码块
  3. Claude 继续只编写 JSON 内容
  4. 当 Claude 尝试用 ``` 关闭代码块时,停止序列会立即结束生成

结果是没有额外格式的干净 JSON:

json
{
  "source": ["aws.ec2"],
  "detail-type": ["EC2 Instance State-change Notification"],
  "detail": {
    "state": ["running"]
  }
}

处理响应

您可能会注意到响应中有一些额外的换行符。这些很容易处理:

python
import json

# 清理并解析 JSON
clean_json = json.loads(text.strip())

超越 JSON

这种技术不仅限于 JSON 生成。在您需要不带评论的结构化数据时随时使用它:

  • Python 代码片段
  • 项目符号列表
  • CSV 数据
  • 任何您只想要内容而不想要解释的格式化内容

关键是识别 Claude 自然想要用什么来包装您的内容,然后将其用作您的预填充和停止序列。对于代码,通常是 markdown 代码块。对于列表,可能是不同的格式标记。

这种方法使您能够精确控制 Claude 的输出格式,从而更容易将 AI 生成的内容集成到需要干净、结构化数据的应用程序中。