ChatGPT|OpenAI的GPT最佳实践:获得更好结果的六大策略

1,496 阅读27分钟

写清楚Prompt

首先得确定GPT无法读懂您的想法,所以如果输出太长,请要求简短答复;
如果输出太简单,请要求专家级别的写作;
如果您不喜欢这种格式,请演示您希望看到的格式;
GPT猜测的越少,你得到的答案的可能性就越大;

策略:

  • 在您的查询中包含详细信息以获得更相关的答案
  • 要求采用一种角色来回答
  • 使用分隔符清楚地表示输入的不同部分
  • 指定完成任务所需的步骤
  • 举例子
  • 指定所需的输出长度

提供参考文本

GPT可以自信地编造虚假答案,特别是当被问及深奥的主题或引文和URL时,就像一张笔记可以帮助学生在考试中取得更好的成绩一样,向GPT提供参考文本可以帮助学生更少地捏造答案;

策略:

  • 指示模型使用参考文本进行回答
  • 指示模型使用参考文本中的引用进行回答

将复杂任务拆分为更简单的子任务

正如将复杂系统分解为一组模块化组件是软件工程中的良好实践一样,提交给GPT的任务也是如此;
复杂的任务往往比简单的任务有更高的错误率;
此外,复杂任务通常可以重新定义为较简单任务的工作流,其中使用较早任务的输出来构建后续任务的输入;

策略:

  • 使用意图分类来识别与用户查询最相关的说明
  • 对于需要很长对话的对话应用程序,总结或过滤之前的对话
  • 对长篇文档进行分段总结,并递归构建完整摘要

GPT一些时间去"思考"

如果被要求将17乘以28,你可能不会立即知道,但仍然可以随着时间的推移计算出来。
同样,GPT在试图立即回答问题时会犯更多的推理错误,而不是花时间找出答案。
在回答之前要求一系列的推理可以帮助GPT更可靠地推理出正确的答案。

策略:

  • 指示模型在匆忙得出结论之前制定出自己的解决方案
  • 使用内部独白或一系列查询来隐藏模型的推理过程
  • 在询问模型之前确认是否遗漏了什么

使用外部工具

通过向他们提供其他工具的产出来弥补GPT的弱点。
例如,文本检索系统可以告诉GPT有关相关文档的信息,代码执行引擎可以帮助GPT进行数学运算和运行代码。
如果一项任务可以通过工具而不是GPT更可靠或更高效地完成,那么就把它卸下来,以便两者兼而有之。

策略:

  • 使用基于嵌入的搜索实现高效的知识检索
  • 使用代码执行来执行更准确的计算或调用外部API

系统的测试变化

如果您可以衡量性能,那么提高性能就会更容易。
在某些情况下,对提示的修改将在一些孤立的示例上实现更好的性能,但会导致在一组更具代表性的示例上整体性能变差。
因此,为了确保更改对性能产生净积极影响,可能有必要定义一个全面的测试套件(也称为"评估")。

策略:

  • 参照黄金标准答案评估模型输出

具体策略

1、写清楚Prompt

策略:在您的查询中包含详细信息以获得更相关的答案

为了获得高度相关的响应,请确保请求提供任何重要的详细信息或上下文。否则,你将让模型来猜测你的意思。

更糟更好
如何在Excel中添加数字?如何在Excel中将一行美元金额相加?我想自动为一整张行执行此操作,所有合计在名为"Total"的列中的右侧结束。
谁是总统?谁是2021年的墨西哥总统?选举的频率是多少?
编写计算斐波纳契数列的代码。编写一个打字函数来有效地计算斐波纳契数列。自由地对代码进行注释,以解释每一部分的作用以及为什么以这种方式编写。
总结会议记录。在一个段落中总结会议记录。然后写一份演讲者的降价列表和他们的每个要点。最后,列出发言者建议的下一步步骤或行动项目(如果有)。

策略:要求采用一种角色来回答

系统消息可用于指定模型在其回复中使用的角色。

系统当我请求帮助写东西时,你会回复一份文件,每一段至少包含一个笑话或俏皮的评论。
用户给我的钢制螺栓供应商写一封感谢信,感谢他们在短时间内准时交货。这使我们有可能交付一份重要的订单。

策略:使用分隔符清楚地表示输入的不同部分

三重引号、XML标记、章节标题等分隔符可以帮助区分要区别对待的文本部分。

用户总结用三个引号分隔的文本,"""在此插入文字"""
系统您将获得两篇关于同一主题的文章(以XML标记分隔)。 首先,总结每一篇文章的论点。 然后指出他们中的哪一个更有说服力,并解释为什么。
用户 在此插入第一篇文章 在此插入第二篇文章
系统您将获得论文摘要和建议的标题。论文标题应该让读者清楚地了解论文的主题,但也应该引人注目。如果标题不符合这些标准,请提出 5 个替代方案。
用户摘要:在此插入摘要;标题:在此插入标题

对于诸如此类的简单任务,使用分隔符可能不会对输出质量产生影响。然而,任务越复杂,消除任务细节的歧义就越重要。

策略:指定完成任务所需的步骤

某些任务最好指定为一系列步骤,明确地写出这些步骤可以使模型更容易地遵循它们。

系统使用以下分步说明来响应用户输入。 步骤 1 - 用户将为您提供三引号中的文本。用一个句子总结这段文字,并加上前缀"Summary:"。 步骤 2 - 将步骤 1 中的摘要翻译成西班牙语,并添加前缀"翻译:"。
用户"""在此插入文字"""

策略:举出例子

提供适用于所有示例的一般说明通常比通过示例演示任务的所有排列更有效,但在某些情况下,提供示例可能更容易。
例如,如果您打算让模型复制一种响应用户查询的特定风格,而这种风格很难明确描述,这就是所谓的"不太可能"的提示。

系统以一致的风格回答。
用户教我耐心。
助手流冲刷出最深的山谷,发源于温和的泉水;最伟大的交响乐源自一个音符;最复杂的挂毯都是从一根单独的线开始的。
用户教我有关海洋的知识。

策略:指定所需的输出长度

您可以要求模型生成具有给定目标长度的输出,目标输出长度可以根据单词、句子、段落、项目符号等的数量来指定。
但是,请注意,指示模型生成特定数量的单词并不能达到很高的精度,该模型可以更可靠地生成具有特定数量的段落或项目符号的输出。

用户用大约 50 个单词概括由三引号分隔的文本。"""在此插入文字"""
用户总结两段中用三引号分隔的文本。"""在此插入文字"""
用户将由三引号分隔的文本总结为 3 个要点。"""在此插入文字"""

2、提供参考文本

策略:指示模型使用参考文本进行回答

如果我们可以为模型提供与当前查询相关的可信信息,那么我们就可以指示该模型使用所提供的信息来组成其答案。

系统使用提供的由三重引号引起来的文章来回答问题。 如果在文章中找不到答案,请写"我找不到答案"。
用户<插入文章,每篇文章均由三引号分隔> 问题:<在此处插入问题>

鉴于GPT的上下文窗口有限,为了应用这一策略,我们需要一些方法来动态查找与所问问题相关的信息。
嵌入可以用来实现高效的知识检索。有关如何实现这一点的更多详细信息,请参阅策略"使用基于嵌入的搜索来实现高效的知识检索"

策略:指示模型使用参考文本中的引用进行回答

如果输入得到了相关知识的补充,则可以直接请求模型通过引用所提供文档中的段落来在其答案中添加引用。
请注意,然后可以通过提供的文档中的字符串匹配以编程方式验证输出中的引用。

系统您将获得一份由三重引号和一个问题分隔的文档。 您的任务是仅使用提供的文档回答问题,并引用用于回答问题的文档段落。 如果文档不包含回答此问题所需的信息,则只需写:"信息不足"。 如果提供了问题的答案,则必须附有引文注释。使用以下格式引用相关段落({"引用":…})。
用户"""<在此处插入文档>""" 问题:<在此处插入问题>

3、将复杂的任务拆分成更简单的子任务

策略:使用意图分类来识别与用户查询最相关的指令

对于需要大量独立指令集来处理不同情况的任务,首先对查询类型进行分类并使用该分类来确定需要哪些指令可能是有益的。
这可以通过定义与处理给定类别中的任务相关的固定类别和硬编码指令来实现。
也可以递归地应用此过程,将任务分解为一系列阶段。
这种方法的优点在于,每个查询将仅包含执行任务的下一阶段所需的那些指令,与使用单个查询执行整个任务相比,这可以导致较低的错误率。
这还可以降低成本,因为越大的提示运行成本越高。

系统我们将向您提供客户服务查询。将每个查询分为主要类别和次要类别。提供 json 格式的输出,其中包含以下键:主要和次要。 主要类别:计费、技术支持、帐户管理或一般查询。 计费二级类别: - 取消订阅或升级 - 添加付款方式 - 收费说明 - 费用争议 技术支持二级类别: - 故障排除 - 设备兼容性 - 软件更新 帐户管理二级类别: - 密码重置 - 更新个人信息 - 关闭帐户 - 帐户安全 一般查询二级类别: - 产品信息 - 定价 - 反馈 - 与人交谈
用户我需要让我的互联网重新工作。

根据客户查询的分类,可以向GPT模型提供一组更具体的说明来处理下一步,例如,假设客户在"故障排除"方面需要帮助。

系统您将收到需要在技术支持环境中进行故障排除的客户服务查询。通过以下方式帮助用户: - 要求他们检查进出路由器的所有电缆是否已连接。请注意,随着时间的推移,电缆松动是很常见的。 - 如果所有电缆均已连接并且问题仍然存在,请询问他们正在使用哪种路由器型号 - 现在您将建议他们如何重新启动其设备: - 如果型号是 MTD-327J,建议他们按红色按钮并按住 5 秒钟,然后等待 5 分钟后再测试连接。 - 如果型号是 MTD-327S,建议他们拔下并重新插入,然后等待 5 分钟再测试连接。 - 如果客户的问题在重新启动设备并等待 5 分钟后仍然存在,请通过输出 {"IT 支持请求"} 将他们连接到 IT 支持。
用户我需要让我的互联网重新工作。

请注意,模型已被指示发出特殊字符串来指示对话状态何时发生变化。
这使我们能够将我们的系统变成一个状态机,其中状态决定注入哪些指令。 通过跟踪状态、哪些指令与该状态相关,以及可选地允许从该状态进行哪些状态转换,我们可以为用户体验设置护栏,而使用不太结构化的方法很难实现这一点。

策略:对于需要很长对话的对话应用程序,总结或过滤之前的对话

由于GPT具有固定的上下文长度,因此用户和助理之间的对话不能无限期地继续,其中整个对话被包括在上下文窗口中。 解决此问题有多种解决方法,其中之一就是总结之前的对话。
一旦输入的大小达到预定阈值长度,这可以触发总结部分对话的查询,并且先前对话的摘要可以作为系统消息的一部分包括在内。
或者,可以在整个对话过程中在后台以异步方式总结先前的对话; 另一种解决方案是动态选择对话中与当前查询最相关的先前部分;

策略:分段总结长文档,递归构建完整的摘要

由于GPT具有固定的上下文长度,因此它们不能用于在单个查询中总结大于上下文长度减去生成的摘要的长度的文本。 要总结一个非常长的文档,例如一本书,我们可以使用一系列查询来总结文档的每个部分。
章节摘要可以连接和汇总,生成摘要摘要。这一过程可以递归地进行,直到总结出整个文档。
如果需要使用前面章节的信息来理解后面的章节,那么另一个可能有用的技巧是在书中任何给定点之前包括文本的连续摘要,同时在该点总结内容。
OpenAI之前使用GPT-3的变体进行的研究已经研究了这种程序对书籍摘要的有效性。

4、给GPT一些时间去"思考"

策略:指示模型得出结论之前找出自己的解决方案

有时,当我们明确指示模型在得出结论之前从基本原则进行推理时,我们会得到更好的结果。
例如,假设我们想要一个模型来评估学生对一道数学问题的解决方案,解决这个问题最明显的方法就是简单地询问模型学生的解是否正确。

系统确定学生的解决方案是否正确。
用户问题陈述:我正在建造一个太阳能发电装置,我需要帮助解决财务问题。 - 土地成本为 100 美元/平方英尺 - 我可以以 250 美元/平方英尺的价格购买太阳能电池板 - 我协商了一份维护合同,每年将花费我 10 万美元,另外还要额外花费 10 美元/平方英尺第一年运营作为平方英尺数的函数。 学生的解决方案:设 x 为装置的尺寸(以平方英尺为单位)。 1. 土地成本:100x 2. 太阳能电池板成本:250x 3. 维护成本:100,000 + 100x 总成本:100x + 250x + 100,000 + 100x = 450x + 100,000
系统该学生的解决方案是正确的。

但这位学生的解决方案实际上是不正确的!通过首先提示模型生成自己的解决方案,我们可以让模型成功地注意到这一点。

系统首先制定自己的问题解决方案。然后将你的解决方案与学生的解决方案进行比较,并评估学生的解决方案是否正确。在你自己完成问题之前,不要决定学生的解决方案是否正确。
用户问题陈述:我正在建造一个太阳能发电装置,我需要帮助解决财务问题。 - 土地成本为 100 美元/平方英尺 - 我可以以 250 美元/平方英尺的价格购买太阳能电池板 - 我协商了一份维护合同,每年将花费我 10 万美元,另外还要额外花费 10 美元/平方英尺第一年运营作为平方英尺数的函数。 学生的解决方案:设 x 为装置的尺寸(以平方英尺为单位)。 1. 土地成本:100x 2. 太阳能电池板成本:250x 3. 维护成本:100,000 + 100x 总成本:100x + 250x + 100,000 + 100x = 450x + 100,000
系统设 x 为安装尺寸(以平方英尺为单位)。 1. 土地成本:100x 2. 太阳能电池板成本:250x 3. 维护成本:100,000 + 10x 总成本:100x + 250x + 100,000 + 10x = 360x + 100,000 学生的解决方案不正确。 他们在维护成本计算中犯了一个错误,使用了 100x 而不是 10x。第一年运营的正确总成本是 360x + 100,000。

策略:使用内部独白或一系列查询来隐藏模型的推理过程

前面的策略说明,对于模型来说,在回答特定问题之前对问题进行详细的推理有时很重要。
对于某些应用程序,模型用来得出最终答案的推理过程不适合与用户分享。
例如:在辅导应用程序中,我们可能希望鼓励学生自己找出答案,但模型对学生解答的推理过程可能会向学生揭示答案。 内心独白是一种可以用来缓解这种情况的策略,内部独白的想法是指示模型将对用户隐藏的输出部分转换为结构化格式,从而使解析它们变得容易。 然后,在将输出呈现给用户之前,对输出进行解析,并且只显示输出的一部分。

系统请按照以下步骤回答用户的疑问。 步骤 1 - 首先找出你自己的问题解决方案。不要依赖学生的解决方案,因为它可能是不正确的。将您此步骤的所有工作用三引号 (""") 括起来。 第 2 步 - 将您的解决方案与学生的解决方案进行比较,并评估学生的解决方案是否正确。将您此步骤的所有工作用三引号 ("") 括起来")。 第 3 步 - 如果学生犯了错误,请确定在不泄露答案的情况下可以给学生什么提示。将这一步的所有工作用三引号 (""") 括起来。 步骤 4 - 如果学生犯了错误,请向学生提供上一步的提示(在三引号之外)。而不是写"步骤 4 - ..."写"提示:"。
用户问题陈述:<插入问题陈述> 学生解决方案:<插入学生解决方案>

或者,这可以通过查询序列来实现,在该序列中,除了最后一个之外,所有查询的输出对最终用户都是隐藏的。 首先,我们可以要求模型自己解决问题。
由于这个初始查询不需要学生的解决方案,因此可以省略它。这提供了一个额外的优势,即模型的解不会因学生尝试的解而产生偏差。

用户<插入问题陈述>

接下来,我们可以让模型使用所有可用的信息来评估学生解决方案的正确性。

系统将您的解决方案与学生的解决方案进行比较,并评估学生的解决方案是否正确。
用户问题陈述:"""<插入问题陈述>""" 您的解决方案:"""<插入模型生成的解决方案>""" 学生的解决方案:"""<插入学生的解决方案>"""

最后,我们可以让模型使用自己的分析来构建一个以助人为乐的导师的角色的回复。

系统你是一名数学导师。如果学生犯了错误,请以不透露答案的方式向学生提供提示。如果学生没有犯错,只需给他们一个鼓励性的评论。
用户问题陈述:"""<插入问题陈述>""" 您的解决方案:"""<插入模型生成的解决方案>""" 学生的解决方案:"""<插入学生的解决方案>""" 分析:"""<插入模型从上一步生成的分析>"""

策略:询问模型在之前的过程中是否遗漏了任何内容

假设我们使用一个模型来列出与特定问题相关的来源的摘录,在列出每个摘录之后,模型需要确定它是应该开始编写另一个摘录,还是应该停止编写。
如果源文档很大,模型通常会过早停止,并且无法列出所有相关摘录。
在这种情况下,通过使用后续查询提示模型查找它在之前的过程中错过的任何摘录,通常可以获得更好的性能。

系统您将获得一份由三重引号分隔的文档。你的任务是选择与以下问题相关的摘录:"人工智能历史上发生了哪些重大的范式转变。" 确保摘录包含解释它们所需的所有相关上下文 - 换句话说,不要提取缺少重要上下文的小片段。 提供 JSON 格式的输出,如下所示: [{"excerpt": "..."}, ... {"excerpt": "..."}]
用户"""<在此插入文档>"""
助手[{"excerpt": "模型在这里写一个摘录"}, ... {"excerpt": "模型在这里写另一个摘录"}]
用户还有更多相关摘录吗?注意不要重复摘录。还要确保摘录包含解释它们所需的所有相关上下文 - 换句话说,不要提取缺少重要上下文的小片段。

5、使用外部工具

策略:使用基于嵌入的搜索实现高效的知识检索

如果作为其输入的一部分提供,模型可以利用外部信息源。这可以帮助模型生成更有见地和最新的响应。
例如,如果用户询问有关特定电影的问题,添加有关该电影的高质量信息(例如演员、导演等...)可能是有用的。
嵌入可以实现高效的知识检索,从而可以在运行时将相关信息动态添加到模型输入中。
文本嵌入是一种可以度量文本串之间关联度的向量。相似或相关的字符串将比不相关的字符串距离更近。
这一事实,加上快速向量搜索算法的存在,意味着嵌入可以用来实现高效的知识检索。
具体地说,文本语料库可以被分成块,并且每个块可以被嵌入和存储。
然后,可以嵌入给定查询,并且可以执行向量搜索以从语料库中找到与该查询最相关的嵌入文本块(即,在嵌入空间中最接近)。

策略:使用代码执行来执行更准确的计算或调用外部API

不能依靠GPT自己准确地执行算术或长时间计算。
在需要这样做的情况下,可以指示模型编写和运行代码,而不是自己进行计算。
具体地说,可以指示模型将打算运行的代码放入指定的格式(例如三重回溯)。
在生成输出后,可以提取并运行代码。
最后,如有必要,代码执行引擎(即Python解释器)的输出可以作为模型的输入提供给下一个查询。

系统您可以通过将Python 代码括在三个反引号中来编写和执行Python 代码,例如"此处代码为"。用它来执行计算。
用户求以下多项式的所有实值根:3x**5 - 5x4 - 3*x3 - 7*x - 10。

代码执行的另一个很好的用例是调用外部API,如果指导模型正确使用API,它就可以编写使用该API的代码。 通过向模型提供说明如何使用API的文档和/或代码示例,可以指导模型如何使用API。

系统您可以通过将 Python 代码括在三个反引号中来编写和执行它。 另请注意,您可以访问以下模块来帮助用户向朋友发送消息: python import message message.write(to="John", message="Hey,想在下班后见面吗?")

警告:执行模型生成的代码本身并不安全,在任何试图执行此操作的应用程序中都应采取预防措施。特别是,需要沙箱代码执行环境来限制不受信任的代码可能造成的危害。

6、系统地测试变化

有时很难判断更改(例如新指令或新设计)是否使您的系统变得更好或更差,看几个例子可能会暗示哪个更好,但由于样本量较小,很难区分真正的改进或随机运气,也许这种变化有助于某些输入的性能,但会损害其他输入的性能。

评估程序(或"评估")对于优化系统设计很有用,好的评价是:

  • 代表真实世界的用法(或至少是多样化的)
  • 包含许多测试用例,以获得更强大的统计能力(请参阅下表以获取指导原则)
  • 易于自动化或重复
检测95%置信度所需样本大小的差异
30%~10%
10%~100
3%~1,000
1%~10,000

对产出的评估可以由计算机、人工或混合进行,计算机可以使用客观标准(例如:具有单一正确答案的问题)以及一些主观或模糊标准来自动化评估,其中通过其他模型查询来评估模型输出,OpenAI evals是一个开源软件框架,提供了创建自动评估的工具。
当存在被认为同样高质量的一系列可能的产出时(例如:对于答案较长的问题),基于模型的评估可能是有用的。
可以通过基于模型的评估实际评估的内容和需要人工评估的内容之间的界限是模糊的,并且随着模型变得更有能力而不断变化。
我们鼓励进行实验,以确定基于模型的评估在多大程度上适用于您的用例。

策略:参照黄金标准答案评估模型输出

假设已知一个问题的正确答案应该参考一组特定的已知事实,然后,我们可以使用模型查询来计算答案中包含了多少必需的事实。 例如,使用以下系统消息:

系统您将获得由三引号分隔的文本,该文本应该是问题的答案。检查答案中是否直接包含以下信息: - 尼尔·阿姆斯特朗是第一个登上月球的人。- 尼尔·阿姆斯特朗 (Neil Armstrong) 首次登上月球的日期是 1969 年 7 月 21 日。 对于每个点,请执行以下步骤: 1 - 重述该点。 2 - 提供最接近这一点的答案的引文。 3 - 考虑不知道主题的阅读引文的人是否可以直接推断出该点。在做出决定之前解释一下原因或原因。 4 - 如果 3 的答案是"是",则写"是",否则写"否"。最后,计算有多少个"是"答案。将此计数提供为 {"count": <在此处插入计数>}。

这是一个满足这两点的示例输入:

系统<在上面插入系统消息>
用户"""尼尔·阿姆斯特朗因成为第一个踏上月球的人类而闻名。这一历史性事件发生在 1969 年 7 月 21 日,阿波罗 11 号任务期间。"""

以下是仅满足一个点的示例输入:

系统<在上面插入系统消息>
用户"""尼尔·阿姆斯特朗走下登月舱时创造了历史,成为第一个在月球上行走的人。"""

这是一个不满足任何条件的示例输入:

系统<在上面插入系统消息>
用户"""69 年夏天,一次伟大的航行,阿波罗 11 号,像传奇之手一样大胆。阿姆斯特朗迈出一步,历史展开,"一小步,"他说,为了一个新世界。""

这种基于模型的评估有许多可能的变体,考虑以下变体,它跟踪候选答案和黄金标准答案之间的重叠类型,并且还跟踪候选答案是否与黄金标准答案的任何部分相矛盾。

系统<在上面插入系统消息>
用户使用以下步骤响应用户输入。在继续之前充分重申每个步骤。即"第一步:原因..."。 步骤 1:逐步推理所提交答案中的信息与专家答案相比是否是:不相交、相等、子集、超集或重叠(即存在交集,但不是子集/超集)。 第2步:逐步推理提交的答案是否与专家答案的任何方面相矛盾。 步骤 3:输出一个 JSON 对象,结构如下:{"type_of_overlap": "disjoint" or "equal" or "subset" or "superset" or "overlapping", "contradiction": true or false}

这是一个示例输入,其答案不合格,但与专家答案并不矛盾:

系统<在上面插入系统消息>
用户问题:"""尼尔·阿姆斯特朗最著名的事件是什么?它发生在哪一天?假设 UTC 时间。"""提交的答案:"""他没有在月球上行走过吗?"""专家解答: """尼尔·阿姆斯特朗最著名的是第一个登上月球的人。这一历史性事件发生在 1969 年 7 月 21 日。"""

这是一个示例输入,其答案与专家答案直接矛盾:

系统<在上面插入系统消息>
用户问题:"""尼尔·阿姆斯特朗最著名的事件是什么?它发生在哪一天?假设 UTC 时间。""" 提交的答案:"""1969 年 7 月 21 日,尼尔·阿姆斯特朗成为第二个在上面行走的人继巴兹·奥尔德林之后登上月球。""" 专家解答:"""尼尔·阿姆斯特朗最著名的是第一个登上月球的人。这一历史性事件发生在 1969 年 7 月 21 日。"""

下面是一个带有正确答案的示例输入,它还提供了比必要的更多的细节:

系统<在上面插入系统消息>
用户问题:"""尼尔·阿姆斯特朗最著名的事件是什么?它发生在哪一天?假设 UTC 时间。""" 提交的答案:"""1969 年 7 月 21 日大约 02:56 UTC,尼尔·阿姆斯特朗成为第一个人类踏上月球表面,标志着人类历史上的一项里程碑式的成就。""" 专家解答:"""尼尔·阿姆斯特朗最著名的是第一个登上月球的人。这一历史性事件发生在7月21日,1969年。

参考

本文翻译:platform.openai.com/docs/guides…