Claude 模型实战:Anthropic 的安全对话助手
FreeGuideOnline
最新
2026-06-22
bash pip install anthropic
### 设置鉴权与客户端
```python
import anthropic
client = anthropic.Anthropic(api_key="your-api-key-here")
实际部署时,请将密钥放入环境变量:
import os
client = anthropic.Anthropic(api_key=os.environ.get("ANTHROPIC_API_KEY"))
发送第一条消息
以下调用使用 claude-3-haiku-20240307 模型,成本低、响应快:
message = client.messages.create(
model="claude-3-haiku-20240307",
max_tokens=500,
temperature=0.7,
system="你是一位友好的编程助手,请使用中文回答。",
messages=[
{"role": "user", "content": "用 Python 写一个斐波那契数列生成器"}
]
)
print(message.content[0].text)
参数说明:
model:指定模型 ID,可替换为claude-3-sonnet-20240229或claude-3-opus-20240229。max_tokens:模型最多输出的 token 数量,防止过长响应。temperature:控制随机性,0.0 为确定性输出,1.0 为最大创意。system:系统提示词,设定整体角色和行为。messages:对话消息列表,必须包含role(user或assistant)和content。
多轮对话管理
Claude API 支持多轮对话上下文,只需按顺序保留之前的用户与助手消息即可:
history = [
{"role": "user", "content": "你好,请问你可以做什么?"},
{"role": "assistant", "content": "你好!我可以回答各类问题、创作文案、写代码、解释概念……"}
]
new_question = {"role": "user", "content": "帮我写一首关于春天的五言绝句"}
history.append(new_question)
response = client.messages.create(
model="claude-3-sonnet-20240229",
max_tokens=300,
messages=history
)
# 将助手回复也加入历史
assistant_reply = response.content[0].text
history.append({"role": "assistant", "content": assistant_reply})
注意:当前会话的上下文窗口很大(200K tokens),但过长的历史会增加费用和延迟。实际应用中可只保留最近几轮对话,或通过摘要压缩历史。
系统提示词设计技巧
系统提示词(system prompt)是控制 Claude 行为的关键。一份好的提示词应包含:
- 角色定义:明确 Claude 的身份,如“你是一个专业的法律顾问”。
- 语气风格:指定友好、正式、简洁等语调。
- 行为边界:说明哪些话题应拒绝或谨慎回应。
- 输出格式:要求以 JSON、Markdown 或列表形式输出。
示例:
你是一个美食推荐助手,名字叫“饭团团”。你的回答应该:
- 亲切幽默,像朋友一样聊天
- 每次推荐不超过三个选项,并附上简单理由
- 如果用户没有指定菜系或地点,主动追问以缩小范围
- 遇到健康饮食建议时,先声明“我不是医生,以下仅供参考”
将此段文字赋值给 system 参数,Claude 就会严格按照设定互动。
安全与合规实践
内容过滤与拒绝机制
Claude 默认拒绝有害、非法、成人内容等请求。开发者无需额外过滤,但仍建议:
- 前后置检查:在用户输入前后增加自定义关键词过滤,防止提示注入。
- 监控异常:记录 API 调用日志,及时审查被拒绝的请求,评估是否误判。
- 用户通知:当模型因安全原因拒绝回答时,向用户展示温和的提示信息。
数据处理与隐私
- 默认情况下,Anthropic 不会使用客户 API 数据训练模型(具体参见最新隐私政策)。
- 对于敏感应用,可申请专用实例或私有云部署方案。
- 切勿在提示词或历史中发送个人身份信息(PII),除非必要,并确保符合 GDPR 等法规。
应对提示注入
攻击者可能尝试通过伪造消息绕过限制。防御措施:
- 使用清晰的 system prompt 强调最高优先级规则。
- 将用户输入与系统指令隔离,例如用 XML 标签包裹用户内容:
<user_input>用户实际输入</user_input> - 部署时加入简单的输入验证(长度、特殊字符比率等)。
高级功能
流式输出
对于生成长文本或需实时展示的场景,启用流式模式:
with client.messages.stream(
model="claude-3-sonnet-20240229",
max_tokens=1000,
messages=[{"role": "user", "content": "讲述一个关于勇气的小故事"}]
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
工具调用与结构化输出
Claude 3 支持工具调用(Function Calling),可让模型决定调用外部 API 并返回有序数据结构。用法类似其他模型的函数调用机制,需要在 tools 参数中定义函数描述,模型会返回 tool_use 内容块。
简单示例(查询天气):
tools = [
{
"name": "get_weather",
"description": "获取指定城市的当前天气",
"input_schema": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名称,如 Beijing"}
},
"required": ["city"]
}
}
]
response = client.messages.create(
model="claude-3-opus-20240229",
max_tokens=200,
tools=tools,
messages=[{"role": "user", "content": "北京今天天气怎么样?"}]
)
随后可解析响应中的工具调用请求,执行实际函数并将结果返回给模型继续对话。
视觉能力
传入图片时,将 content 改为列表形式,包含文本和图像块:
import base64
with open("photo.jpg", "rb") as f:
image_data = base64.b64encode(f.read()).decode("utf-8")
message = client.messages.create(
model="claude-3-opus-20240229",
max_tokens=300,
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "描述这张图片的内容"},
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/jpeg",
"data": image_data
}
}
]
}
]
)