正在学习

3.2 逐步推理与思维链技巧

# 输入模型

class FactorialInput(BaseModel):

    number: int

def calculate_factorial(n: int) -> int:

    """递归计算阶乘并带有验证。"""

    if n < 0:

        raise ValueError("Number must be non-negative")

    if n in (0, 1):

        return 1

    return n * calculate_factorial(n - 1)

@app.post("/factorial")

async def factorial_endpoint(input_data: FactorialInput):

    """安全计算阶乘的 API 端点。"""

    try:

        result = calculate_factorial(input_data.number)

        return {"input": input_data.number, "factorial": result}

    except ValueError as e:

        raise HTTPException(status_code=400, detail=str(e))

    except Exception:

        raise HTTPException(status_code=500, detail="Unexpected error occurred")

这个示例是完整的,并且可以使用 FastAPI 完整运行。它包含了验证、异常处理以及解释性注释。代码的质量直接源于 Claude 在编写实现之前的逐步推理。

如果你使用 uvicorn main:app --reload 在本地运行此 API,并发送类似 {"number": 5} 的 JSON 请求,该端点将返回 {"input": 5, "factorial": 120}

澄清表

提示元素 目的 示例指令 对输出的影响
推理阶段 鼓励 Claude 在编码前先思考 "首先概述你的步骤。" 生成结构化且有文档说明的代码
实现阶段 将逻辑与执行分离 "然后编写完整的实现。" 生成更清晰、更可靠的输出
验证步骤 强制 Claude 检查假设 "包含输入验证和错误处理。" 防止逻辑错误和运行时错误
解释 加深理解 "添加解释每个部分的注释。" 提高可读性和可维护性

这个框架确保每个生成的解决方案都是经过深思熟虑且在技术上可靠的。与其将 Claude 视为指令执行者,不如说你在训练它像队友一样进行推理。

逐步推理和思维链提示是让 Claude Code 在行动之前先思考的方法。它加强了逻辑流程,减少了猜测,并提高了各个项目的可靠性。通过要求 Claude 先推理、再实现、最后验证,你将它从一个自动生成器转变为一个深思熟虑的工程协作者。

下一节将基于此概念,教你如何处理长上下文和多文件提示,使 Claude 能够在整个项目中进行推理,并在大型应用程序中保持一致性。

3.3 处理长上下文和多文件提示

随着项目的增长,Claude Code 必须理解的函数、文件和依赖项的数量也在增加。小的代码片段对于任何编码助手来说都容易处理,但现实世界的开发很少能容纳在几百行代码之内。这就是 Claude Code 长上下文能力成为真正优势的地方。凭借对极大 token 窗口的支持,Claude 可以在单个会话中读取、理解和推理整个项目——多个文件、文档和配置。当提示正确时,Claude 的行为就像一个已经阅读了你整个代码库的开发者,能够在每个模块中提供详细、一致的反馈。学会有效地使用长上下文,使你能够精确地管理复杂的代码库,并在整个交互过程中保持完整的架构意识。

概念发展

上下文窗口定义了 Claude 一次可以"看到"多少信息——包括你的提示、之前的交流以及它正在分析的代码。窗口越大,Claude 在推理时可以保留的上下文就越多。在像 Claude 3 Opus 这样的模型中,这可以扩展到数十万个 tokens,这意味着你可以在一个对话中包含多个文件、测试数据和系统文档。

然而,向 Claude 提供过多无结构的数据可能会削弱它的专注力。就像任何经验丰富的工程师一样,Claude 需要一个有指导的简报,以了解哪些文件是重要的以及需要注意什么。有效的长上下文提示在于聚焦、层次结构和相关性。与其倾倒代码,你应该以反映人类推理的方式构建上下文——从基础(模型和工具)到更高层(控制器、路由和 API)。

在使用多文件提示时,你的目标是帮助 Claude 保持文件之间的关系。你可以通过清晰地标记文件边界、在每个文件之前总结意图,并以一个具体的请求结束来实现这一点。把自己想象成一个技术负责人,将一堆代码交给助手——你不会说"读这个",你会说"从 models.py 开始,然后看看它在 main.py 中是如何使用的,并告诉我它们是如何交互的。"同样的纪律也适用于 Claude。

动手示例

练习题

当向 calculate_factorial 函数传入负数时会发生什么?

A. 返回 1
B. 抛出 ValueError,附带消息 'Number must be non-negative'
C. 计算该数字绝对值的阶乘
D. 返回 0

calculate_factorial 函数中,递归阶乘计算的基准情况是什么?

A.
B.
C.
D.

factorial_endpoint 函数中,针对不同的错误场景会引发哪些 HTTP 状态码?

A. 200 表示成功
B. 400 表示无效输入
C. 500 表示意外错误
D. 404 表示未找到
E. 401 表示未授权访问

calculate_factorial 函数使用迭代方法来计算阶乘。

factorial_endpoint 函数在成功时返回一个 JSON 响应,其中包含输入的数字及其阶乘。

如果输入数字是___,calculate_factorial函数会引发ValueError。

factorial_endpoint 函数使用 calculate_factorial 函数来计算输入 ___ 的阶乘。

解释 calculate_factorial 函数中验证步骤的目的。

当提供有效输入时,factorial_endpoint 函数的预期输出是什么?

以下哪项是 Claude 3.5 Sonnet 的特性,使其适合用于阶乘 API 任务?

A. 极低的成本
B. 增强的推理能力和上下文连贯性
C. 最适合快速、低成本的任务
D. 仅限于短文本补全

将Claude 3.5 Sonnet的特性知识与阶乘API实现相结合,如何改善整体解决方案?

在实现用于计算阶乘的 FastAPI 端点时,以下哪项不是包含输入验证的合理理由?

A. 确保输入是非负整数
B. 防止对极大数进行阶乘计算,这可能会导致性能问题
C. 使代码看起来更复杂、更专业
D. 显式处理像 这样的边界情况

以下哪些是定义用于阶乘计算的 FastAPI 端点时的基本组件?(选择所有适用的)

A. 用于定义输入结构的模型
B. 用于计算阶乘的递归函数
C. 用于处理潜在错误的 try-except 块
D. 用于遍历所有可能输入的循环

FactorialInput 模型是必要的,以确保阶乘端点的输入是有效的整数。

在 FastAPI 阶乘端点中,___ 块用于捕获和处理特定错误,例如无效输入。

登录后解锁笔记、知识点解析、AI 问答

立即登录