lxiol

—title: Claude Code API使用指南
date: 2026-04-08 18:49:05
summary: title: Claude Code API使用指南 date: 2026-04-08 18:49:05 summary: 最近想快速提升项目实战能力(包含多个AI项目),或者最近找工作的小伙伴,可以看看下面👇🏻的这个链接(或许真的能够帮到你): 推荐一个牛逼的RAG系统
tags:

最近想快速提升项目实战能力(包含多个AI项目),或者最近找工作的小伙伴,可以看看下面👇🏻的这个链接(或许真的能够帮到你):

推荐一个牛逼的RAG系统!

推荐12个牛逼的SpringBoot项目

这篇文章是 Claude Certified ArchitectCCA) 认证考试的官方学习内容之一,课程全面涵盖 Claude API 的使用,从基础操作到高级 Agent 架构设计。

你将学习如何将 Claude 集成到应用程序中、实现工具调用、构建 RAG 流水线,以及设计确定性工作流和灵活的 Agent 系统。

1. Claude Code 模型介绍

模型概览

Claude Code 目前官网开放了 Opus、Sonnet 和 Haiku 三种模型,三种模型适用的场景不同,所以性能和价格也有差异,我们可以根据需要订阅:

Claude Opus

Claude Sonnet

Claude Haiku

描述

最高智力水平

平衡质量、速度和费用的智能模型

综合成本和延迟性价比最高的模型

费用

相对延迟

适中

最快

支持推理

使用范围

  • 先进的软件开发,尤其是大规模架构

  • 需要持续专注的长时间运行任务

  • 具有多步骤解决问题的战略规划

  • 可以从高级推理中受益的任务

  • 常见的编码任务

  • 文档创建和编辑

  • 内容营销和文案写作

  • 数据分析和可视化项目

  • 图像分析

  • 流程自动化

  • 快速代码补全和建议

  • 内容审核和过滤

  • 数据提取和分类

  • 语言翻译

  • 问答系统和知识检索

  • 最大量、最直接的文本处理任务

那么我们在完成任务时面对这三种模型该如何选择呢?首先,我们需要冷静下来权衡一下这三种模型的优略。自左向右,可以获得更高的智力水平,而自右向左,则可以获得更快的速度。

模型选择示意图

模型选择示意图
Opus 确实是最聪明的,但是它也是最贵的,延迟也最高。Haiku 的智力水平相对较低,但是它是最便宜的,响应速度也最快。Sonnet 恰好在二者中间,很好的平衡了智力、费用和耗时。

如果你的任务非常复杂,确实需要强大的推理能力,那可能 Opus 比较适合,因为你的任务对质量的要求远比速度和费用重要;如果你对时延要求较高,需要实时的用户交互,要求尽可能快的返回结果,那你可能就得选择 Haiku。但是如果你需要平衡智力和速度,其实大多数日常开发都是这类情况,此时选择 Sonnet 是最合适的。

最重要的一点,很多团队一般不会固定使用某一个模型,而是在同一个应用里混合使用多个模型。例如,在对接用户交互时可能会使用 Haiku 以获得实时的响应,主要的业务逻辑使用 Sonnet,一些需要复杂推理的任务使用 Opus。所以,一个应用很可能会覆盖 Claude 的所有模型。

2. 访问 API

在使用 Claude 构建应用程序时,理解完整的请求生命周期有助于你做出更好的架构决策并更有效地调试问题。让我们来看看从用户在聊天界面点击”发送”到 Claude 的回复出现在屏幕上的整个过程中发生了什么。

API 访问流程

API 访问流程

五步请求流程

每次与 Claude 的交互都遵循一个可预测的模式,包含五个不同阶段:

  • • 客户端请求到服务器
  • • 服务器请求到 Anthropic API
  • • 模型处理
  • • 服务器响应
  • • 客户端响应

五步请求流程

五步请求流程

为什么需要服务器

你永远不应该从客户端代码直接向 Anthropic API 发起请求。原因如下:

  • • API 请求需要密钥 API Key 进行身份验证
  • • 在客户端代码中暴露此密钥会造成严重的安全漏洞
  • • 任何人都可以提取密钥并发起未授权的请求

相反,你的 Web 或移动应用应该向自己的服务器发送请求,然后由服务器使用安全存储的密钥与 Anthropic API 通信。

在学习这部分内容前,我一直以为这部分工作都是由客户端完成的,原来在我们的本地也运行着一个 Claude Code 服务器,我们在客户端发出的请求,经过服务器的封装后,能够与 Anthropic 的大模型服务安全通信。

发起 API 请求

当你的服务器联系 Anthropic API 时,可以使用官方 SDK 或发起普通 HTTP 请求。Anthropic 为 PythonTypeScriptJavaScriptGo 和 Ruby 提供了 SDK

没有 Java 啊…… 看来转型去学习 Python 是大势所趋了!朋友们,还是要早些行动起来,尤其是 AI 时代,技术更迭太快了……

API 请求示意图

API 请求示意图
每个请求必须包含以下必要字段:

  • • API Key - 向 Anthropic 标识你的请求
  • • Model - 要使用的模型名称(如 claude-3-sonnet
  • • Messages - 包含用户输入文本的列表
  • • Max Tokens - Claude 可生成的最大 Token 数限制

Claude 内部处理流程

当 Anthropic 收到你的请求后,Claude 会通过四个主要阶段进行处理:

  • • 分词(Tokenization)
  • • 嵌入(Embedding)
  • • 上下文化(Contextualization)
  • • 生成(Generation)

Claude 内部处理流程

Claude 内部处理流程

分词

Claude 首先将你的输入文本分解成更小的块,称为 Token。这些可以是完整的单词、单词的一部分、空格或符号。为简单起见,可以将每个单词视为一个 Token

嵌入

每个 Token 都会被转换成一个嵌入向量——一长串数字,表示该词所有可能的含义。可以将嵌入理解为捕捉语义关系的数值化定义。

就是我们通常说的”向量化”。

嵌入示意图

嵌入示意图
单词通常有多种含义。例如,quantum 可能指:

  • • 物理量的离散单位(物理学)
  • • 量子力学或量子物理概念
  • • 极小的或亚原子的事物
  • • 量子计算应用

上下文化

Claude 根据周围的词来优化每个嵌入向量,以确定上下文中最可能的含义。这个过程会调整数值表示,突出合适的定义。

上下文化示意图

上下文化示意图

生成

经过上下文化的嵌入向量会通过一个输出层,计算每个可能的下一个词的概率。Claude 不总是选择概率最高的词——它会结合概率和受控的随机性,创造自然、多样的回复。

生成示意图

生成示意图
选择每个词后,Claude 将其添加到序列中,并为下一个词重复整个过程。

Claude 何时停止生成

在每个 Token 之后,Claude 会检查几个条件来决定是否继续:

停止生成条件

停止生成条件

  • • 达到最大 Token 数 - 是否达到了你指定的限制?
  • • 自然结束 - 是否生成了序列结束 Token
  • • 停止序列 - 是否遇到了预定义的停止短语?

API 响应

生成完成后,API 会返回一个结构化响应,包含:

  • • Message - 生成的文本
  • • Usage - 输入和输出 Token 的计数
  • • Stop Reason - 生成结束的原因

API 响应示意图

API 响应示意图
你的服务器收到此响应后,会将生成的文本转发回客户端应用,显示在用户界面中。

响应转发示意图

响应转发示意图

关键要点

理解这个流程有助于你:

  • • 设计安全架构来保护你的 API Key
  • • 为你的用例设置合适的 Token 限制
  • • 在应用逻辑中处理不同的停止原因
  • • 通过理解问题可能发生的环节来调试问题

不用每个细节都记——对术语和整体流程先有一个大概认知,后续遇到了慢慢就熟悉了。

3. 获取 API Key

下一节我们要向 Anthropic API 发起请求。为此,你需要一个保密的 API Key,本指南将带你完成创建 API Key 的过程。

提示:如果你是国内用户,无法直接访问 Anthropic 官网,可以使用前面提到的中转站服务或者国内大模型厂商的官网来获取 API Key

导航到 Anthropic API 控制台

在浏览器中,导航到 https://console.anthropic.com/ 并登录你的 Anthropic 账户。然后你会看到如下页面:

image.png

image.png

点击”Get API Keys”按钮

这个按钮位于主仪表板页面的右上方。

image.png

image.png

点击”Create Key”按钮

在页面右上方找到”Create Key”按钮并点击它。

image.png

image.png

输入工作空间和密钥名称

在”Default”工作空间中创建密钥,并为你的密钥输入一个名称。这个名称用于帮助你识别生成的密钥。让我们使用”Anthropic Course”作为名称。

image.png

image.png

复制密钥

你的 API Key 将在弹出的窗口中显示。复制这个密钥并妥善保存——我们将在下一节用到它。这个密钥只会显示一次,所以一定要确保复制下来!如果你不小心关闭了窗口,请删除旧密钥并重新生成。

4. 发起请求

一旦你理解了基本设置和结构,向 Anthropic API 发起第一个请求就很简单了。本指南将带你完成使用 Python 让 Claude 响应提示词的基本步骤。

Jupyter notebook

一个开源的交互式计算环境,允许用户在一个网页浏览器中编写和运行代码,并实时查看结果,同时还可以混合代码、文本、公式和图标等,形成可交互的文档,以 .ipynb 后缀结尾。

Jupyter 依赖内核执行代码,例如,你在 .pynb 文件中运行 Python 代码,就需要本地环境中的 Python 内核去运行它。

可以在 VSCode 中直接创建一个 .ipynb 文件来感受一下:

image.png

image.png
可以点击「+ 代码」添加代码,或者点击「+ Markdown」添加 Markdown 笔记。下面添加一段 Python 代码:

image.png

image.png
需要你在右下角选择语言,这里的命令是用来安装 Anthropic SDK 的依赖。可以直接在 VSCode 中运行,之前如果没有安装过 Python 和 Jupyter 的相关扩展插件的话,运行前会引导你安装:

image.png

image.png

image.png

image.png
运行时选择 Python 内核去运行:

image.png

image.png
然后就可以安装成功了:

image.png

image.png
安装成功的前提,是你的网络必须可达,需要科学上网。

好了,Jupyter notebook 是机器学习开发者非常常用的工具,其默认的 .ipynb 格式文档被广泛应用于数据分析、机器学习和科学计算,所以开始机器学习之旅后,要习惯使用这一工具。

设置环境

在进行任何 API 调用之前,你需要安装必要的依赖包并安全地配置 API Key

Anthropic SDK 的运行依赖于 python-dotenv ,上面已经使用 Jupyter notebook 安装好了。接下来,在 notebook 所在的同一目录下创建一个 .env 文件,用于安全地存储你的 API Key

1
`ANTHROPIC_API_KEY="your-api-key-here"`

这种方法可以将 API Key 保留在代码之外,防止意外提交到版本控制系统。务必将 .env 添加到你的 .gitignore 文件中。

加载环境变量并创建 API 客户端:

1
2
3
4
5
6
7
`from dotenv import load_dotenv
load_dotenv()

from anthropic import Anthropic

client = Anthropic()
model = "claude-sonnet-4-6"`

在 notebook 中的效果如下:

image.png

image.png

Create 函数

发起 API 请求的核心是 client.messages.create() 函数。这个函数需要三个关键参数:

image.png

image.png

  • • model - 你想要使用的 Claude 模型名称
  • • max_tokens - 响应长度的安全限制(不是目标值)
  • • messages - 你发送给 Claude 的对话历史

max_tokens 参数充当安全机制。如果你将其设置为 1000Claude 将在 1000 个 token 后停止生成,即使它还有更多内容要说。Claude 不会试图达到这个限制——它只会编写它认为合适的内容,如果达到最大值就会停止。

如果你用的是 Anthropic 的官方模型,客户端创建函数如下:

1
2
3
4
`from anthropic import Anthropic

client = Anthropic()
model = "claude-sonnet-4-6"`

如果你是用的国内大模型或者中转站,在定义 client 是代码需要兼容处理。 GLM 的代码应该这样写(参考官方文档: https://docs.bigmodel.cn/cn/guide/develop/claude/introduction ):

1
2
3
4
5
6
7
8
9
10
`# Create an API client

from anthropic import Anthropic

client = Anthropic(
    base_url="https://open.bigmodel.cn/api/anthropic",
    api_key="your-api-key"
)

model = "glm-5"`

NekoCode 中转站的代码应该这样写(参考官方文档: https://nekocode.ai/ ):

1
2
3
4
5
6
7
8
`from anthropic import Anthropic

client = Anthropic(
    base_url="https://nekocode.ai",
    api_key="your-api-key"
)

model = "claude-sonnet-4-6"`

理解消息

消息代表你与 Claude 之间的对话,类似于聊天应用。消息有两种类型:

image.png

image.png

  • • User messages - 你想要发送给 Claude 的内容(由人类编写)
  • • Assistant messages - Claude 生成的响应

每条消息都是一个字典,包含 role(”user” 或 “assistant”)和 content(实际文本)。

发起第一个请求

下面是向 Claude 发起请求的完整示例:

1
2
3
4
5
6
7
8
9
10
`message = client.messages.create(
    model=model,
    max_tokens=1000,
    messages=[
        {
            "role": "user",
            "content": "什么是量子计算?用一句话回答"
        }
    ]
)`

当你运行这段代码时,Claude 会处理你的请求并返回一个响应对象,其中包含生成的文本以及有关请求的元数据。我们把 message 打印出来:

image.png

image.png
响应对象包含大量信息,但通常你只需要生成的文本。Anthropic 的 API 返回的数据结构中, content 是一个数组,我们需要的回答内容其实是 text 字段, 所以要获取答案可以直接执行:

1
`message.content[0].text`

image.png

image.png

提示:在实际开发中,建议添加错误处理机制,例如网络异常、API 限流等情况,以确保应用的稳定性。

ThinkingBlock

这里有一个坑,有小伙伴可能使用的是硅基流动,发现这里 message 返回的并不是上述格式:

image.png

image.png
这里把 thinking 的内容也返回了。所以,这里其实兼容的写法应该是:

1
2
3
4
`def resolve_text(message):
    for item in message.content:
        if item.type == 'text':
        return item.text`

根据 content 数组中每个元素的 type 去判断,只读取 type=’text’ 的元素中的 text 取值。

5. 多轮对话

在使用 Anthropic API 和 Claude 时,你需要理解一个关键概念:Claude 不会存储任何对话历史。你发起的每个请求都是完全独立的,对之前的交流没有任何记忆。

image.png

image.png
这意味着如果你想要进行多轮对话,让 Claude 记住早期消息的上下文,你需要自己处理对话状态。

无状态对话的问题

假设你问 Claude “什么是量子计算?”并得到了一个很好的回答。然后你接着问”再写一句”——Claude 完全不知道你在指什么。它会写一句关于完全随机的内容,因为它对量子计算的讨论没有任何记忆。

image.png

image.png
示例如下:

image.png

image.png

多轮对话的工作原理

要维护对话上下文,你需要做两件事:

  • • 在代码中手动维护所有消息的列表
  • • 每次请求时发送完整的消息历史

image.png

image.png
以下是实际可行的流程:

    1. 向 Claude 发送你的初始用户消息
    1. 获取 Claude 的响应,并将其作为助手消息添加到消息列表中
    1. 将你的后续问题添加为另一条用户消息
    1. 将整个对话历史发送给 Claude

image.png

image.png

构建辅助函数

为了让对话管理更容易,你可以创建三个辅助函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
`def add_user_message(messages, text):
    user_message = {"role": "user", "content": text}
    messages.append(user_message)

def add_assistant_message(messages, text):
    assistant_message = {"role": "assistant", "content": text}
    messages.append(assistant_message)

def chat(messages):
    message = client.messages.create(
        model=model,
        max_tokens=1000,
        messages=messages,
    )
    return resolve_text(message)`

完整示例

下面是如何使用这些函数来维护对话:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
`# 从空的消息列表开始
messages = []

# 添加初始用户问题
add_user_message(messages, "用一句话定义量子计算")

# 获取 Claude 的响应
answer = chat(messages)

# 将 Claude 的响应添加到对话历史
add_assistant_message(messages, answer)

# 添加后续问题
add_user_message(messages, "再写一句")

# 获取带有完整上下文的后续响应
final_answer = chat(messages)`

现在 Claude 会理解”再写一句”是指扩展量子计算的定义,因为你已经提供了完整的对话上下文。

这些辅助函数在你使用 Claude 的整个过程中都会很有用,使构建能够在多次交流中维持有意义对话的应用程序变得更加容易。

image.png

image.png

提示:在实际应用中,你可能需要考虑对话历史的长度限制。如果对话历史过长,可能需要实现滑动窗口或摘要机制来控制 token 数量。

6. 聊天练习

这一小节我们来练习通过 notebook 实现一个简易的聊天机器人。聊天机器人的逻辑其实很简单:在同一个会话中,你可以和机器人一直聊天,它会记住你的所有历史聊天信息。

上文其实已经实现聊天的主要逻辑了:

  • • 用户输入
  • • 将用户输入放到 messages
  • • 带着 messages 调用 Claude API
  • • 将 Claude API 的回答再放到 messages
  • • 继续调用 Claude API
  • • ……

我们现在只需要用一个循环将这个过程串起来,让它一直运行下去就可以了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
`# Make an initial list of messages
messages = []

# Use a 'while True' loop to run the chatbot forever
while True:
    # 获取用户输入
    user_input = input("> ")
    print(">", user_input)

    # 将用户输入添加到 messages
    add_user_message(messages, user_input)

    # 调用 Claude API
    answer = chat(messages)

    # 将 AI 助手的回答加入 messages
    add_assistant_message(messages, answer)

    # 打印回答
    print("---")
    print(answer)
    print("---")`

我用 while True 将其包裹起来,整个循环在持续不断地读取用户输入,将其加到 messages 调用 Claude API ,获取到回答后再加入到 messages ,此时把结果打印出来,继续等待用户提问。

实际操作时,你在 notebook 完成代码后,运行这段代码,VS Code 会自动唤起输入行,然后在这里输入你的问题:

image.png

image.png
输入回车后 Claude 会给出它的回答:

image.png

image.png
然后在输入框继续输入你的问题,验证它是否知晓上下文:

image.png

image.png
可以看到,我问“第二高的呢?”,它知道我提问的是“世界第二高的山峰”,而不是“世界第二高的建筑”或者其他,这样我们就实现了一个简单的聊天机器人功能。

7. 系统提示词

系统提示词是自定义 Claude 如何响应用户输入的强大方式。你可以塑造 Claude 的语气、风格和方法来匹配你的特定用例,而不是获得通用答案。

image.png

image.png

为什么系统提示词很重要

考虑构建一个数学辅导聊天机器人。当一个学生问”如何解 5x + 2 = 3 中的 x?”时,你希望 Claude 表现得像一个真正的导师,而不是直接给出答案。一个好的数学导师应该:

  • • 最初给出提示而不是完整的解决方案
  • • 耐心地逐步引导学生解决问题
  • • 展示类似问题的解决方案作为示例

你绝对不希望 Claude

  • • 立即给出直接答案
  • • 告诉学生直接使用计算器

系统提示词如何工作

image.png

image.png
系统提示词为 Claude 提供了如何响应的指导。你将它们定义为普通字符串,并在创建函数调用时传入。主要好处是:

  • • 系统提示词为 Claude 提供如何响应的指导
  • • Claude 会尝试以指定角色的人会响应的方式来响应
  • • 帮助 Claude 保持专注

下面是基本结构:

1
2
3
4
5
6
7
8
9
10
11
12
`system_prompt = """
You are a patient math tutor.
Do not directly answer a student's questions.
Guide them to a solution step by step.
"""

client.messages.create(
    model=model,
    messages=messages,
    max_tokens=1000,
    system=system_prompt
)`

查看区别

没有系统提示词时,Claude 会立即给出完整的循序渐进解决方案。这可能很有帮助,但不会鼓励学生自己思考问题:

image.png

image.png
有了数学导师系统提示词,Claude 的响应会发生巨大变化。Claude 不提供完整解决方案,而是提出引导性问题:

image.png

image.png

构建灵活的聊天函数

硬编码系统提示词不太友好,你可以改造你的聊天函数,使其更可重用,通过接受系统提示词作为参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
`def chat(messages, system=None):

    # 定义一个字典
    params = {
        "model": model,
        "max_tokens": 1000,
        "messages": messages,
    }

    if system:
        params["system"] = system

    # 使用 ** 对字典解包 -- 浅拷贝
    message = client.messages.create(**params)
    return resolve_text(message)`

Python 基础
在函数的参数比较多的情况下,可以构建字典对象,灵活封装,可以利用 ** 解包技术进行参数传递,需要注意的是, ** 解包技术是一个浅拷贝过程!

这种方法处理了一个重要细节:Claude 的 API 接受的 system 入参默认为 None,所以你只有在提供了 system 时才有条件地包含系统提示词。你现在无论有没有系统提示词都可以调用聊天函数:

1
2
3
4
5
6
7
8
9
10
11
`# 不使用系统提示词
answer = chat(messages)

# 使用系统提示词
system = """
你是个有耐心的数学家教。
不要直接回答学生的问题。
引导他们一步一步地找到解决方案。
"""

answer = chat(messages, system=system)`

系统提示词对于创建行为一致且符合其预期目的的 AI 应用程序至关重要。它们将通用的 AI 响应转换为专门的、符合角色的交互。

提示:系统提示词不仅可以用于角色扮演,还可以用于设定输出格式、语言风格、专业领域等多种场景。合理使用系统提示词可以大幅提升 AI 应用的专业性。

练习

下面我们再练习一个系统提示词的例子:让 Claude 写一个 Python 函数,检查字符串是否有重复字符。对比一下有没有提示词的区别。

下面是没有增加提示词的代码:

1
2
3
4
5
6
7
8
9
10
`# 从空的消息列表开始
messages = []

# 添加初始用户问题
add_user_message(messages, "写一个 Python 函数,检查字符串是否有重复字符")

# 获取 Claude 的响应
answer = chat(messages)

answer`

输出结果如下:

image.png

image.png
然后下面增加了提示词的代码:

1
2
3
4
5
6
7
8
9
10
`# 从空的消息列表开始
messages = []

# 添加初始用户问题
add_user_message(messages, "写一个 Python 函数,检查字符串是否有重复字符")

# 获取 Claude 的响应
answer = chat(messages, system="你是一名编写代码非常简洁的 Python 工程师")

answer`

输出结果如下:

image.png

image.png
额没错,只有一行代码!这就是系统提示词的魔力……

8. Temperature

Temperature 是一个强大的参数,用于控制 Claude 响应的可预测性创造性。理解如何有效使用它,可以显著提升你的 AI 应用效果。

Claude 如何生成文本

在深入了解 Temperature 之前,先理解 Claude 的文本生成过程会有所帮助。当你向 Claude 发送一个提示词,比如”What do you think?”时,它会经历三个关键步骤:

  • • 分词 - 将输入分解成更小的块
  • • 预测 - 计算可能的下一个词的概率
  • • 采样 - 根据这些概率选择一个 Token

image.png

image.png
在这个例子中,Claude 可能会给”about”分配 30% 的概率,”would” 20%,”of” 10%,以此类推。然后模型选择一个 Token 并重复整个过程来构建完整的句子。

image.png

image.png

Temperature 的作用

Temperature 是一个介于 0 和 1 之间的十进制值,直接影响这些选择概率。它就像调整 Claude 响应的”创造力旋钮”。

image.png

image.png
在低 Temperature(接近 0)时,Claude 变得非常确定性——它几乎总是选择概率最高的 Token。在高 Temperature(接近 1)时,Claude 在选项之间更均匀地分配概率,从而产生更多样化和创造性的输出。

Temperature 交互演示

你可以通过 Claude 的交互演示来观察 Temperature 的实际效果。当你调整 Temperature 滑块时,观察概率分布如何变化:

image.png

image.png
在 Temperature 为 0.0 时,”about”获得 100% 的概率——完全确定性。在 Temperature 为 1.0 时,概率在所有可能的 Token 之间更均匀地分布,引入随机性和创造力。

选择合适的 Temperature

不同的任务需要不同的 Temperature 范围:

image.png

image.png

低 Temperature(0.0 - 0.3)

  • • 事实性响应
  • • 编程辅助
  • • 数据提取
  • • 内容审核

中 Temperature(0.4 - 0.7)

  • • 摘要生成
  • • 教育内容
  • • 问题解决
  • • 带约束的创意写作

高 Temperature(0.8 - 1.0)

  • • 头脑风暴
  • • 创意写作
  • • 营销内容
  • • 笑话生成

在代码中添加 Temperature

向你的聊天函数添加 Temperature 支持非常简单。以下是修改现有函数的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
`def chat(messages, system=None, temperature=1.0):
    params = {
        "model": model,
        "max_tokens": 1000,
        "messages": messages,
        "temperature": temperature
    }

    if system:
        params["system"] = system

    message = client.messages.create(**params)
    return resolve_text(message)`

主要的修改是将 temperature=1.0 添加为参数,并在 params 字典中包含 "temperature": temperature

测试 Temperature 的效果

要观察 Temperature 的实际效果,可以尝试用不同的设置生成电影创意:

1
2
3
4
5
6
7
8
9
10
`# 从空的消息列表开始
messages = []

# 添加初始用户问题
add_user_message(messages, "生成一部电影的构思")

# 获取 Claude 的响应
answer = chat(messages, temperature=0.0)

answer`

在 Temperature 为 0.0 时,第一次调用 chat 获得的回答:

image.png

image.png
第二次调用 chat 获得的回答:

image.png

image.png
将 temperature 改为 1.0 之后调用 chat 的结果:

image.png

image.png
你会看到主题、角色和情节元素上的更多变化。

关键要点

记住,Temperature 并不保证不同的输出——它只是改变获得不同输出的概率。即使在高 Temperature 下,Claude 偶尔也可能产生类似的响应。关键是将你的 Temperature 选择与特定用例匹配:

  • • 需要一致、事实性的响应?使用低 Temperature
  • • 想要创意头脑风暴?调高 Temperature
  • • 介于两者之间?中等 Temperature 适用于大多数常规任务

Temperature 是你可以调整以针对特定需求微调 Claude 行为的最实用的参数之一。

9. 响应流式传输

在使用 Claude 构建聊天应用时,存在一个显著的用户体验挑战:响应生成可能需要 10-30 秒,用户只能盯着加载转圈。解决方案是响应流式传输,它让用户能够看到文本随着 Claude 的生成逐块出现,创造更加即时的响应感。

image.png

image.png

标准响应的问题

在典型的聊天设置中,你的服务器向 Claude 发送用户消息,然后等待完整响应后再发回给客户端。这造成了一个尴尬的延迟,用户没有任何反馈表明正在发生任何事情。

image.png

image.png

流式传输的工作原理

启用流式传输后,Claude 立即发送回一个初始响应,指示它已收到你的请求并开始生成文本。然后你会收到一系列事件,每个事件包含整体响应的一小部分。

image.png

image.png
你的服务器可以将这些文本块实时转发给客户端应用,让用户能够看到响应逐字构建。所有这些事件都是对 Claude 单次请求的一部分。

image.png

image.png

理解流事件

启用流式传输后,Claude 会发送回几种类型的事件:

  • • MessageStart - 正在发送一条新消息
  • • ContentBlockStart - 一个包含文本、工具使用或其他内容的新块开始
  • • ContentBlockDelta - 实际生成的文本块
  • • ContentBlockStop - 当前内容块已完成
  • • MessageDelta - 当前消息已完成
  • • MessageStop - 当前消息的信息结束

image.png

image.png
其中,ContentBlockDelta 事件包含你要向用户显示的实际生成文本。

基本流式传输实现

要启用流式传输,在 messages.create 调用中添加 stream=True

1
2
3
4
5
6
7
8
9
10
11
12
`messages = []
add_user_message(messages, "写一句话描述一个虚构的数据库")

stream = client.messages.create(
    model=model,
    max_tokens=1000,
    messages=messages,
    stream=True
)

for event in stream:
    print(event)`

image.png

image.png

简化的文本流式传输

你可以使用 SDK 的简化流式传输接口,它只提取文本内容,而不是手动解析事件:

1
2
3
4
5
6
7
`with client.messages.stream(
    model=model,
    max_tokens=1000,
    messages=messages
) as stream:
    for text in stream.text_stream:
        print(text, end="")`

这种方法会自动过滤掉除实际文本内容之外的所有内容,这通常是你向用户显示响应时所需要的。

获取完整消息

虽然流式传输单个块对用户体验很好,但你通常需要完整消息用于存储或进一步处理。流式传输完成后,你可以获取组装好的最终消息:

1
2
3
4
5
6
7
8
9
10
11
`with client.messages.stream(
    model=model,
    max_tokens=1000,
    messages=messages
) as stream:
    for text in stream.text_stream:
        # 将每个块发送给你的客户端(这里就不做展示了,直接跳过)
        pass

    # 获取完整消息用于数据库存储
    final_message = stream.get_final_message()`

这让你两全其美:为用户提供实时流式传输,为应用逻辑提供完整消息对象。

10. 结构化数据

当你需要 Claude 生成结构化数据(如 JSONPython 代码或项目列表)时,经常会遇到一个常见问题:Claude 想要提供帮助,会在内容周围添加解释性文本。虽然这通常很好,但有时你只需要原始数据。

考虑构建一个生成 AWS EventBridge 规则的 Web 应用。用户输入描述,点击生成,期望看到干净的 JSON,可以立即复制使用。如果 Claude 返回的是包裹在 Markdown 代码块中并带有解释文本的 JSON,用户就无法简单地复制整个响应——他们必须手动选择 JSON 部分。

image.png

image.png

默认响应的问题

默认情况下,当你让 Claude 生成 JSON 时,可能会得到类似这样的结果:

1
2
3
4
5
6
7
`{
  "source": ["aws.ec2"],
  "detail-type": ["EC2 Instance State-change Notification"],
  "detail": {
    "state": ["running"]
  }
}`

这条规则捕获 EC2 实例状态变更,当实例开始运行时触发。

JSON 是正确的,但它被包裹在 Markdown 格式中,并包含解释性文本。对于需要复制原始 JSON 的 Web 应用,这给用户体验带来了摩擦。

解决方案:助手消息预填充 + 停止序列

你可以结合助手消息预填充和停止序列来获取你想要的内容。工作原理如下:

1
2
3
4
5
6
`messages = []

add_user_message(messages, "生成一个非常简短的 EventBridge 规则,JSON 格式")
add_assistant_message(messages, "```json")

text = chat(messages, stop_sequences=["```"])`

这个技巧的工作原理:

    1. 用户消息告诉 Claude 要生成什么
    1. 预填充的助手消息让 Claude 认为它已经开始了一个 Markdown 代码块
  • 3. Claude 继续只写入 JSON 内容
    1. 当 Claude 尝试用 ````` 关闭代码块时,停止序列立即结束生成

image.png

image.png
结果是干净的 JSON,没有额外格式:

1
2
3
4
5
6
7
`{
  "source": ["aws.ec2"],
  "detail-type": ["EC2 Instance State-change Notification"],
  "detail": {
    "state": ["running"]
  }
}`

🌟 非官方模型兼容性问题
使用非官方模型的朋友到这里可能会踩坑了:发现没有返回内容!这是因为 stop_sequences 配合预填充是官方推荐的方法,但对某些中转站或模型配置可能不兼容。实际使用时,推荐用 system  prompt 控制格式或后处理提取,更稳定。

使用 system prompt :

1
2
3
4
5
6
7
`messages = []

add_user_message(messages, "生成一个非常简短的 EventBridge 规则,JSON 格式")

result = chat(messages, system="只返回 JSON,不要任何解释、不要 markdown 代码块包裹")

print(result)`

image.png

image.png
使用后处理提取:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
`import json
import re

messages = []
add_user_message(messages, "生成一个非常简短的 EventBridge 规则,JSON 格式")

result = chat(messages)

# 提取 JSON
match = re.search(r'```json\s*(\{.*?\})\s*```', result, re.DOTALL)
if match:
    json_str = match.group(1)
    print(json_str)
else:
    # 尝试直接解析
    try:
        # 提取第一个 JSON 对象
        json_match = re.search(r'\{.*\}', result, re.DOTALL)
        if json_match:
            print(json_match.group())
    except:
        print(result)`

image.png

image.png

处理响应

你可能会注意到响应中有一些额外的换行符。这些很容易处理:

1
2
3
4
`import json

# 清理并解析 JSON
clean_json = json.loads(text.strip())`

超越 JSON

这个技巧不限于 JSON 生成。当你需要不带注释的结构化数据时都可以使用:

  • • Python 代码片段
  • • 项目列表
  • • CSV 数据
  • • 任何你只需要内容而不需要解释的格式化内容

关键在于识别 Claude 自然地想要用什么包裹你的内容,然后将其用作预填充和停止序列。对于代码,通常是 Markdown 代码块。对于列表,可能是不同的格式标记。

这种方法让你能够精确控制 Claude 的输出格式,使得将 AI 生成的内容集成到需要干净、结构化数据的应用中变得更加容易。

最近想快速提升项目实战能力(包含多个AI项目),或者最近找工作的小伙伴,可以看看下面👇🏻的这个链接(或许真的能够帮到你):

推荐一个牛逼的RAG系统!

推荐12个牛逼的SpringBoot项目

本文转载自微信公众号,如有侵权请联系删除。

  • 标题:
  • 作者: lxiol
  • 创建于 : 2026-04-08 18:49:05
  • 更新于 : 2026-04-29 20:21:28
  • 链接: https://blog.lxiol.cn/2026/04/08/Claude-Code-API使用指南/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。