Skip to content

🧠 Anthropic SDK 核心实战指南

本指南系统解析如何在实际业务中整合 Claude 的各项核心能力——从模型选型、参数调优,到流式输出、视觉多模态,再到作为 Agent 架构心脏的工具调用(Tool Use)。理论与代码结合,助您快速落地生产环境。

📥 配套实战 Notebook: Anthropic SDK 核心能力实战测试


一、快速开始与基础概念

要使用 Claude 的能力,首先需要安装官方的 Python SDK 并进行初始化设置。

bash
pip install anthropic python-dotenv
python
import os
from dotenv import load_dotenv
from anthropic import Anthropic

# 加载 .env 文件中的环境变量
load_dotenv()

# 初始化客户端,显式传入 api_key 和 base_url(常用于国内代理或第三方中转)
client = Anthropic(
    api_key=os.environ.get("ANTHROPIC_API_KEY", "your-api-key"),
    base_url=os.environ.get("ANTHROPIC_BASE_URL", "https://api.anthropic.com")
)

💡 依赖要求

Anthropic Python SDK 要求 Python >= 3.8(推荐 3.10+)。建议始终使用虚拟环境进行隔离。


二、消息格式 (Messages Format)

Claude 模型使用严格结构化的 Messages API 来替代早期的 Text Completions API。通过指定 role(如 userassistant),您可以轻松构建多轮对话。

python
response = client.messages.create(
    model="claude-haiku-4-5-20251001", # 推荐使用兼顾速度与极低成本的最新 Haiku 模型
    max_tokens=1000,
    messages=[
        {"role": "user", "content": "Hello, Claude!"},
        {"role": "assistant", "content": "Hello! How can I help you today?"},
        {"role": "user", "content": "Please write a short poem about Python."}
    ]
)

print(response)

API 返回的原始 Message 对象结构解析:

python
Message(
    id='msg_012WY...jCJzeg', 
    container=None,
    content=[TextBlock(
        citations=None, 
        text='(模型生成的诗歌文本内容...)', 
        type='text'
    )], 
    model='claude-haiku-4-5-20251001', 
    role='assistant', 
    stop_reason='end_turn', 
    stop_sequence=None, 
    type='message', 
    usage=Usage(
        cache_creation=CacheCreation(ephemeral_1h_input_tokens=0, ephemeral_5m_input_tokens=0), 
        cache_creation_input_tokens=0, 
        cache_read_input_tokens=0, 
        inference_geo='not_available', 
        input_tokens=34, 
        output_tokens=146, 
        server_tool_use=None, 
        service_tier='standard'
    )
)

实战关键点与信息提取:

  • 角色限制:对话通常必须以 user 角色开始。
  • 列表结构:入参的消息是以字典列表的形式传入的,能够精准控制多轮对话上下文。
  • 内容提取:实际开发中,内容往往包含在 TextBlock 中,通常通过 response.content[0].text 来剥离元数据直接提取纯文本。
  • Token 统计与缓存管理:最新的返回对象原生集成了 usage 维度的成本分析,不仅包含 input_tokensoutput_tokens,更全面暴露了 Prompt Caching(提示词缓存) 相关数据(如 cache_read_input_tokenscache_creation_input_tokens),这对于优化长文本开销至关重要。

三、核心模型选择 (Models)

Anthropic 围绕高智能、平衡性与极速低价构建了模型矩阵,并持续保持迭代。在 2026 年的生成式 AI 落地阶段,我们强烈建议重估不同模型的投入产出比(ROI):

模型层级定位标签常用 Model ID最适用场景与评估建议
👑 Opus 级重度推理claude-opus-4-20250514最高智能上限,主要用于复杂逻辑分析、长上下文深度任务和高容错率的架构设计。
🧠 Sonnet 级旗舰均衡claude-sonnet-4-20250514主力旗舰模型,在大多数场景对齐甚至超越前代最高级别,适合常规系统级任务和复杂编码。
⚡ Haiku 4.5极速低价推荐claude-haiku-4-5-20251001当前最具性价比的明星模型!速度极快、成本极低,编码质量和 Agentic 操作甚至能部分匹敌旧版高级模型。 强烈建议 将高频 API 请求、批量文档清洗与实时客服全部迁移至此。

四、核心参数调优 (Parameters)

除了必备的 modelmax_tokensmessages,还可以使用以下高级参数精调输出:

  • system: 系统提示词 ,用于设定 Claude 的人设或全局指令。
  • temperature: 控制输出的随机性(取值 0.0 到 1.0)。默认值为 1.0。代码生成建议降低至 0.0
  • top_p & top_k: 另一个维度的采样参数,一般与 temperature 二选一调整。
  • stop_sequences: 自定义停止标记列表(如 ["\n\nHuman:"]),模型生成到匹配字符串时立即终止。
  • metadata: 传入 user_id 等标识信息,用于 Anthropic 后台的使用追踪与滥用检测。
python
response = client.messages.create(
    model="claude-haiku-4-5-20251001",
    max_tokens=1000,
    temperature=0.2, # 降低随机性
    system="你是一个资深的 Python 架构师,代码要求极简且需包含注释。",
    messages=[
        {"role": "user", "content": "写一个基于 FastAPI 的接口。"}
    ]
)

print(response.content[0].text)

五、流式输出 (Streaming)

在构建实时聊天应用时, 流式输出 可以显著降低用户的首字响应时间 (TTFB)。SDK 提供了极其简便的流式封装:

python
with client.messages.stream(
    max_tokens=1000,
    model="claude-haiku-4-5-20251001",
    messages=[
        {"role": "user", "content": "Count from 1 to 10."}
    ]
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)

🎯 事件驱动流机制

text_stream 之外,您还可捕获原始事件分发(如 message_startcontent_block_delta 等),以便进行复杂的 UI 状态管理。


六、视觉能力 (Vision)

Claude 自 3 系列起原生内置视觉多模态能力,当前 4.x 系列同样完整支持。您可以将图片与其他文本指令一同作为 user 角色内容传递。

python
import base64

def get_base64_encoded_image(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode('utf-8')

# 这里假设您的同级目录下有一张名为 sample_image.png 的图片
# 请在实际运行时替换为您自己的真实图片路径
image_data = get_base64_encoded_image("sample_image.png")

response = client.messages.create(
    model="claude-haiku-4-5-20251001",
    max_tokens=1000,
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "image",
                    "source": {
                        "type": "base64",
                        "media_type": "image/png",
                        "data": image_data,
                    },
                },
                {"type": "text", "text": "描述这张图片中的主要内容。"}
            ]
        }
    ]
)

print("图片解析结果:", response.content[0].text)

支持格式:支持 image/jpegimage/pngimage/gifimage/webp。传递方式支持 Base64 编码(如上例)和 URL 直传"type": "url"),后者更适合网络图片场景。


七、工具调用 (Tool Use / Function Calling)

为 Claude 提供自定义工具(Tools),是将其从普通的对话模型升级为能够执行业务动作的 Agent(智能体)的核心。Anthropic SDK 提供了非常清晰的结构来定义和解析工具:

python
# 1. 定义工具结构规范 (严格符合 JSON Schema)
tools_schema = [
    {
        "name": "get_weather",
        "description": "获取指定城市的当前天气实况。",
        "input_schema": {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "城市或地区名称,例如:北京、东京 等"
                }
            },
            "required": ["location"]
        }
    }
]

# 2. 发起附带 tools 的消息请求
response = client.messages.create(
    model="claude-haiku-4-5-20251001",
    max_tokens=1000,
    tools=tools_schema,
    messages=[
        {"role": "user", "content": "帮我看看现在东京天气怎么样?"}
    ]
)

# 3. 拦截并解析模型的 Tool Use 意图
if response.stop_reason == "tool_use":
    for block in response.content:
        if block.type == "tool_use":
            print(f"🛠️ 模型触发工具调用: {block.name}")
            print(f"📥 提取到的结构化入参: {block.input}")
            # 此时 block.input 是一个字典,例如:{'location': '东京'}
            # 可以直接将其传给我们后端的真实获取天气函数

接下来,我们完成 Agent 闭环——将真实的函数执行结果回传给 Claude,让它生成最终的自然语言回答:

python
# 4. 模拟执行真实的业务函数
def get_weather(location):
    """模拟天气 API 调用(实际场景替换为真实接口)"""
    return f"{location}:晴,25°C,湿度 60%"

# 5. 提取 tool_use 信息并执行函数
tool_use_block = next(b for b in response.content if b.type == "tool_use")
weather_data = get_weather(tool_use_block.input["location"])

# 6. 将 tool_result 回传给 Claude,完成闭环
final_response = client.messages.create(
    model="claude-haiku-4-5-20251001",
    max_tokens=1000,
    tools=tools_schema,
    messages=[
        {"role": "user", "content": "帮我看看现在东京天气怎么样?"},
        {"role": "assistant", "content": response.content},
        {
            "role": "user",
            "content": [
                {
                    "type": "tool_result",
                    "tool_use_id": tool_use_block.id,
                    "content": weather_data,
                }
            ],
        },
    ],
)

print("🤖 最终回答:", final_response.content[0].text)

🎯 Agent 协同闭环

上述代码展示了 一次最经典的智能体工作流 :模型识别意图 → 触发工具调用 → 后端执行真实函数 → 将结果以 tool_result 回传 → 模型生成最终答案。多次迭代该循环即可构建复杂的多步骤 Agent。


八、生产环境最佳实践

8.1 异常处理与重试

在生产环境中,网络波动和限流是常态。SDK 内置了多种异常类型,建议统一捕获:

python
from anthropic import APIError, AuthenticationError, RateLimitError

try:
    response = client.messages.create(
        model="claude-haiku-4-5-20251001",
        max_tokens=1000,
        messages=[{"role": "user", "content": "Hello!"}]
    )
except AuthenticationError:
    print("❌ API Key 无效或已过期,请检查 ANTHROPIC_API_KEY 环境变量。")
except RateLimitError:
    print("⏳ 触发速率限制,请降低请求频率或联系 Anthropic 提升配额。")
except APIError as e:
    print(f"⚠️ API 异常: {e.status_code} - {e.message}")

⚠️ 超时配置

SDK 默认超时为 10 分钟 。对于低延迟场景,建议在初始化时显式设置:Anthropic(timeout=30.0)

8.2 异步调用

对于 Web 服务(如 FastAPI)等异步框架,应使用 AsyncAnthropic 以避免阻塞事件循环:

python
from anthropic import AsyncAnthropic

async_client = AsyncAnthropic(
    api_key=os.environ.get("ANTHROPIC_API_KEY"),
    base_url=os.environ.get("ANTHROPIC_BASE_URL", "https://api.anthropic.com")
)

# 用法与同步客户端完全一致,仅需 await
async def ask_claude(question: str) -> str:
    response = await async_client.messages.create(
        model="claude-haiku-4-5-20251001",
        max_tokens=1000,
        messages=[{"role": "user", "content": question}]
    )
    return response.content[0].text

← 返回 AI 知识库目录