文章摘要
加载中...|
此内容根据文章生成,并经过人工审核,仅用于文章内容的解释与总结 投诉

概述

Anthropic 的 Claude 模型是 GPT 系列的有力竞争者,以其出色的长上下文能力和安全性著称。本文将深入介绍 Claude API 的使用技巧和最佳实践。

Claude 系列模型

模型对比

text
┌─────────────────────────────────────────────────────────┐
│                   Claude 模型家族                         │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  Claude 3.5 系列                                         │
│  ├── Claude 3.5 Sonnet: 最新旗舰,平衡性能和成本           │
│  └── Claude 3.5 Haiku: 即将推出                           │
│                                                         │
│  Claude 3 系列                                           │
│  ├── Claude 3 Opus: 最强能力,复杂任务                    │
│  ├── Claude 3 Sonnet: 平衡性能和成本                      │
│  └── Claude 3 Haiku: 快速,轻量任务                       │
│                                                         │
│  特点                                                    │
│  • 200K token 上下文(最大)                              │
│  • 优秀的长文本处理能力                                    │
│  • Constitutional AI(安全对齐)                          │
│  • 多模态支持(图像)                                     │
│                                                         │
└─────────────────────────────────────────────────────────┘

模型选择建议

使用场景推荐模型理由
复杂推理claude-3-5-sonnet-20241022最强推理
长文档分析claude-3-5-sonnet200K 上下文
快速响应claude-3-haiku低延迟
多轮对话claude-3-5-sonnet最佳对话能力
代码生成claude-3-5-sonnet代码能力强
图像理解claude-3-5-sonnet原生视觉

Claude API 使用指南

安装与配置

bash
# 安装 SDK
pip install anthropic

# 设置 API Key
export ANTHROPIC_API_KEY="your-api-key"
python
import anthropic

client = anthropic.Anthropic(api_key="your-api-key")

基础用法

python
# 单次对话
message = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    messages=[
        {
            "role": "user",
            "content": "用 Python 写一个快速排序算法"
        }
    ]
)

print(message.content[0].text)

多轮对话

python
# 对话历史
messages = [
    {"role": "user", "content": "我叫小明"},
    {
        "role": "assistant",
        "content": "你好小明!很高兴认识你。"
    }
]

# 新问题
messages.append({
    "role": "user",
    "content": "我叫什么名字?"
})

message = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    messages=messages
)

print(message.content[0].text)
# 输出:你叫小明。

流式输出

python
# 流式响应
with client.messages.stream(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    messages=[{"role": "user", "content": "讲一个短故事"}]
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)

# 或者使用事件流
for event in client.messages.stream(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    messages=[{"role": "user", "content": "讲一个短故事"}):
    if event.type == "content_block_delta":
        print(event.delta.text, end="", flush=True)

系统提示

python
message = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    system="你是一个专业的 Python 程序员,只提供代码,不做额外解释。",
    messages=[
        {"role": "user", "content": "写一个快排算法"}
    ]
)

print(message.content[0].text)

长上下文处理

200K Token 上下文

python
# 处理长文档
def analyze_long_document(document_path: str):
    """分析长文档(利用 Claude 的 200K 上下文)"""

    # 读取文档
    with open(document_path) as f:
        long_text = f.read()

    # Claude 可以一次性处理整个文档
    message = client.messages.create(
        model="claude-3-5-sonnet-20241022",
        max_tokens=4096,
        system="你是一个专业的文档分析师。",
        messages=[
            {
                "role": "user",
                "content": f"""请分析以下文档的主要内容、关键观点和结论:

{long_text}

请提供结构化的分析结果。"""
            }
        ]
    )

    return message.content[0].text

上下文窗口优化

python
# 对于超长内容,使用分块策略
def process_very_long_content(text: str, question: str):
    """处理超长内容"""

    # 分块
    from langchain.text_splitter import RecursiveCharacterTextSplitter

    splitter = RecursiveCharacterTextSplitter(
        chunk_size=50000,  # 每块约 12.5K tokens
        chunk_overlap=1000
    )

    chunks = splitter.split_text(text)

    # 第一轮:摘要每个块
    summaries = []
    for i, chunk in enumerate(chunks):
        message = client.messages.create(
            model="claude-3-haiku-20240307",  # 用 Haiku 节省成本
            max_tokens=1000,
            messages=[{
                "role": "user",
                "content": f"摘要以下内容:\n\n{chunk}"
            }]
        )
        summaries.append(message.content[0].text)

    # 第二轮:基于摘要回答
    combined_summary = "\n\n".join(summaries)

    message = client.messages.create(
        model="claude-3-5-sonnet-20241022",
        max_tokens=2048,
        messages=[{
            "role": "user",
            "content": f"""基于以下文档摘要回答问题:

摘要:
{combined_summary}

问题: {question}"""
        }]
    )

    return message.content[0].text

多模态支持

图像理解

python
import base64

def encode_image(image_path: str) -> str:
    """编码图像为 base64"""
    with open(image_path, "rb") as f:
        return base64.b64encode(f.read()).decode("utf-8")

# 分析图像
message = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "image",
                    "source": {
                        "type": "base64",
                        "media_type": "image/png",
                        "data": encode_image("chart.png")
                    }
                },
                {
                    "type": "text",
                    "text": "请分析这个图表中的数据趋势。"
                }
            ]
        }
    ]
)

print(message.content[0].text)

图像 URL

python
# 使用公开 URL
message = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "image",
                    "source": {
                        "type": "url",
                        "url": "https://example.com/image.jpg"
                    }
                },
                {
                    "type": "text",
                    "text": "描述这张图片。"
                }
            ]
        }
    ]
)

多图像分析

python
# 分析多张图片
message = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=2048,
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "image",
                    "source": {
                        "type": "base64",
                        "media_type": "image/jpeg",
                        "data": encode_image("image1.jpg")
                    }
                },
                {
                    "type": "image",
                    "source": {
                        "type": "base64",
                        "media_type": "image/jpeg",
                        "data": encode_image("image2.jpg")
                    }
                },
                {
                    "type": "text",
                    "text": "比较这两张图片的异同。"
                }
            ]
        }
    ]
)

Prompt 优化技巧

Claude Prompt 最佳实践

python
# 1. 使用清晰的指令
bad_prompt = "分析这个"

good_prompt = """请分析以下文本,并提供:
1. 主要观点总结
2. 关键论据
3. 潜在问题

文本:
{text}
"""

# 2. 使用 XML 标签组织复杂 Prompt
structured_prompt = """<task>
分析以下文档的财务风险
</task>

<document>
{document}
</document>

<output_format>
JSON 格式,包含:
- risk_level: "low" | "medium" | "high"
- factors: 风险因素列表
- recommendations: 建议措施
</output_format>
"""

# 3. 使用示例(少样本)
few_shot_prompt = """示例 1:
输入:我喜欢苹果
输出:情感:积极

示例 2:
输入:这个产品质量很差
输出:情感:消极

现在分析:
输入:{text}
输出:"""

message = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1000,
    messages=[{"role": "user", "content": few_shot_prompt}]
)

思维链提示

python
# Claude 善于思维链推理
chain_of_thought = """请逐步思考以下问题,然后给出答案。

问题:{question}

请按以下格式回答:
思考过程:
[你的推理步骤]

答案:
[最终答案]
"""

# 用于复杂推理
complex_reasoning = """这是一个需要仔细推理的问题。请:
1. 理解问题的核心
2. 识别关键信息
3. 考虑可能的解决方案
4. 评估每种方案的利弊
5. 给出最佳答案

问题:{question}"""

Claude Artifacts

Artifacts 是 Claude 的一个功能,可以生成独立的代码片段、文档等。

python
# Artifacts 通常在 Claude.ai 网页界面中使用
# API 中可以通过特定格式触发

artifact_prompt = """请创建一个可交互的 HTML 组件,用于展示数据图表。

要求:
- 使用 Chart.js
- 支持数据更新
- 响应式设计

将代码包裹在 <artifact> 标签中。"""

message = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=4096,
    messages=[{"role": "user", "content": artifact_prompt}]
)

成本与性能对比

价格对比(美元/1M tokens)

模型输入输出上下文
claude-3-5-sonnet$3$15200K
claude-3-opus$15$75200K
claude-3-sonnet$3$15200K
claude-3-haiku$0.25$1.25200K

与 GPT-4 对比

指标Claude 3.5 SonnetGPT-4o
上下文200K tokens128K tokens
输入价格$3/M$5/M
输出价格$15/M$15/M
视觉能力优秀优秀
代码能力非常强非常强
安全性Constitutional AIModeration API

成本优化

python
# 1. 根据任务选择模型
def get_model_for_task(task_complexity: str) -> str:
    """根据任务复杂度选择模型"""
    models = {
        "simple": "claude-3-haiku-20240307",      # 简单任务
        "medium": "claude-3-sonnet-20240229",      # 中等任务
        "complex": "claude-3-5-sonnet-20241022"    # 复杂任务
    }
    return models.get(task_complexity, "claude-3-5-sonnet-20241022")

# 2. 使用缓存(Claude 支持 Prompt 缓存)
# 缓存的 Prompt 块在多次调用中只计费一次

cached_message = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    system=[
        {
            "type": "text",
            "text": "长系统提示词...",
            "cache_control": {"type": "ephemeral"}  # 标记为可缓存
        }
    ],
    messages=[
        {
            "role": "user",
            "content": "用户问题"
        }
    ]
)

企业级部署

错误处理

python
from anthropic import Anthropic, APIError, APITimeoutError
import time

class RobustClaudeClient:
    """健壮的 Claude 客户端"""

    def __init__(self, api_key: str):
        self.client = Anthropic(api_key=api_key)

    def create_message_with_retry(
        self,
        model: str,
        messages: list,
        max_retries: int = 3
    ):
        """带重试的消息创建"""
        for attempt in range(max_retries):
            try:
                return self.client.messages.create(
                    model=model,
                    max_tokens=4096,
                    messages=messages
                )
            except APIError as e:
                if attempt < max_retries - 1:
                    wait_time = 2 ** attempt
                    print(f"API 错误,{wait_time}秒后重试...")
                    time.sleep(wait_time)
                else:
                    raise
            except APITimeoutError as e:
                if attempt < max_retries - 1:
                    print("超时,重试...")
                    time.sleep(1)
                else:
                    raise

批量处理

python
def batch_process(
    client: Anthropic,
    prompts: list[str],
    batch_size: int = 10
) -> list:
    """批量处理 Prompt"""
    results = []

    for i in range(0, len(prompts), batch_size):
        batch = prompts[i:i + batch_size]

        for prompt in batch:
            message = client.messages.create(
                model="claude-3-5-sonnet-20241022",
                max_tokens=1024,
                messages=[{"role": "user", "content": prompt}]
            )
            results.append(message.content[0].text)

    return results

安全与合规

python
# Claude 内置了安全机制,但额外防护总是好的

def moderate_output(text: str) -> dict:
    """检查输出内容"""
    # 使用 Claude 自己审核
    message = client.messages.create(
        model="claude-3-haiku-20240307",
        max_tokens=100,
        messages=[{
            "role": "user",
            "content": f"""检查以下内容是否包含:
1. 有害信息
2. 个人信息
3. 偏见内容

内容:{text}

返回 JSON 格式的检查结果。"""
        }]
    )

    # 解析结果
    return json.loads(message.content[0].text)

小结

Claude 是强大的 LLM 选择:

核心要点

  1. 模型特点

    • 200K 超长上下文
    • Constitutional AI 安全机制
    • 出色的代码和推理能力
  2. API 使用

    • Messages API 简洁易用
    • 流式输出支持良好
    • 多模态原生支持
  3. 优化技巧

    • 根据任务选择模型
    • 使用 Prompt 缓存
    • XML 标签组织复杂 Prompt
  4. 成本考虑

    • Haiku 最经济
    • Sonnet 平衡性能成本
    • Opus 最高质量
  5. 实践建议

    • 利用长上下文处理文档
    • 使用思维链提高推理质量
    • 实施完善的错误处理

下一篇文章将介绍 Google Gemini 落地实践。

赞赏博主
评论 隐私政策