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"]
)参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| model | string | 模型名称 |
| max_tokens | int | 最大生成Token数(必填) |
| system | string | 系统提示词 |
| messages | array | 对话消息列表 |
| temperature | float | 控制随机性,0-1 |
| top_p | float | 核采样参数 |
| top_k | int | Top-K采样 |
| stop_sequences | array | 停止序列 |
流式输出
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-sonnet | 200K | 平衡性能与成本 | 通用场景 |
| claude-3-opus | 200K | 最强性能 | 复杂任务 |
| claude-3-haiku | 200K | 最快速度 | 简单任务 |
模型对比
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的核心功能:
- Messages API - 基础对话接口,支持流式输出
- System Prompt - 强大的系统指令设置
- 视觉能力 - 图像理解和分析
- Tool Use - 工具调用扩展功能
- 长文本处理 - 200K上下文窗口,适合文档处理
- Prompt Caching - 缓存机制节省成本
Claude在长文本处理、代码能力和安全性方面表现出色,特别适合需要处理大量文档或进行复杂推理的场景。下一章将介绍国产大模型API的使用方法。