Anthropic
定义
Anthropic 是一家 AI 安全公司兼模型提供商,由前 OpenAI 研究人员于 2021 年创立。其核心论点是:构建有能力的 AI 模型和解决对齐问题是不可分割的目标——公司在追求前沿能力的同时,也开展 Constitutional AI、可解释性和模型内部机制理解等安全研究。这些研究的商业产品是 Claude 系列模型,通过 Anthropic API 和企业产品提供访问。
Claude 模型阵容遵循三级命名惯例,反映能力与成本的权衡:Opus(最高质量,复杂推理)、Sonnet(质量与速度平衡)和 Haiku(最快且最具成本效益)。截至 2025 年,当前一代为 Claude 3.7 Sonnet——具有扩展思考能力的旗舰模型——以及 Claude 3 Opus、Claude 3.5 Sonnet 和 Claude 3.5 Haiku。所有 Claude 3+ 模型都支持图像输入,整个系列围绕 200K token 上下文窗口设计,可以处理书籍、大型代码库和长对话历史而无需截断。
从平台角度来看,Anthropic 的 API 以 Messages API 为核心——一个专为多轮对话设计的简洁接口。平台包括工具使用(Anthropic 对函数调用的称呼)、扩展思考(可见的思维链推理)、提示缓存(降低大型重复上下文的成本和延迟)和批处理。Python SDK(anthropic)和 TypeScript SDK 是主要的客户端库。Claude 模型也可通过 Amazon Bedrock、Google Cloud Vertex AI 和企业合同(含数据驻留选项)获取。
工作原理
Messages API
Messages API(POST /v1/messages)是 Anthropic 的主要接口。与某些使用平坦 prompt 字符串的 API 不同,Messages API 以对话为中心:您发送一个包含交替 user 和 assistant 轮次的 messages 数组,以及一个用于设置上下文和角色的可选 system 参数。模型返回一个 Message 对象,其中包含一个 content 列表——默认为文本块,当模型决定调用工具时则为工具使用块。支持流式传输并推荐用于交互使用;SDK 同时提供流式助手和原始 SSE 访问。
工具使用
工具使用允许 Claude 通过发出结构化的 tool_use 内容块来调用外部函数。您在 tools 参数中将工具声明为 JSON schema。当 Claude 决定需要某个工具时,响应包含一个带有工具名称和输入的 tool_use 块;您的代码执行该函数并在下一个用户轮次中返回 tool_result。Claude 然后使用结果完成其响应。这种模式使得代理、代码执行环境、数据库查询和 API 集成成为可能,而无需模型直接访问任何系统。
扩展思考
扩展思考是 Claude 3.7 Sonnet 上可用的一种模式,允许模型在产生最终答案之前进行充分推理。当您设置 thinking: {type: "enabled", budget_tokens: N} 时,模型会发出包含其内部草稿的 thinking 内容块——类似于思维链,但是原生且结构化的。扩展思考显著提升了数学竞赛、复杂代码、多步推理以及需要仔细逐步分析的任务上的性能。思考 token 计入 token 预算,但在响应中可见,让您了解模型是如何得出答案的。
提示缓存
提示缓存显著降低了重复使用大型系统提示或文档上下文的工作负载的成本和延迟。您使用 cache_control: {type: "ephemeral"} 标记请求的前缀部分。在第一次调用时,Anthropic 在其基础设施上缓存提示前缀;与前缀匹配的后续调用以低 90% 的输入 token 成本和显著减少的首 token 时间从缓存提供服务。这对 RAG 管道(每次查询都传递大型上下文)、代理循环(每轮重复大型系统提示)和批量文档处理特别有价值。
长上下文(200K tokens)
所有 Claude 3 及更高版本的模型都支持 200K token 上下文窗口——相当于约 150,000 个单词或约 500 页文本。长上下文使得在单次调用中处理整个代码库、法律文件、研究论文或完整对话历史成为可能,无需分块。Anthropic 关于长上下文性能的研究("大海捞针"评估)表明,Claude 在整个 200K 范围内保持强大的召回准确率,使其在文档问答、合同分析和大型存储库代码审查方面可靠。这是 Anthropic 相对于 GPT-4o 128K 窗口最明显的差异化之一。
何时使用 / 何时不用
| 使用 Anthropic 的情况 | 避免或考虑替代方案的情况 |
|---|---|
| 需要 200K 上下文窗口来处理长文档、代码库或扩展对话而无需分块 | 工作负载需要图像生成、音频转录或文本转语音——Claude 仅支持文本/视觉;OpenAI 涵盖音频 |
| 安全约束和可预测的拒绝行为至关重要(合规、医疗、金融) | 需要用于自托管、微调或数据驻留的开放权重模型——Anthropic 不提供开放权重选项 |
| 需要扩展思考进行深度推理任务(数学、复杂代码、多步分析) | 主要用例是大规模嵌入生成——Anthropic 不提供嵌入 API |
| 提示缓存将有意义地降低成本(大型重复上下文、代理系统提示) | 严重依赖 OpenAI 特定工具(Assistants API、DALL-E、Whisper),这些工具没有 Anthropic 等效物 |
| 构建工具使用或计算机使用工作流,需要经过良好校准的结构化输出模型 | 需要规模化时的绝对最低成本每 token——Claude Haiku 在价格上有竞争力,但 GPT-4o-mini 和开放模型更便宜 |
对比
| 标准 | Anthropic | OpenAI | Google Gemini |
|---|---|---|---|
| 旗舰模型 | Claude 3.7 Sonnet | GPT-4o | Gemini 2.5 Pro |
| 上下文窗口 | 200K(所有 Claude 3+) | 128K(GPT-4o) | 最高 1M(Gemini 1.5 Pro) |
| 推理/思考 | 扩展思考(原生 CoT) | o1、o3 系列 | Gemini 2.5 Pro 思考 |
| 多模态输入 | 文本、图像 | 文本、图像、音频、视频 | 文本、图像、音频、视频 |
| 音频/语音 | 否 | 是(Whisper、TTS) | 是(Gemini) |
| 图像生成 | 否 | 是(DALL-E 3) | 是(Imagen) |
| 嵌入 API | 否 | 是 | 是 |
| 开放权重 | 否 | 否 | Gemma(部分) |
| 提示缓存 | 是(原生,9折优惠) | 上下文缓存(有限) | 是(Gemini) |
| 工具使用/函数调用 | 成熟,支持计算机使用 | 成熟,广泛采用 | 成熟 |
| 安全理念 | Constitutional AI,拒绝调优 | 审核 API,使用政策 | 负责任 AI 指南 |
| 数据驻留选项 | 企业合同 | 企业合同 | Google Cloud 区域 |
优缺点
| 优点 | 缺点 |
|---|---|
| 所有模型均有 200K 上下文窗口——长文档处理同类最佳 | 没有音频、语音或图像生成 API |
| 扩展思考为困难推理任务提供透明的思维链 | 没有嵌入 API——RAG 需要第二个提供商 |
| 提示缓存显著降低大型重复上下文的成本 | 没有开放权重选项的封闭模型 |
| 安全优先设计,具有仔细的拒绝校准和 Constitutional AI | 生态系统比 OpenAI 小——第三方教程和集成较少 |
| Computer use(测试版)可实现对桌面 GUI 的代理控制 | 对于简单任务,定价可能高于 GPT-4o-mini 或开放权重替代方案 |
代码示例
Messages API——基本完成和系统提示
import anthropic
client = anthropic.Anthropic(api_key="sk-ant-...") # or set ANTHROPIC_API_KEY env var
# Basic message
message = client.messages.create(
model="claude-3-7-sonnet-20250219",
max_tokens=1024,
system="You are a concise technical assistant. Answer in plain English.",
messages=[
{"role": "user", "content": "What is the Anthropic Messages API?"}
],
)
print(message.content[0].text)
# Multi-turn conversation
messages = [
{"role": "user", "content": "What is prompt caching?"},
{"role": "assistant", "content": "Prompt caching stores repeated large context..."},
{"role": "user", "content": "How much does it save?"},
]
response = client.messages.create(
model="claude-3-5-haiku-20241022",
max_tokens=512,
messages=messages,
)
print(response.content[0].text)
工具使用
import json
import anthropic
client = anthropic.Anthropic()
# Define tools as JSON schemas
tools = [
{
"name": "search_docs",
"description": "Search the documentation for a given query and return relevant passages.",
"input_schema": {
"type": "object",
"properties": {
"query": {"type": "string", "description": "Search query"},
"max_results": {"type": "integer", "default": 3},
},
"required": ["query"],
},
}
]
messages = [{"role": "user", "content": "How do I enable prompt caching?"}]
# First call — Claude may request a tool
response = client.messages.create(
model="claude-3-7-sonnet-20250219",
max_tokens=1024,
tools=tools,
messages=messages,
)
# Process tool calls
if response.stop_reason == "tool_use":
messages.append({"role": "assistant", "content": response.content})
tool_results = []
for block in response.content:
if block.type == "tool_use":
# Simulated tool execution
result = f"Prompt caching docs for '{block.input['query']}': use cache_control param..."
tool_results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": result,
})
messages.append({"role": "user", "content": tool_results})
# Final call with tool result
final = client.messages.create(
model="claude-3-7-sonnet-20250219",
max_tokens=1024,
tools=tools,
messages=messages,
)
print(final.content[0].text)
扩展思考
import anthropic
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-3-7-sonnet-20250219",
max_tokens=16000,
thinking={
"type": "enabled",
"budget_tokens": 10000, # tokens allocated for internal reasoning
},
messages=[{
"role": "user",
"content": (
"A train leaves city A at 9am traveling at 80 km/h. "
"Another train leaves city B (320 km away) at 10am traveling at 100 km/h. "
"At what time do they meet, and how far from city A?"
),
}],
)
for block in response.content:
if block.type == "thinking":
print("=== Model's internal reasoning ===")
print(block.thinking[:500], "...") # first 500 chars for brevity
elif block.type == "text":
print("=== Final answer ===")
print(block.text)
大型重复上下文的提示缓存
import anthropic
client = anthropic.Anthropic()
# Large document loaded once — cached after first call
large_document = open("contract.txt").read() # e.g., 50K tokens
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=1024,
system=[
{
"type": "text",
"text": "You are a legal document analyst. Answer questions based solely on the document provided.",
},
{
"type": "text",
"text": large_document,
"cache_control": {"type": "ephemeral"}, # mark for caching
},
],
messages=[{"role": "user", "content": "What are the termination clauses?"}],
)
print(response.content[0].text)
# usage.cache_creation_input_tokens — tokens cached this call (full price)
# usage.cache_read_input_tokens — tokens served from cache (10% price)
print(response.usage)
实用资源
- Anthropic API 参考 — 包含请求/响应 schema 和参数参考的完整端点文档
- Anthropic 提示工程指南 — 系统提示、思维链和特定任务技术的官方最佳实践
- Anthropic Cookbook — 涵盖工具使用、RAG、多模态、提示缓存和代理的可运行笔记本
- Claude 模型概览 — 当前模型 ID、上下文窗口、能力对比和弃用时间表
- GitHub 上的 Anthropic Python SDK — 源代码、变更日志、类型存根和迁移指南