Skip to content

Claude API使用

概述

Claude是Anthropic开发的大语言模型,以其出色的长文本处理能力、代码能力和安全性著称。本章将详细介绍Claude API的使用方法,包括Messages API、工具调用、长文本处理等核心功能。

环境准备

安装SDK

bash
pip install anthropic

配置API Key

python
import anthropic

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

环境变量配置:

bash
export ANTHROPIC_API_KEY="sk-ant-xxxxxxxxxxxxx"

Messages API

Messages API是Claude的核心接口,用于生成对话响应。

基础调用

python
from anthropic import Anthropic

client = Anthropic()

message = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    messages=[
        {"role": "user", "content": "介绍一下Python的装饰器"}
    ]
)

print(message.content[0].text)

参数详解

python
message = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=4096,
    system="你是一个专业的Python开发助手。",
    messages=[
        {"role": "user", "content": "如何实现单例模式?"}
    ],
    temperature=0.7,
    top_p=0.9,
    top_k=50,
    stop_sequences=["END", "\n\n\n"]
)

参数说明:

参数类型说明
modelstring模型名称
max_tokensint最大生成Token数(必填)
systemstring系统提示词
messagesarray对话消息列表
temperaturefloat控制随机性,0-1
top_pfloat核采样参数
top_kintTop-K采样
stop_sequencesarray停止序列

流式输出

python
with client.messages.stream(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    messages=[
        {"role": "user", "content": "写一个Python快速排序的实现"}
    ]
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)

获取完整响应:

python
with client.messages.stream(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    messages=[
        {"role": "user", "content": "解释一下递归"}
    ]
) as stream:
    final_message = stream.get_final_message()
    print(final_message.content[0].text)
    print(f"使用Token: {final_message.usage.output_tokens}")

多轮对话

python
messages = []

while True:
    user_input = input("你: ")
    if user_input.lower() in ["exit", "quit", "q"]:
        break
    
    messages.append({"role": "user", "content": user_input})
    
    response = client.messages.create(
        model="claude-3-5-sonnet-20241022",
        max_tokens=1024,
        system="你是一个友好的AI助手。",
        messages=messages
    )
    
    assistant_message = response.content[0].text
    messages.append({"role": "assistant", "content": assistant_message})
    
    print(f"Claude: {assistant_message}\n")

System Prompt

Claude的System Prompt独立于messages参数,更适合设置全局指令。

角色设定

python
response = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    system="""你是一位资深的前端开发工程师,专精于React和TypeScript。
    
    你的职责:
    - 提供高质量的代码示例
    - 遵循最佳实践
    - 解释技术原理
    - 指出潜在问题""",
    messages=[
        {"role": "user", "content": "如何优化React组件性能?"}
    ]
)

输出格式控制

python
response = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    system="""请以JSON格式输出结果,格式如下:
    {
        "title": "标题",
        "content": "内容",
        "tags": ["标签1", "标签2"]
    }""",
    messages=[
        {"role": "user", "content": "总结Python的特点"}
    ]
)

import json
result = json.loads(response.content[0].text)
print(json.dumps(result, indent=2, ensure_ascii=False))

安全性指导

python
response = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    system="""你是一个安全的AI助手。
    
    安全原则:
    1. 不提供有害、违法的内容
    2. 不泄露敏感信息
    3. 遇到不当请求时,礼貌拒绝并说明原因
    4. 提供准确、可靠的信息""",
    messages=[
        {"role": "user", "content": "如何学习编程?"}
    ]
)

视觉能力

Claude支持图像理解,可以分析图片内容。

图片URL

python
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": "这张图片展示了什么?"
                }
            ]
        }
    ]
)

print(message.content[0].text)

Base64图片

python
import base64

with open("image.png", "rb") as image_file:
    image_data = base64.b64encode(image_file.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": image_data
                    }
                },
                {
                    "type": "text",
                    "text": "描述这张图片的内容"
                }
            ]
        }
    ]
)

多图片分析

python
def encode_image(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.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("image1.png")
                    }
                },
                {
                    "type": "image",
                    "source": {
                        "type": "base64",
                        "media_type": "image/png",
                        "data": encode_image("image2.png")
                    }
                },
                {
                    "type": "text",
                    "text": "比较这两张图片的异同"
                }
            ]
        }
    ]
)

Tool Use(工具调用)

Claude支持工具调用,可以执行外部函数。

定义工具

python
tools = [
    {
        "name": "get_weather",
        "description": "获取指定城市的当前天气信息",
        "input_schema": {
            "type": "object",
            "properties": {
                "city": {
                    "type": "string",
                    "description": "城市名称,如:北京、上海"
                }
            },
            "required": ["city"]
        }
    },
    {
        "name": "calculate",
        "description": "执行数学计算",
        "input_schema": {
            "type": "object",
            "properties": {
                "expression": {
                    "type": "string",
                    "description": "数学表达式,如:2+2、3*4"
                }
            },
            "required": ["expression"]
        }
    }
]

工具调用流程

python
import json

def get_weather(city):
    weather_data = {
        "北京": {"temperature": 22, "condition": "晴"},
        "上海": {"temperature": 25, "condition": "多云"}
    }
    return json.dumps(weather_data.get(city, {"error": "未找到城市"}))

def calculate(expression):
    try:
        result = eval(expression)
        return json.dumps({"result": result})
    except Exception as e:
        return json.dumps({"error": str(e)})

message = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    tools=tools,
    messages=[
        {"role": "user", "content": "北京今天天气怎么样?"}
    ]
)

if message.stop_reason == "tool_use":
    for content in message.content:
        if content.type == "tool_use":
            tool_name = content.name
            tool_input = content.input
            
            if tool_name == "get_weather":
                result = get_weather(tool_input["city"])
                
                response = client.messages.create(
                    model="claude-3-5-sonnet-20241022",
                    max_tokens=1024,
                    tools=tools,
                    messages=[
                        {"role": "user", "content": "北京今天天气怎么样?"},
                        {"role": "assistant", "content": message.content},
                        {
                            "role": "user",
                            "content": [
                                {
                                    "type": "tool_result",
                                    "tool_use_id": content.id,
                                    "content": result
                                }
                            ]
                        }
                    ]
                )
                
                print(response.content[0].text)

强制使用工具

python
message = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    tools=tools,
    tool_choice={"type": "tool", "name": "get_weather"},
    messages=[
        {"role": "user", "content": "北京天气"}
    ]
)

长文本处理

Claude支持超长上下文(最高200K tokens),适合处理长文档。

文档分析

python
def read_file(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        return f.read()

document = read_file("long_document.txt")

response = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=4096,
    messages=[
        {
            "role": "user",
            "content": f"""请分析以下文档并提供:
            1. 文档摘要
            2. 核心观点
            3. 关键信息提取
            
            文档内容:
            {document}"""
        }
    ]
)

print(response.content[0].text)

文档问答

python
document = read_file("technical_doc.md")

while True:
    question = input("问题: ")
    if question.lower() in ["exit", "quit"]:
        break
    
    response = client.messages.create(
        model="claude-3-5-sonnet-20241022",
        max_tokens=1024,
        messages=[
            {
                "role": "user",
                "content": f"""根据以下文档回答问题。如果文档中没有相关信息,请说明。
                
                文档:
                {document}
                
                问题:{question}"""
            }
        ]
    )
    
    print(f"答案: {response.content[0].text}\n")

文档对比

python
doc1 = read_file("document_v1.txt")
doc2 = read_file("document_v2.txt")

response = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=2048,
    messages=[
        {
            "role": "user",
            "content": f"""比较以下两个文档的差异:
            
            文档1:
            {doc1}
            
            文档2:
            {doc2}
            
            请列出:
            1. 新增内容
            2. 删除内容
            3. 修改内容"""
        }
    ]
)

Prompt Caching

Claude支持Prompt缓存,可以节省成本和减少延迟。

使用缓存

python
response = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    system=[
        {
            "type": "text",
            "text": "你是一个专业的技术文档助手。",
            "cache_control": {"type": "ephemeral"}
        }
    ],
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": read_file("large_document.txt"),
                    "cache_control": {"type": "ephemeral"}
                },
                {
                    "type": "text",
                    "text": "总结这个文档"
                }
            ]
        }
    ]
)

print(f"缓存读取Token: {response.usage.cache_read_input_tokens}")
print(f"缓存写入Token: {response.usage.cache_creation_input_tokens}")

模型选择

模型上下文窗口特点适用场景
claude-3-5-sonnet200K平衡性能与成本通用场景
claude-3-opus200K最强性能复杂任务
claude-3-haiku200K最快速度简单任务

模型对比

python
models = [
    "claude-3-5-sonnet-20241022",
    "claude-3-opus-20240229",
    "claude-3-haiku-20240307"
]

question = "解释量子计算的基本原理"

for model in models:
    response = client.messages.create(
        model=model,
        max_tokens=1024,
        messages=[{"role": "user", "content": question}]
    )
    
    print(f"\n模型: {model}")
    print(f"输出Token: {response.usage.output_tokens}")
    print(f"延迟: {response.model}")
    print(f"回答: {response.content[0].text[:200]}...")

最佳实践

1. 明确的任务指令

python
response = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    system="你是一个代码审查专家。",
    messages=[
        {
            "role": "user",
            "content": """请审查以下代码并提供改进建议:
            
            ```python
            def calc(a,b):
                return a+b
            ```
            
            审查要点:
            1. 代码风格
            2. 类型安全
            3. 文档注释
            4. 错误处理"""
        }
    ]
)

2. 结构化输出

python
response = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    system="以Markdown格式输出,包含标题、列表和代码块。",
    messages=[
        {
            "role": "user",
            "content": "创建一个Python Web开发的入门指南"
        }
    ]
)

3. 分步思考

python
response = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=2048,
    system="请逐步思考问题,展示推理过程。",
    messages=[
        {
            "role": "user",
            "content": """设计一个电商网站的用户系统,需要考虑:
            1. 用户注册和登录
            2. 权限管理
            3. 安全性
            4. 性能优化
            
            请逐步分析并给出设计方案。"""
        }
    ]
)

成本优化

Token估算

python
def estimate_tokens(text):
    return len(text) // 4

document = "这是一段很长的文本..."
estimated_tokens = estimate_tokens(document)

print(f"预估Token数: {estimated_tokens}")
print(f"预估成本: ${estimated_tokens * 3 / 1_000_000:.6f}")

使用缓存策略

python
system_prompt = """你是一个专业的技术助手。
[大量静态内容...]
"""

response1 = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    system=[
        {
            "type": "text",
            "text": system_prompt,
            "cache_control": {"type": "ephemeral"}
        }
    ],
    messages=[{"role": "user", "content": "问题1"}]
)

response2 = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    system=[
        {
            "type": "text",
            "text": system_prompt,
            "cache_control": {"type": "ephemeral"}
        }
    ],
    messages=[{"role": "user", "content": "问题2"}]
)

print(f"第二次请求使用了缓存: {response2.usage.cache_read_input_tokens > 0}")

小结

本章详细介绍了Claude API的核心功能:

  1. Messages API - 基础对话接口,支持流式输出
  2. System Prompt - 强大的系统指令设置
  3. 视觉能力 - 图像理解和分析
  4. Tool Use - 工具调用扩展功能
  5. 长文本处理 - 200K上下文窗口,适合文档处理
  6. Prompt Caching - 缓存机制节省成本

Claude在长文本处理、代码能力和安全性方面表现出色,特别适合需要处理大量文档或进行复杂推理的场景。下一章将介绍国产大模型API的使用方法。

参考资源