当您需要 Claude 生成结构化数据(如 JSON、Python 代码或项目符号列表)时,您经常会遇到一个常见问题:Claude 想要提供帮助,并在您的内容周围添加解释性文本、标题或 markdown 格式。当您只需要原始数据时,这些额外的注释会破坏用户体验。

设想构建一个生成 AWS EventBridge 规则的 Web 应用。用户输入描述,点击生成,并期望看到可以立即复制使用的干净 JSON。如果 Claude 返回的 JSON 被包裹在带有解释性文本的 markdown 代码块中,用户就无法简单地复制整个响应——他们必须手动选择仅 JSON 部分。
默认响应的问题
默认情况下,Claude 倾向于像这样格式化结构化输出:
# EventBridge Rule
```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 or stop.虽然这对文档编写很有用,但当您只需要 JSON 用于程序化使用时,这就成了问题。
解决方案:助手消息预填充 + 停止序列
您可以将助手消息预填充与停止序列结合使用,以获得您想要的确切内容。其工作原理如下:
messages = []
add_user_message(messages, "Generate a very short event bridge rule as json")
add_assistant_message(messages, "```json")
text = chat(messages, stop_sequences=["```"])这种技术的工作原理是:
- 用开头的 markdown 分隔符预填充助手消息
- 设置一个停止序列,当 Claude 尝试关闭代码块时停止生成
- 仅捕获这些分隔符之间的内容

幕后工作原理
当 Claude 收到您的请求时,它会看到预填充的助手消息,并假定自己已经开始编写 JSON 代码块。Claude 不会添加自己的标题和开头分隔符,而是直接跳到生成实际的 JSON 内容。
当 Claude 完成 JSON 并自然地想要用 ``` 关闭 markdown 代码块时,停止序列会立即停止生成并返回响应。您得到的只是 JSON 内容,没有额外的格式。
处理结果
返回的文本可能包含一些换行符,但您可以轻松清理它:
import json
# 解析为 JSON 以验证并格式化
parsed_data = json.loads(text.strip())
# 或者对于其他数据类型,只需去除空白字符
clean_text = text.strip()超越 JSON
这种技术不仅限于 JSON 生成。您可以将其用于任何结构化数据,只需要内容本身,而不需要 Claude 自然倾向添加的解释性文本:
- Python 代码片段
- 项目符号列表
- CSV 数据
- 配置文件
- 任何注重干净、可复制输出的格式
关键是识别 Claude 在您的内容类型周围自然会使用的分隔符,然后预填充开头分隔符,并在结尾分隔符处停止。这使您能够精确控制输出格式,同时利用 Claude 自然的格式化本能。