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-20240229claude-3-opus-20240229
  • max_tokens:模型最多输出的 token 数量,防止过长响应。
  • temperature:控制随机性,0.0 为确定性输出,1.0 为最大创意。
  • system:系统提示词,设定整体角色和行为。
  • messages:对话消息列表,必须包含 roleuserassistant)和 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 默认拒绝有害、非法、成人内容等请求。开发者无需额外过滤,但仍建议:

  1. 前后置检查:在用户输入前后增加自定义关键词过滤,防止提示注入。
  2. 监控异常:记录 API 调用日志,及时审查被拒绝的请求,评估是否误判。
  3. 用户通知:当模型因安全原因拒绝回答时,向用户展示温和的提示信息。

数据处理与隐私

  • 默认情况下,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
                    }
                }
            ]
        }
    ]
)