去年双十一,我帮一个独立开发者朋友部署了他的 AI 客服系统。第一天平稳度过,订单咨询响应流畅。但第二天促销高峰期,系统突然开始返回一堆难以解析的文本——订单状态、退款进度、商品信息全都混在一起。他的后端工程师花了两天时间重写解析逻辑,才勉强稳住。

这个场景让我意识到:Claude API 的响应解析和结构化数据提取,是每个接入 AI API 的开发者必须掌握的核心技能。本篇文章,我将结合实际项目经验,详细讲解如何高效解析 Claude API 响应并提取结构化数据,同时介绍如何通过 HolySheep API 获得更稳定的接入体验。

Claude API 响应结构详解

在与 Claude 进行交互时,API 返回的响应是一个结构化的 JSON 对象。理解这个对象的每一层结构,是进行数据提取的前提。

{
  "id": "msg_01XXXXXXXXXXXX",
  "type": "message",
  "role": "assistant",
  "content": [
    {
      "type": "text",
      "text": "您的订单已于11月10日发货,预计3天后送达。"
    },
    {
      "type": "tool_use",
      "id": "toolu_01XXXXXXXXXXXX",
      "name": "get_order_status",
      "input": {"order_id": "ORD123456"}
    }
  ],
  "model": "claude-sonnet-4-20250514",
  "stop_reason": "end_turn",
  "stop_sequence": null,
  "usage": {
    "input_tokens": 1205,
    "output_tokens": 342
  }
}

关键字段说明:

使用 JSON Schema 进行结构化输出

Claude API 支持通过 response_format 参数指定输出的 JSON Schema,这是提取结构化数据最可靠的方式。我在使用 HolySheep API 时,发现这个功能特别适合需要严格数据格式的业务场景。

import requests
import json

def query_claude_structured(prompt: str, api_key: str):
    """
    使用 JSON Schema 强制 Claude 输出结构化数据
    适合电商订单查询、产品信息提取等场景
    """
    url = "https://api.holysheep.ai/v1/messages"
    
    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json",
        "Anthropic-Version": "2023-06-01"
    }
    
    # 定义严格的输出 Schema
    schema = {
        "type": "object",
        "properties": {
            "order_status": {
                "type": "string",
                "enum": ["pending", "shipped", "delivered", "cancelled"]
            },
            "delivery_date": {"type": "string"},
            "tracking_number": {"type": "string"},
            "items": {
                "type": "array",
                "items": {
                    "type": "object",
                    "properties": {
                        "product_name": {"type": "string"},
                        "quantity": {"type": "integer"},
                        "price": {"type": "number"}
                    }
                }
            }
        },
        "required": ["order_status"]
    }
    
    payload = {
        "model": "claude-sonnet-4-20250514",
        "max_tokens": 1024,
        "messages": [
            {
                "role": "user",
                "content": f"""请分析以下用户查询并返回结构化数据:
                查询内容:{prompt}
                只返回 JSON,不要包含任何解释文字。"""
            }
        ],
        "response_format": {
            "type": "json_schema",
            "json_schema": schema
        }
    }
    
    response = requests.post(url, headers=headers, json=payload)
    data = response.json()
    
    # 提取 content 中的 text 部分并解析 JSON
    content_text = data["content"][0]["text"]
    return json.loads(content_text)

使用示例

api_key = "YOUR_HOLYSHEEP_API_KEY" result = query_claude_structured( "查询订单 ORD123456 的状态,包括商品明细和预计送达时间", api_key ) print(f"订单状态: {result['order_status']}") print(f"快递单号: {result['tracking_number']}")

实战:电商场景下的多层级数据提取

在实际电商项目中,我们往往需要从用户模糊的提问中提取多个维度的信息。以下代码展示了一个完整的处理流程,我在多个项目中验证过这种方案的稳定性。

import re
import json
from typing import Dict, List, Any
from dataclasses import dataclass
from datetime import datetime

@dataclass
class ExtractedOrderInfo:
    """结构化提取的订单信息"""
    order_id: str | None
    product_names: List[str]
    quantity: int
    date_mentioned: str | None
    intent: str  # refund / query / complaint / general

class ClaudeResponseParser:
    """
    Claude API 响应解析器
    支持:意图识别、实体提取、情感分析
    """
    
    def __init__(self, api_key: str):
        self.api_key = api_key
        self.base_url = "https://api.holysheep.ai/v1"
    
    def parse_customer_message(self, user_message: str) -> ExtractedOrderInfo:
        """
        从用户消息中提取结构化信息
        """
        import requests
        
        prompt = f"""你是一个电商客服助手。请从用户的提问中提取以下信息:
        1. 订单号(如果有)
        2. 提到的商品名称列表
        3. 总数量(如果提到)
        4. 提到的日期
        5. 用户意图:refund(退货退款)、query(查询)、complaint(投诉)、general(其他)
        
        用户消息:{user_message}
        
        返回格式(必须是有效JSON):
        {{
            "order_id": "订单号或null",
            "product_names": ["商品1", "商品2"],
            "quantity": 数字,
            "date_mentioned": "日期或null",
            "intent": "意图"
        }}
        只输出JSON,不要任何其他文字。"""
        
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json",
            "Anthropic-Version": "2023-06-01"
        }
        
        payload = {
            "model": "claude-sonnet-4-20250514",
            "max_tokens": 500,
            "messages": [{"role": "user", "content": prompt}]
        }
        
        response = requests.post(
            f"{self.base_url}/messages",
            headers=headers,
            json=payload
        )
        
        if response.status_code != 200:
            raise ValueError(f"API调用失败: {response.status_code} - {response.text}")
        
        result = response.json()
        raw_text = result["content"][0]["text"]
        
        # 清理可能的 markdown 代码块
        cleaned = re.sub(r'```json\s*', '', raw_text)
        cleaned = re.sub(r'```\s*$', '', cleaned)
        cleaned = cleaned.strip()
        
        parsed = json.loads(cleaned)
        return ExtractedOrderInfo(**parsed)
    
    def generate_reply(self, context: ExtractedOrderInfo, history: List[Dict]) -> str:
        """
        根据提取的信息生成客服回复
        """
        import requests
        
        system_prompt = """你是一个专业、友好的电商客服。回复要求:
        1. 清晰、专业
        2. 如涉及订单,必须提及具体订单号
        3. 如需等待人工处理,明确告知用户
        4. 字数控制在100字以内"""
        
        messages = [{"role": "system", "content": system_prompt}]
        messages.extend(history)
        messages.append({
            "role": "user",
            "content": f"基于以下信息生成回复:订单号={context.order_id}, "
                      f"商品={context.product_names}, 意图={context.intent}"
        })
        
        payload = {
            "model": "claude-sonnet-4-20250514",
            "max_tokens": 300,
            "messages": messages
        }
        
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json",
            "Anthropic-Version": "2023-06-01"
        }
        
        response = requests.post(
            f"{self.base_url}/messages",
            headers=headers,
            json=payload
        )
        
        return response.json()["content"][0]["text"]

使用示例

parser = ClaudeResponseParser("YOUR_HOLYSHEEP_API_KEY") user_input = "我上周买的蓝色卫衣,订单号ORD98765,尺码不对想退货" info = parser.parse_customer_message(user_input) print(f"意图识别: {info.intent}") # refund print(f"订单号: {info.order_id}") # ORD98765 print(f"商品: {info.product_names}") # ['蓝色卫衣']

流式响应的实时解析

对于长文本生成场景,流式响应(Streaming)可以显著提升用户体验。以下代码展示如何在接收流式响应的同时实时解析数据块。

import requests
import json
import sseclient  # pip install sseclient-py

def stream_and_parse(api_key: str, prompt: str):
    """
    流式调用 Claude API 并实时解析响应
    适合长文本生成、实时客服等场景
    """
    url = "https://api.holysheep.ai/v1/messages"
    
    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json",
        "Anthropic-Version": "2023-06-01"
    }
    
    payload = {
        "model": "claude-sonnet-4-20250514",
        "max_tokens": 2048,
        "messages": [{"role": "user", "content": prompt}],
        "stream": True
    }
    
    response = requests.post(url, headers=headers, json=payload, stream=True)
    
    # 使用 SSE 客户端解析流式响应
    client = sseclient.SSEClient(response)
    
    full_text = []
    token_count = 0
    
    print("开始接收响应...\n")
    
    for event in client.events():
        if event.data == "[DONE]":
            break
        
        chunk = json.loads(event.data)
        
        if chunk.get("type") == "content_block_delta":
            delta = chunk["delta"]
            if delta.get("type") == "text_delta":
                text = delta["text"]
                full_text.append(text)
                token_count += 1
                # 实时显示打字效果
                print(text, end="", flush=True)
    
    print(f"\n\n--- 统计 ---")
    print(f"总 Token 数: {token_count}")
    print(f"完整响应: {''.join(full_text)}")
    
    return "".join(full_text)

运行示例

result = stream_and_parse( "YOUR_HOLYSHEEP_API_KEY", "用300字介绍人工智能在电商客服领域的应用现状与趋势" )

基于 HolySheep API 的成本优化实践

在实际生产环境中,Token 消耗是成本的主要部分。我在项目中对比过多家 API 提供商,HolySheep AI 的汇率优势非常明显:¥1 = $1(官方汇率为 ¥7.3 = $1),这意味着使用 Claude Sonnet 4.5($15/MTok)时,实际成本仅为原来的 13.7%。

以下是一个完整的成本监控模块:

import requests
from datetime import datetime
from collections import defaultdict

class APICostTracker:
    """API 成本追踪器 - 实时监控 Token 消耗"""
    
    def __init__(self, api_key: str):
        self.api_key = api_key
        self.base_url = "https://api.holysheep.ai/v1"
        self.history = []
        
        # 2026 年主流模型价格($/MTok)
        self.pricing = {
            "claude-sonnet-4-20250514": 15.0,
            "gpt-4.1": 8.0,
            "gemini-2.5-flash": 2.50,
            "deepseek-v3.2": 0.42
        }
    
    def call_with_tracking(self, model: str, prompt: str) -> dict:
        """调用 API 并记录成本"""
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json",
            "Anthropic-Version": "2023-06-01"
        }
        
        payload = {
            "model": model,
            "max_tokens": 1024,
            "messages": [{"role": "user", "content": prompt}]
        }
        
        start_time = datetime.now()
        response = requests.post(
            f"{self.base_url}/messages",
            headers=headers,
            json=payload
        )
        
        result = response.json()
        end_time = datetime.now()
        
        # 提取 usage 信息
        usage = result.get("usage", {})
        input_tokens = usage.get("input_tokens", 0)
        output_tokens = usage.get("output_tokens", 0)
        
        # 计算成本(美元)
        cost_usd = (
            input_tokens * self.pricing.get(model, 15.0) / 1_000_000 +
            output_tokens * self.pricing.get(model, 15.0) / 1_000_000
        )
        
        # 转换人民币(HolySheep 汇率 1:1)
        cost_cny = cost_usd
        
        record = {
            "timestamp": start_time.isoformat(),
            "model": model,
            "input_tokens": input_tokens,
            "output_tokens": output_tokens,
            "latency_ms": (end_time - start_time).total_seconds() * 1000,
            "cost_usd": cost_usd,
            "cost_cny": cost_cny
        }
        
        self.history.append(record)
        return record
    
    def get_daily_report(self) -> dict:
        """生成日度成本报告"""
        today = datetime.now().date()
        today_records = [
            r for r in self.history 
            if datetime.fromisoformat(r["timestamp"]).date() == today
        ]
        
        if not today_records:
            return {"message": "今日暂无请求记录"}
        
        total_input = sum(r["input_tokens"] for r in today_records)
        total_output = sum(r["output_tokens"] for r in today_records)
        total_cost = sum(r["cost_cny"] for r in today_records)
        avg_latency = sum(r["latency_ms"] for r in today_records) / len(today_records)
        
        return {
            "日期": str(today),
            "请求次数": len(today_records),
            "输入 Token": total_input,
            "输出 Token": total_output,
            "总成本(¥)": round(total_cost, 4),
            "平均延迟(ms)": round(avg_latency, 2)
        }

使用示例

tracker = APICostTracker("YOUR_HOLYSHEEP_API_KEY")

执行多次调用

for i in range(5): result = tracker.call_with_tracking( "claude-sonnet-4-20250514", f"请简要回答:人工智能的三大核心技术是什么?(第{i+1}次测试)" ) print(f"调用 {i+1}: 消耗 ¥{result['cost_cny']:.4f}, 延迟 {result['latency_ms']:.0f}ms")

查看日报

print("\n=== 今日成本报告 ===") report = tracker.get_daily_report() for key, value in report.items(): print(f"{key}: {value}")

常见报错排查

在实际接入过程中,我整理了三个最常见的错误及解决方案,供大家参考。

错误一:400 Bad Request - Invalid JSON Schema

{
  "type": "error",
  "error": {
    "type": "invalid_request_error",
    "message": "response_format.json_schema is not valid: missing or invalid 'name' field"
  }
}

原因:JSON Schema 定义缺少 name 字段。

解决方案

# 错误的写法
"response_format": {
    "type": "json_schema",
    "json_schema": {
        "type": "object",
        "properties": {...}
    }
}

正确的写法(必须包含 name)

"response_format": { "type": "json_schema", "json_schema": { "name": "order_info", # 必须有这个字段 "schema": { "type": "object", "properties": {...} } } }

错误二:401 Unauthorized - Invalid API Key

{
  "type": "error",
  "error": {
    "type": "authentication_error",
    "message": "Invalid API token"
  }
}

原因:API Key 无效或未正确传递。

解决方案

# 检查点1:确认使用的是 HolySheep 的 Key

Key 格式应为 sk-... 开头

检查点2:确认请求头格式正确

headers = { "Authorization": f"Bearer {api_key}", # 注意是 Bearer,不是 Basic "Content-Type": "application/json", "Anthropic-Version": "2023-06-01" # 必须指定版本 }

检查点3:如果在国内访问,确保 base_url 正确

url = "https://api.holysheep.ai/v1/messages" # 不要使用 api.openai.com

完整验证代码

def verify_api_key(api_key: str) -> bool: import requests try: response = requests.post( "https://api.holysheep.ai/v1/messages", headers={ "Authorization": f"Bearer {api_key}", "Content-Type": "application/json", "Anthropic-Version": "2023-06-01" }, json={ "model": "claude-sonnet-4-20250514", "max_tokens": 10, "messages": [{"role": "user", "content": "hi"}] } ) return response.status_code == 200 except Exception as e: print(f"验证失败: {e}") return False print("API Key 验证结果:", verify_api_key("YOUR_HOLYSHEEP_API_KEY"))

错误三:429 Rate Limit Exceeded

{
  "type": "error",
  "error": {
    "type": "rate_limit_error",
    "message": "Rate limit exceeded. Please retry after 30 seconds."
  }
}

原因:请求频率超过限制,高并发场景下常见。

解决方案

import time
import requests
from ratelimit import limits, sleep_and_retry

@sleep_and_retry
@limits(calls=50, period=60)  # 每分钟最多 50 次
def call_with_rate_limit(api_key: str, prompt: str) -> dict:
    """带速率限制的 API 调用(需要 pip install ratelimit)"""
    url = "https://api.holysheep.ai/v1/messages"
    
    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json",
        "Anthropic-Version": "2023-06-01"
    }
    
    payload = {
        "model": "claude-sonnet-4-20250514",
        "max_tokens": 1024,
        "messages": [{"role": "user", "content": prompt}]
    }
    
    response = requests.post(url, headers=headers, json=payload)
    
    if response.status_code == 429:
        retry_after = int(response.headers.get("retry-after", 30))
        print(f"触发限流,等待 {retry_after} 秒...")
        time.sleep(retry_after)
        return call_with_rate_limit(api_key, prompt)  # 重试
    
    return response.json()

批量处理示例

queries = [f"查询订单{i}的状态" for i in range(100)] for i, query in enumerate(queries): try: result = call_with_rate_limit("YOUR_HOLYSHEEP_API_KEY", query) print(f"[{i+1}/100] 成功") except Exception as e: print(f"[{i+1}/100] 失败: {e}")

总结

Claude API 的响应解析和结构化数据提取,本质上是三个核心问题的组合:理解响应结构定义输出格式处理异常情况

在实际项目中,我建议:

希望这篇教程对你有帮助。如果在实际项目中遇到其他问题,欢迎在评论区留言交流。

👉 免费注册 HolySheep AI,获取首月赠额度