Claude & AI Agent 开发实战指南
从零基础到全栈 AI 工程师的完整路径 — 大模型原理、Token 机制、API 调用、Prompt Engineering、AI Agent 架构、RAG 系统、MCP 协议到生产级项目落地,一本手册搞定。
AI 大模型基础入门
0.1 什么是大语言模型(LLM)
从"查字典"到"理解语言" — AI 的进化史
在大模型出现之前,计算机处理语言的方式非常机械:程序员要手工编写规则("如果用户说'你好',就回答'您好'"),或者用统计方法统计词语出现频率。这些方法在面对真实世界的复杂语言时,很快就捉襟见肘。
🗂 规则系统(1950s-1990s)
手工编写语法规则,面对真实语言的多样性完全不够用。
📊 统计模型(1990s-2010s)
n-gram、HMM,通过统计词语共现概率预测下一个词。
🧠 神经网络(2013-2017)
Word2Vec、RNN/LSTM,让词语有了"语义距离"的概念。
⚡ Transformer + 预训练(2017至今)
GPT、BERT 开创了"大规模预训练 + 微调"的范式,LLM 时代开始。
大语言模型的本质:一个极其复杂的"下一个词预测器"
听起来很简单,但正是这个简单任务,催生了令人惊叹的智能。LLM 的训练目标就是:给定前面所有的词,预测下一个词的概率分布。
为了能准确预测下一个词,模型必须理解语法、语义、常识、逻辑、甚至情感。这就是为什么一个单纯预测词语的模型,最终展现出了"智能"的能力。
Transformer 架构:LLM 的心脏
2017 年 Google 发表了论文《Attention Is All You Need》,提出了 Transformer 架构,成为了几乎所有现代 LLM 的基础。它最核心的创新是自注意力机制(Self-Attention)。
预训练与微调:LLM 学习的两个阶段
📚 预训练(Pre-training)
在海量文本(互联网、书籍、代码)上学习语言规律,形成通用能力。代价:数千万美元的算力。
🎯 微调(Fine-tuning / RLHF)
在特定任务数据或人类反馈上继续训练,让模型"听话"、"安全"、"专业"。ChatGPT 背后的关键。
🧩 提示词工程(Prompting)
不改变模型权重,仅通过输入文本引导模型行为。成本极低,是开发者最常用的方式。
0.2 Token — AI 的基本计量单位
什么是 Token?
LLM 不是逐字处理文字,而是将文本拆分为 Token(词元)再处理。Token 是模型能识别的最小语言单元,既不完全等于"词",也不等于"字符"。
"ChatGPT is amazing" → ["Chat", "G", "PT", " is", " amazing"] = 5 tokens
通常 1 token ≈ 0.75 个英文单词,或 100 tokens ≈ 75 个单词。
"你好世界" → 4 tokens(约)
"Hello World" → 2 tokens
所以用英文 prompt 会更省钱,但要权衡准确度。
Token 的重要性
💰 直接决定成本
API 按 token 计费。每次请求 = 输入 token 数 × 输入单价 + 输出 token 数 × 输出单价。
📏 决定上下文长度
模型有最大 token 限制(上下文窗口)。超出则需截断,可能丢失关键信息。
⏱ 影响速度
输出 token 越多,响应越慢。生成 1000 tokens 比生成 100 tokens 慢约 10 倍。
如何估算 Token 数
大部分 AI 提供商提供 Tokenizer 工具,开发时可用于精确计算。下面是快速估算规则:
| 语言/内容 | 大致换算 | 举例 |
|---|---|---|
| 英文 | 1 token ≈ 4 个字符 / 0.75 个单词 | "artificial intelligence" = 3 tokens |
| 中文 | 1 个汉字 ≈ 1.5 tokens | "人工智能" ≈ 6 tokens |
| 代码 | 1 token ≈ 3-4 个字符 | 100 行代码 ≈ 600-800 tokens |
| 图片(Vision) | 按分辨率计算 | 1024×1024 图 ≈ 765-1500 tokens |
上下文窗口(Context Window)
上下文窗口是模型在一次请求中能"看到"的最大 token 数,包括输入 + 输出。超过这个限制,模型会"忘记"更早的内容。
| 模型 | 上下文窗口 | 约等于 |
|---|---|---|
| Claude 系列(Opus/Sonnet/Haiku) | 200K tokens | 约 15 万字 / 500 页书 |
| GPT-4o | 128K tokens | 约 10 万字 / 330 页书 |
| Gemini 1.5 Pro | 1M tokens | 约 75 万字 / 2500 页书 |
| Gemini 2.0 Flash | 1M tokens | 约 75 万字 / 2500 页书 |
0.3 模型参数量 — 理解模型规模
参数是什么?
神经网络本质上是一个巨大的数学函数,由数十亿个可调节的数值(参数/权重)构成。训练过程就是不断调整这些参数,让模型的预测越来越准确。
主流模型参数规模参考
| 参数量 | 代表模型 | 能力描述 | 部署需求 |
|---|---|---|---|
| 1B-7B | Llama-3.2-3B, Phi-3-mini | 基础对话,简单任务,速度快 | 普通笔记本可运行 |
| 7B-13B | Llama-3.1-8B, Mistral-7B | 日常任务良好,有一定推理能力 | 8GB 显存(消费级 GPU) |
| 30B-70B | Llama-3.3-70B, Qwen-2.5-72B | 复杂推理,接近 GPT-4 水平 | 2-4 块高端 GPU |
| 100B+ | GPT-4(未公开), Claude(未公开) | 顶级能力,专业任务表现卓越 | 大规模 GPU 集群 |
量化(Quantization):缩小模型大小的技巧
原始模型的每个参数使用 32 位浮点数(FP32)存储。量化将参数压缩到 8 位(INT8)甚至 4 位(INT4),使模型体积缩小 4-8 倍,只有轻微的性能损失。
| 精度 | 内存占用(以 7B 模型为例) | 性能损失 | 适用场景 |
|---|---|---|---|
| FP32(全精度) | ~28 GB | 无 | 训练 |
| FP16 / BF16 | ~14 GB | 极少 | 推理(服务器) |
| INT8 | ~7 GB | 很少 | 推理(高端消费 GPU) |
| INT4 / Q4 | ~3.5 GB | 轻微 | 本地运行(普通电脑) |
0.4 核心概念速查
Temperature — 控制输出的"创意度"
Temperature 是控制模型输出随机性的参数,范围通常为 0.0 到 1.0(部分模型到 2.0)。
| 值 | 行为 | 适用场景 |
|---|---|---|
0.0 | 完全确定性,每次输出相同 | 代码生成、数据提取、分类任务 |
0.3-0.5 | 轻微随机,以准确为主 | 翻译、总结、问答 |
0.7-0.9 | 适度创意 | 写作助手、头脑风暴、对话机器人 |
1.0+ | 高随机性、发散 | 创意写作、诗歌、多样化生成 |
Embedding(向量嵌入) — 把文字变成数字
Embedding 是将文字转换为数字向量的技术,使计算机能够计算文本之间的"语义距离"。这是 RAG(检索增强生成)系统的核心基础。
RLHF — 让 AI 变得"有用且安全"
Reinforcement Learning from Human Feedback(人类反馈强化学习)是将"好"与"坏"的人类判断注入模型训练的方法,是 ChatGPT、Claude 遵守指令、拒绝有害内容的关键技术。
1️⃣ 监督微调(SFT)
用高质量的人工撰写示例对模型进行微调,教会模型"怎么回答"。
2️⃣ 奖励模型(RM)
人类对模型的多个回答打分排名,训练一个"评委"模型。
3️⃣ PPO 强化学习
用奖励模型作为"反馈信号",不断优化主模型,使其获得更高分数。
RAG(检索增强生成)— 给 AI 接上"外部记忆"
LLM 的训练数据有截止日期,且无法记住公司内部文档。RAG 通过在回答前先从外部数据库检索相关内容,再让 LLM 基于检索结果生成回答,解决了这两个问题。
Hallucination(幻觉)— LLM 最大的缺陷
LLM 有时会自信地生成看起来合理但实际错误的内容,称为"幻觉"。因为模型只是在做概率预测,不具备真正的知识检索能力。
| 类型 | 示例 | 应对方法 |
|---|---|---|
| 事实幻觉 | 捏造不存在的引用文献 | RAG、要求模型引用来源 |
| 推理错误 | 复杂数学题计算错误 | Chain-of-Thought、代码执行 |
| 指令遗忘 | 长对话后忘记系统要求 | 定期重申 system prompt |
0.5 主流 AI 提供商全景 & 价格对比 必看
主要 AI 提供商与旗舰模型(2025-2026)
🟣 Anthropic — Claude 系列
以安全性和指令遵循见长,长文本处理出色,200K 上下文。编程和分析任务表现顶级。
🟢 OpenAI — GPT 系列
开创 ChatGPT 时代,生态最成熟,插件/工具调用最丰富,行业事实标准。
🔵 Google — Gemini 系列
超长上下文(1M tokens),原生多模态,与 Google 生态深度集成。
🟡 Meta — Llama 系列
开源免费,可本地部署,避免数据隐私问题,企业私有化部署首选。
⚪ Mistral — 开源高效模型
欧洲团队,开源旗舰性价比极高,Mistral Large 接近 GPT-4 水平。
🔴 阿里云 — Qwen 系列
中文能力最强,本土化优秀,开源版本可免费使用,商业版价格极低。
🟠 DeepSeek — R1/V3 系列
数学和代码能力突出,开源且成本极低,中国团队,近期表现震惊业界。
🟤 xAI — Grok 系列
马斯克旗下,实时联网(X平台数据),Grok-3 竞争顶级梯队。
2025-2026 主流模型 API 定价对比
| 提供商 | 模型 | 输入价格 $/1M tokens | 输出价格 $/1M tokens | 上下文 | 适用场景 |
|---|---|---|---|---|---|
| Anthropic | Claude Opus 4.6 | $15 | $75 | 200K | 最强推理/复杂任务 |
| Anthropic | Claude Sonnet 4.6 | $3 | $15 | 200K | 均衡推荐,日常首选 |
| Anthropic | Claude Haiku 4.5 | $0.8 | $4 | 200K | 高频轻量任务 |
| OpenAI | GPT-4o | $2.5 | $10 | 128K | 通用旗舰 |
| OpenAI | GPT-4o mini | $0.15 | $0.6 | 128K | 低成本高频 |
| OpenAI | o1 | $15 | $60 | 200K | 高级推理(慢) |
| Gemini 2.0 Flash | $0.1 | $0.4 | 1M | 超低成本、超长文 | |
| Gemini 1.5 Pro | $1.25 | $5 | 2M | 超长文档分析 | |
| DeepSeek | DeepSeek-V3 | $0.27 | $1.1 | 64K | 极低成本通用 |
| DeepSeek | DeepSeek-R1 | $0.55 | $2.19 | 64K | 数学/代码推理 |
| 阿里云 | Qwen-Max | ¥0.04/千tokens | ¥0.12/千tokens | 32K | 中文任务首选 |
| 阿里云 | Qwen-Long | ¥0.0005/千tokens | ¥0.002/千tokens | 10M | 超长文档/极低成本 |
成本计算实例
假设你要构建一个每日处理 10,000 次用户请求 的客服机器人,每次平均 输入 500 tokens + 输出 200 tokens:
| 模型 | 每日成本(美元) | 每月成本(美元) | 备注 |
|---|---|---|---|
| Claude Opus 4.6 | $18.75 | ~$563 | 最强效果,成本较高 |
| Claude Sonnet 4.6 | $4.5 | ~$135 | 推荐首选 |
| Claude Haiku 4.5 | $1.2 | ~$36 | 轻量任务最省钱 |
| GPT-4o mini | $0.195 | ~$5.85 | 极低成本,能力有限 |
| Gemini 2.0 Flash | $0.13 | ~$3.9 | 当前最便宜旗舰级 |
| DeepSeek-V3 | $0.355 | ~$10.65 | 国产高性价比 |
- Prompt Caching:对重复的 system prompt 使用缓存,可节省 80-90% 的输入成本(Claude 支持)
- 模型分级:简单问题用 Haiku,复杂问题再升级到 Sonnet/Opus
- 输出长度控制:明确要求"简洁回答",输出 token 通常比输入贵 3-5 倍
- 批量 API:非实时任务用 Batch API,价格是实时的 50%
0.6 如何选择适合的模型
决策树:选模型不再迷茫
按使用场景推荐
| 场景 | 推荐模型 | 理由 |
|---|---|---|
| 学习/个人项目 | Claude Sonnet 4.6 / GPT-4o | 能力强,有免费额度,生态好 |
| 高并发客服机器人 | Claude Haiku 4.5 / GPT-4o mini | 成本低,速度快,足够处理简单问题 |
| 代码辅助/编程Agent | Claude Sonnet 4.6 / DeepSeek-R1 | 代码能力顶尖 |
| 长文档分析(100页+) | Gemini 1.5 Pro / Claude Sonnet | 超长上下文窗口 |
| 中文内容生成 | Qwen-Max / Claude + 中文 prompt | 中文语感更自然 |
| 数据隐私/私有化部署 | Llama 3.3-70B / Qwen-2.5-72B | 开源,可本地运行 |
| 复杂科学推理 | Claude Opus 4.6 / o1 | 最强推理链 |
| 图片/多模态理解 | GPT-4o / Claude Sonnet(Vision) | 多模态能力成熟 |
Claude API 完全指南
1.1 API 快速入门 API
Claude 模型家族概览(2025-2026)
| 模型 | Model ID | 定位 | 上下文窗口 | 特点 |
|---|---|---|---|---|
| Claude Opus 4.6 | claude-opus-4-6 | 最强旗舰 | 200K | 最强推理与编程能力 |
| Claude Sonnet 4.6 | claude-sonnet-4-6 | 性能均衡 | 200K | 速度与智能的最佳平衡 |
| Claude Haiku 4.5 | claude-haiku-4-5-20251001 | 快速轻量 | 200K | 低延迟、低成本 |
Python
# === 安装 Anthropic Python SDK ===
# pip install anthropic
import anthropic
# 初始化客户端(API Key 从环境变量 ANTHROPIC_API_KEY 自动读取)
client = anthropic.Anthropic()
# === 最简单的 API 调用 ===
message = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[
{"role": "user", "content": "用一句话解释什么是Transformer架构?"}
]
)
print(message.content[0].text)
# 输出: "Transformer是一种基于自注意力机制的神经网络架构..."
# === 请求结构详解 ===
message = client.messages.create(
model="claude-sonnet-4-6", # 模型选择
max_tokens=2048, # 最大生成token数
temperature=0.7, # 0=确定性, 1=更随机创意
top_p=0.9, # 核采样(与temperature配合)
system="你是一位资深Python架构师,回答简洁专业。", # 系统提示
messages=[ # 对话消息列表
{"role": "user", "content": "FastAPI和Flask的区别?"}
],
stop_sequences=["\n\n---"], # 遇到这个序列就停止生成
)
# === 响应结构 ===
print(f"模型: {message.model}")
print(f"停止原因: {message.stop_reason}") # end_turn / max_tokens / stop_sequence
print(f"输入Token: {message.usage.input_tokens}")
print(f"输出Token: {message.usage.output_tokens}")
print(f"内容: {message.content[0].text}")
TypeScript
// === Node.js / TypeScript SDK ===
// npm install @anthropic-ai/sdk
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
async function main() {
const message = await client.messages.create({
model: "claude-sonnet-4-6",
max_tokens: 1024,
system: "你是一位全栈工程师。",
messages: [
{ role: "user", content: "如何设计一个高可用的微服务架构?" }
],
});
console.log(message.content[0].type === "text"
? message.content[0].text
: "非文本响应");
}
main();
cURL
# === REST API 直接调用 ===
curl https://api.anthropic.com/v1/messages \
-H "Content-Type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "Hello, Claude!"}
]
}'
1.2 多轮对话 API
对话状态管理
Claude API 是无状态的——每次请求都需要带上完整的对话历史。这和有状态的 WebSocket 聊天不同,你需要自己管理 messages 列表。
Python
import anthropic
client = anthropic.Anthropic()
class ChatSession:
"""管理多轮对话的会话类"""
def __init__(self, model="claude-sonnet-4-6", system_prompt=""):
self.model = model
self.system = system_prompt
self.messages = [] # 对话历史
self.total_tokens = 0 # token 用量追踪
def send(self, user_message: str) -> str:
"""发送消息并获取回复"""
self.messages.append({"role": "user", "content": user_message})
response = client.messages.create(
model=self.model,
max_tokens=2048,
system=self.system,
messages=self.messages,
)
assistant_text = response.content[0].text
self.messages.append({"role": "assistant", "content": assistant_text})
self.total_tokens += response.usage.input_tokens + response.usage.output_tokens
return assistant_text
def clear(self):
"""清空对话历史(开始新话题时使用)"""
self.messages = []
def get_context_length(self):
"""估算当前上下文长度"""
return sum(len(m["content"]) for m in self.messages) // 4 # 粗略估算
# === 使用示例 ===
chat = ChatSession(
system_prompt="你是一位数据库专家,擅长SQL优化和架构设计。请用中文回答。"
)
# 第一轮
reply1 = chat.send("如何优化一个慢查询?")
print(f"[Claude]: {reply1}")
# 第二轮(Claude记得之前的对话)
reply2 = chat.send("能给一个具体的索引优化例子吗?")
print(f"[Claude]: {reply2}")
# 第三轮(继续深入)
reply3 = chat.send("如果是联合索引呢?最左前缀原则是什么?")
print(f"[Claude]: {reply3}")
print(f"\n总Token消耗: {chat.total_tokens}")
Claude 支持 200K token 上下文,但更长的上下文意味着更高的成本和延迟。实践中常用以下策略:
- 滑动窗口:只保留最近N轮对话
- 摘要压缩:用 Claude 将长对话摘要成短文本
- 分层记忆:重要信息放system prompt,次要放messages
1.3 Tool Use / Function Calling 核心
让 Claude 调用你的代码
Tool Use 是构建 AI Agent 的基础能力。你定义工具的名称、描述和参数,Claude 判断何时需要使用工具,并生成调用参数。你的代码执行工具后,将结果返回给 Claude 继续处理。
Claude 并没有什么特殊的"判断逻辑代码", 它就是通过训练,学会了理解 "我能做什么 / 我不能做什么"
你发送的 Prompt 实际上包含:
┌─────────────────────────────────────┐
│ System Prompt(角色设定) │
│ + Tools 定义(工具列表) │
│ + 用户消息 │
└─────────────────────────────────────┘
// Tools 定义本质上就是一段 "特殊格式的文字",Claude 读懂了这段文字,才知道有哪些工具可用
↓
全部变成 Token
↓
Claude 预测下一个输出
Claude 内部的"推理"过程:
示例1:
Claude 看到:
1. 用户问:今天天气怎么样
2. 我有个工具叫 get_weather
描述是:获取实时天气信息
Claude 推理:
- 天气是实时数据 → 我的训练数据没有 ✗
- get_weather 工具描述匹配这个需求 ✓
- 结论:调用工具
示例2:
Claude 看到:
1. 用户问:什么是递归
2. 我有个工具叫 get_weather
Claude 推理:
- 递归是编程概念 → 我知道 ✓
- get_weather 和这个问题不相关 ✗
- 结论:直接回答
Python
import anthropic
import json
client = anthropic.Anthropic()
# === 定义工具 ===
tools = [
{
"name": "get_weather",
"description": "获取指定城市的当前天气信息。当用户询问天气时使用此工具。",
"input_schema": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称,如 '北京'、'上海'"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "温度单位,默认celsius"
}
},
"required": ["city"]
}
},
{
"name": "search_database",
"description": "在产品数据库中搜索商品信息。",
"input_schema": {
"type": "object",
"properties": {
"query": {"type": "string", "description": "搜索关键词"},
"category": {
"type": "string",
"enum": ["electronics", "clothing", "food"],
"description": "商品类别"
},
"max_results": {
"type": "integer",
"description": "最大返回数量,默认5",
"default": 5
}
},
"required": ["query"]
}
},
{
"name": "execute_python",
"description": "执行Python代码并返回结果。用于数学计算、数据处理等。",
"input_schema": {
"type": "object",
"properties": {
"code": {"type": "string", "description": "要执行的Python代码"}
},
"required": ["code"]
}
}
]
# === 工具执行函数 ===
def execute_tool(tool_name: str, tool_input: dict) -> str:
"""根据工具名称执行对应的操作"""
if tool_name == "get_weather":
# 实际项目中调用天气API
return json.dumps({
"city": tool_input["city"],
"temperature": 22,
"condition": "晴",
"humidity": "45%",
"wind": "东北风3级"
}, ensure_ascii=False)
elif tool_name == "search_database":
# 实际项目中查询数据库
return json.dumps({
"results": [
{"name": "iPhone 15 Pro", "price": 7999, "stock": 128},
{"name": "iPhone 15", "price": 5999, "stock": 256},
],
"total": 2
}, ensure_ascii=False)
elif tool_name == "execute_python":
try:
# 警告:生产环境务必用沙箱执行!
result = {}
exec(tool_input["code"], {"__builtins__": __builtins__}, result)
return str(result.get("output", "执行完成"))
except Exception as e:
return f"执行错误: {str(e)}"
return "未知工具"
# === 完整的 Tool Use 循环 ===
def chat_with_tools(user_message: str) -> str:
"""支持工具调用的完整对话函数"""
messages = [{"role": "user", "content": user_message}]
while True:
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=4096,
tools=tools,
messages=messages,
)
# 检查是否需要调用工具
if response.stop_reason == "tool_use":
# 收集所有工具调用
assistant_content = response.content
tool_results = []
for block in assistant_content:
if block.type == "tool_use":
print(f" [调用工具] {block.name}({json.dumps(block.input, ensure_ascii=False)})")
result = execute_tool(block.name, block.input)
tool_results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": result,
})
# 将工具调用和结果都加入对话历史
messages.append({"role": "assistant", "content": assistant_content})
messages.append({"role": "user", "content": tool_results})
else:
# 没有工具调用,返回最终文本
return response.content[0].text
# === 测试 ===
# result = chat_with_tools("北京今天天气怎么样?适合穿什么衣服?")
# print(result)
# Claude会先调用get_weather,然后基于天气数据给出穿衣建议
# result = chat_with_tools("帮我算一下 fibonacci(20) 的值")
# print(result)
# Claude会调用execute_python来计算
- 工具描述要清晰具体——Claude 根据描述决定是否调用
- 参数的
description字段很重要,帮助 Claude 生成正确参数 - 控制工具数量(通常不超过20个),过多工具会降低选择准确率
- 使用
tool_choice参数可以强制使用或禁止使用特定工具
1.4 Vision 多模态 多模态
Python
import anthropic
import base64
import httpx
client = anthropic.Anthropic()
# === 方式1:URL 图片 ===
message = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "url",
"url": "https://example.com/chart.png"
}
},
{
"type": "text",
"text": "请分析这张图表的数据趋势和关键发现。"
}
]
}]
)
# === 方式2:Base64 编码(本地图片) ===
def analyze_local_image(image_path: str, question: str) -> str:
with open(image_path, "rb") as f:
image_data = base64.standard_b64encode(f.read()).decode("utf-8")
# 根据文件扩展名判断类型
media_type = "image/png" if image_path.endswith(".png") else "image/jpeg"
message = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=2048,
messages=[{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": media_type,
"data": image_data,
}
},
{"type": "text", "text": question}
]
}]
)
return message.content[0].text
# === 实际应用场景 ===
# 1. 代码截图 → 代码文本(OCR + 理解)
# result = analyze_local_image("screenshot.png", "请将截图中的代码提取出来,修复其中的bug")
# 2. 架构图分析
# result = analyze_local_image("arch.png", "分析这个系统架构图,指出潜在的单点故障")
# 3. UI设计稿 → 前端代码
# result = analyze_local_image("design.png", "根据这个设计稿,用React + TailwindCSS实现")
# 4. 多张图片对比
# message = client.messages.create(
# model="claude-sonnet-4-6",
# max_tokens=2048,
# messages=[{
# "role": "user",
# "content": [
# {"type": "image", "source": {"type": "base64", ...}}, # 图1
# {"type": "image", "source": {"type": "base64", ...}}, # 图2
# {"type": "text", "text": "对比这两个版本的UI,列出主要差异"}
# ]
# }]
# )
1.5 Streaming 流式输出 实战
Python
import anthropic
client = anthropic.Anthropic()
# === 流式输出 — 提升用户体验的关键 ===
# 不需要等完整响应生成完才显示,实时逐字输出
# 方式1:with 语法(推荐)
with client.messages.stream(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": "写一首关于编程的诗"}],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
# 获取最终的完整消息
final_message = stream.get_final_message()
print(f"\n\n总Token: {final_message.usage.input_tokens + final_message.usage.output_tokens}")
# === 方式2:事件处理(更精细的控制) ===
with client.messages.stream(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello"}],
) as stream:
for event in stream:
if event.type == "content_block_delta":
if event.delta.type == "text_delta":
print(event.delta.text, end="")
elif event.type == "message_stop":
print("\n[生成完成]")
# === 在 Web 应用中使用 SSE 流式传输 ===
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
app = FastAPI()
@app.get("/chat/stream")
async def stream_chat(question: str):
def generate():
with client.messages.stream(
model="claude-sonnet-4-6",
max_tokens=2048,
messages=[{"role": "user", "content": question}],
) as stream:
for text in stream.text_stream:
yield f"data: {text}\n\n" # SSE格式
yield "data: [DONE]\n\n"
return StreamingResponse(generate(), media_type="text/event-stream")
1.6 Prompt Caching — 降低成本的利器 节省90%
Python
import anthropic
client = anthropic.Anthropic()
# === Prompt Caching ===
# 将不变的大段内容缓存起来,后续请求只计费增量部分
# 非常适合:长system prompt、RAG上下文、文档分析
# 假设有一个很长的系统提示(如公司规范文档)
long_system_prompt = """
你是XX公司的技术支持AI助手。以下是完整的产品文档:
...(假设这里有10000字的文档)...
"""
# 使用缓存标记
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
system=[
{
"type": "text",
"text": long_system_prompt,
"cache_control": {"type": "ephemeral"} # 标记为可缓存
}
],
messages=[{"role": "user", "content": "产品支持什么操作系统?"}],
)
# 第一次调用:正常计费,创建缓存
# 后续调用:缓存命中,system prompt部分降低90%费用!
print(f"缓存创建token: {response.usage.cache_creation_input_tokens}")
print(f"缓存命中token: {response.usage.cache_read_input_tokens}")
# === RAG 中的缓存使用 ===
# 将检索到的文档放在缓存区,用户后续追问时无需重新计算
rag_context = "从向量数据库检索到的相关文档内容..."
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[
{
"role": "user",
"content": [
{
"type": "text",
"text": f"参考文档:\n{rag_context}",
"cache_control": {"type": "ephemeral"}
},
{
"type": "text",
"text": "根据文档回答:产品的定价策略是什么?"
}
]
}
],
)