去年双十一,我帮一个独立开发者朋友部署了他的 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
}
}
关键字段说明:
content:包含 Assistant 的所有输出,可能是 text 类型、tool_use 类型或 tool_result 类型stop_reason:响应终止原因,end_turn表示正常结束usage:记录本次请求消耗的 token 数量,用于成本控制
使用 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 的响应解析和结构化数据提取,本质上是三个核心问题的组合:理解响应结构、定义输出格式、处理异常情况。
在实际项目中,我建议:
- 优先使用
response_format强制 JSON Schema 输出,避免文本解析的不确定性 - 对高并发场景,一定要在客户端做速率限制和重试逻辑
- 生产环境务必记录 Token 消耗,便于成本分析和优化
- 考虑使用 HolySheep API,国内直连延迟低,汇率优势明显
希望这篇教程对你有帮助。如果在实际项目中遇到其他问题,欢迎在评论区留言交流。