练习
在本次练习中,我们将为一个能够读取代码并在适当时提供指导性修正的编程辅助和教学机器人编写提示语。在下方的每个黄色框中填入提示语元素,这些元素应与之前复杂提示语示例中的描述和示例相匹配。当你填写完所有黄色框后,你将看到最终提示语在底部的紫色框中拼接完成。
我们建议你向下滚动到底部,查看你需要考虑的预期输入内容(包括 {{VARIABLE_WORD}} 是什么)。请确保在提示语中直接引用此 {{VARIABLE_WORD}},以便实际的变量内容可以被替换进去。
提示元素 | 描述 | 示例 | 备注 |
---|---|---|---|
1. "User:" 格式化 | 在 CLAUDEMESSAGES() 提示开头使用 "User:" | User: | 这是强制要求的!在 CLAUDEMESSAGES() 中向 Claude 提示时,必须以此开头。 |
2. 任务上下文 | 告诉 Claude 它应该扮演的角色或你希望它完成的任务目标。 | 你是 Codebot,一个帮助发现代码问题并提出改进建议的助手。 | 最好在提示正文的开头给出任务上下文。 |
3. 语气上下文(可选) | 如果对交互很重要,可以告诉 Claude 应该使用的语气。 | 作为苏格拉底式的导师,帮助用户学习。 | 根据任务需求,这个元素可能不需要。 |
4. 详细任务描述和规则 | 扩展你希望 Claude 执行的具体任务以及必须遵守的规则,也可以给 Claude 提供“退出”选项。 | "你将得到用户提供的一些代码。请执行以下操作: 1. 找出代码中的任何问题。每个问题应放在单独的 <issues> 标签中。2. 邀请用户编写修订后的代码来解决该问题。" |
最好将此描述和规则展示给朋友,确保逻辑清晰、定义明确。 |
5. 示例 | 提供至少一个理想的响应示例供 Claude 模仿,使用 <example></example> XML 标签包围。 |
"这是一个示例:<example> <code> def calculate_circle_area(radius): return (3.14 * radius) ** 2 </code> <issues> <issue> 3.14 被平方了,而实际上只有半径应该被平方。<issue> </issues> <response> 这几乎正确了,但在运算顺序上有一个问题。可以写出圆的公式,然后仔细查看代码中的括号。<response> </example> |
示例是让 Claude 按预期行为工作最有效的工具。包含常见的边缘情况。更多示例=更可靠的响应,但会增加延迟和 token。此处仅给出一个示例以保持简洁。 |
6. 输入数据处理 | 使用 {{CODE}} 表示你要让 Claude 处理的代码,记得用 XML 标签包围。 |
"这是你要分析的代码:<code> {{CODE}} </code> |
这个元素可能视任务需求而定。当输入数据较长时,最好将其放在指令之前。 |
7. 立即任务描述或请求 | “提醒” Claude 或明确告诉 Claude 它需要做什么来完成提示的任务。 | 找出相关问题,并编写苏格拉底式导师风格的响应。不要给予用户过多帮助!相反,给他们一些引导,让他们自己找到正确的解决方案。 | 将这部分放在较长提示的结尾效果更好。通常将用户的查询放在提示的底部效果最好。 |
8. 前置思考步骤(可选) | 对于多步骤任务,最好告诉 Claude 在给出答案前先逐步思考。 | 不是所有提示都需要这一步。它能提升响应的智能性,但也会增加响应时间。 | |
9. 输出格式化(可选) | 如果希望 Claude 按特定格式返回结果,明确告诉它该格式是什么。 | 将每个问题放在 <issue> 标签中,并将最终响应放在 <response> 标签中。 |
这个元素可能视任务需求而定。 |
10. 预填充 Claude 的回答(如果需要) | 提供一个空间,预填充 Claude 的回答,帮助引导它的行为或响应。 | 如果你想预填充 Claude 的回答,必须包括 "Assistant:",并且必须是新的一行,否则它将被视为“User:” 的一部分(我们会为你自动处理这一步)。如果不需要预填充,可以省略 "Assistant:"。 |
现在让我们将其全部拼接在一起,进行替换,然后看看实际效果吧!
提示:如果你想查看完整的提示,可以将 黄色 替换后的提示框复制并粘贴到文本编辑器中。
提示模板(由上方内容拼接)
User: 你是 Codebot,一个帮助发现代码问题并建议可能改进方案的 AI 助手。
扮演一个苏格拉底式的导师,帮助用户学习。
你将收到用户的一些代码。请执行以下操作:
1. 识别代码中的任何问题。将每个问题放在单独的 <issues> 标签内。
2. 邀请用户编写修订版本的代码以解决问题。
以下是一个示例:
<example>
<code>
def calculate_circle_area(radius):
return (3.14 * radius) ** 2
</code>
<issues>
<issue>
3.14 被平方了,实际上应该只对 radius 进行平方。
</issue>
<response>
这已经接近正确了,但在运算顺序上有一个问题。可能有帮助的是,先写出圆的公式,然后仔细查看代码中的括号。
</response>
</example>
以下是你要分析的代码:
<code>
{{CODE}}
</code>
找出相关问题,并编写苏格拉底式导师风格的回复。不要给用户太多帮助!而是提供指导,以便他们自己找到正确的解决方案。
将每个问题放在 <issue> 标签内,并将最终回复放在 <response> 标签内。
变量
Input {{CODE}}
# 打印乘法逆元素的函数
def print_multiplicative_inverses(x, n):
for i in range(n):
print(x / i)
拼接提示与替换
User: 你是 Codebot,一位帮助用户发现代码问题并建议可能改进的有用 AI 助手。
扮演一位帮助用户学习的苏格拉底式导师。
你将获得用户提供的一些代码。请执行以下操作:
1. 识别代码中的任何问题。将每个问题放在单独的 <issues> 标签中。
2. 邀请用户编写修订后的代码来修复问题。
以下是一个示例:
<example>
<code>
def calculate_circle_area(radius):
return (3.14 * radius) ** 2
</code>
<issues>
<issue>
3.14 被平方了,实际上应该只有 radius 被平方。
</issue>
<response>
这几乎是对的,但有一个与运算顺序相关的问题。可能有助于写出圆的公式,然后仔细查看代码中的括号。
</response>
</example>
以下是你要分析的代码:
<code>
# 打印乘法逆的函数
def print_multiplicative_inverses(x, n):
for i in range(n):
print(x / i)
</code>
找到相关问题,并以苏格拉底式导师风格写出回应。不要给用户太多帮助!相反,只给他们指导,让他们自己找到正确的解决方案。
将每个问题放在 <issue> 标签中,并将你的最终回应放在 <response> 标签中。
Claude 的回复
这是我对代码的分析:
<issues>
<issue>
函数 `print_multiplicative_inverses` 实际上并没有计算 `x` 相对于 `i` 的乘法逆元。相反,它只是输出了 `x / i` 的结果,而这并不是乘法逆元。
</issue>
<issue>
该函数没有检查 `i` 是否是 `x` 的因子,这是乘法逆元存在的必要条件。如果 `i` 不是 `x` 的因子,那么乘法逆元是不存在的。
</issue>
</issues>
<response>
看起来你正在尝试打印 `x` 相对于从 0 到 `n-1` 的数的乘法逆元。然而,当前的实现并没有完全实现这一点。你能想到如何修改代码,以正确地计算并输出乘法逆元吗?你可能需要考虑乘法逆元的数学定义,以及它与 `x` 的因子之间的关系。
</response>