2026年11月08日 欢迎访问 读到
首页 / 小说书库 / AI辅助编程实战 / 正文
点评
第3章 提示工程

提示工程(Prompt Engineering)是机器学习和自然语言处理领域的一个重要分支,它专注于研究如何让计算机更准确地理解和解释人类的语言。这个学科的核心目标是探索与LLM和复杂AI系统有效对话的方法,以便它们能够生成我们所需的答案。这里所指的模型是专门用来处理和生成类似于人类语言的响应的模型。

正如在向他人寻求建议时需要提供背景信息和明确的请求一样,LLM同样需要这样的上下文。设计问题或提示时需要精心构思,有时甚至需要在问题中加入提示或附加信息,以确保LLM能够准确理解你的需求。

向LLM提问并不总是一次性的,有时更像是与LLM进行一系列对话,通过不断交流和调整问题,最终获得有价值的信息。

假设你正在使用AI辅助编程工具开发一个Web应用程序。一开始,你可能会询问如何用JavaScript创建一个简单的用户登录系统。初次的回答中可能包含基础用法,但随着对更高级的功能提出需求,你随后给出了更具体的提示,比如询问如何实现密码加密和安全的数据库连接。每一次与AI辅助编程工具的互动都是对其响应的细化,以使其更好地满足项目的特定需求。

需要注意的是,提示工程师已经成为一个非常受欢迎的职业。根据Willis Towers Watson提供的数据,提示工程师的平均年收入约为13万美元,尽管这个数字可能偏于保守。为了吸引顶尖人才,雇主通常会提供十分吸引人的期权和奖金。

在本章中,我们将深入探讨提示工程,并介绍一些实用的策略和技巧,帮助你更有效地与LLM进行交流。

提示工程是一门结合了艺术与科学的技艺。一方面,它要求你精心挑选合适的词汇和语调,以引导AI按照你的意图做出反应,这是在塑造对话的流向。你需要一点直觉和创造性思维,来精炼自己的语言并激发出细致的回复。

对于软件开发者,这样的要求可能显得颇具挑战性。传统上,开发者按照一套规则编写代码,结果要么成功,要么由编译器明确指出错误所在。这是一个逻辑性强、可预测的过程。

但是,提示工程则显得更加自由和不可预测。

另一方面,提示工程同样包含大量的科学元素。正如第2章所讨论的,你需要深入理解AI模型的工作原理和细节。除了创造力以外,你还需要精确性、可预测性,以及能够重现结果的能力。这意味着你必须进行实验,尝试不同的提示,分析结果,并不断调整,直至获得期望的响应。

对于提示工程,不要期待会有一个一劳永逸的神奇解决方案。市面上的许多课程、视频和图书声称揭示了提示工程的“秘诀”。对此,你需要保持谨慎,否则可能会感到失望。

此外,人工智能和机器学习正在不断进化,新的模型和技术层出不穷。因此,在提示工程中,期待有一种固定不变的技术显然是不现实的。技术在不断变化,我们也需要不断学习和适应。

有时提示工程可能会令人感到沮丧。尽管LLM采用了先进的基于概率的框架,但即使是对提示语措辞的微小调整,也可能显著改变模型的输出结果。

以下是提示工程面临的一些挑战。

啰嗦

有时LLM可能会过于健谈。你给出一个提示,它们会提供一段详尽的回答,而实际上你可能只需要一个简短的答案。但它们往往会附带大量相关信息或事实,导致回答过于冗长。如果希望LLM直截了当地回答,你可以要求它们“简明扼要”。

不可移植

在一个LLM中表现出色的提示,在另一个LLM中可能效果不佳。换句话说,如果想要从ChatGPT切换到Gemini或GitHub Copilot,则可能需要调整提示,因为每个LLM都有自己独特的训练、设计和专长。不同的模型是在不同的数据集和算法上训练出来的,对提示的理解和解释也各不相同。

长度敏感

LLM可能会对过长的提示感到困惑,开始忽略或误解你输入的部分内容。这就好比模型的注意力开始分散,它们的回答也会变得含糊不清。因此,应避免在提示中提供过多的细节,并尽量将提示内容限制在一页以内。

歧义

如果你的提示不够明确,LLM可能会感到困惑,并提供与事实不符或完全虚构的回答。因此,提供清晰的提示至关重要。

尽管存在这些挑战,但仍有一些方法可以改善结果。本章的后续部分将介绍一些改善提示效果的策略和技巧。

提示(prompt)主要由4个部分组成,如图3-1所示。

图3-1 提示的4个主要组成部分

在构建有效的提示时,上下文是关键,它定义了LLM在回答问题时所扮演的角色。紧接着是具体的指令,比如要求模型进行总结、翻译或分类。为了使LLM能够更准确地处理并给出恰当的回答,你需要提供相关的输入内容。此外,明确指出你期望的输出格式也很重要。

实际上,并不是上述所有组件(即提示的4个主要组成部分)在每种情况下都是必需的。有时,你可能只提供一个组件——比如一个明确的指令——就能获得满意的答复。但作为一般规则,向LLM提供的细节越具体,得到的回答往往越精准。

接下来的内容将介绍上述每个组件。

在编写提示时,通常从简洁的一两句话开始,以便为模型提供必要的上下文。这通常包括指定LLM在回答时应该扮演的角色或身份。通过设定上下文,LLM不仅能够提供更精确的回答,而且这些回答将与上下文紧密相关,使得结果更富有意义且具有针对性。

比如,你想调试一段代码,此时可以提供以下上下文。

提示:你是一位专注于Java应用程序调试的经验丰富的软件工程师。

再比如,你想学习某种算法的优化技术,此时可以提供以下上下文。

提示:你是一位擅长算法优化的资深软件开发人员。

提供清晰的上下文有助于引导LLM以合适的视角和专业知识来处理提示,从而以正确的方式给出回答。

提示中至少应包含一个明确的指令。虽然可以添加很多指令,但应谨慎行事,因为过多的指令可能会使LLM感到困惑,从而难以获得所需的答案。

我们分析一下为什么会出现这种情况。首先,当存在多个指令时,情况可能变得复杂。如果指令不够清晰或相互矛盾,LLM可能会感到迷茫,不确定应优先考虑哪个指令,或者如何平衡各个指令。

其次,指令越多意味着LLM需要处理的信息量越大。LLM必须理解和解析提示的每个部分,然后确定如何综合这些部分,以形成一个连贯的回答。这不仅需要强大的处理能力,有时还可能导致错误或偏差。

最后,LLM会按顺序阅读指令。指令的排列方式会影响模型对提示的理解,进而影响得到的回答类型。

因此,专业建议是保持简单。与其一次性向LLM提出一系列复杂问题,不如尝试将问题拆分成一系列较小的提示。使查询过程更像是一次轻松的对话,而不是一段冗长的独白。

提示中的指令类型多种多样。接下来的内容将讨论软件开发中常用的一些指令类型。

一种摘要是浓缩,这种摘要可以将较长的文本浓缩成较短的形式,同时保留主要观点和要点。摘要对于快速掌握冗长的文档非常有用。对于软件开发者,在表3-1所列的情况下,摘要是一个特别方便的工具。

表3-1 编程任务的摘要提示

另一种摘要是主题建模,这种摘要通过统计模型辨识文档集中出现的抽象“主题”。以下是一些专为开发者设计的主题建模提示。

提示:请从以下文本中识别讨论的关键主题:{text}

提示:请从以下文本中提取关键词,以推断其主要话题:{text}

提示:请根据以下文本的内容,为其推荐标签:{text}

文本分类是一项让计算机为文本分配标签的任务。情感分析是文本分类的一种应用,LLM能够识别社交媒体帖子中表达的是积极、消极还是中性的情感倾向。对于开发者,情感分析是一款宝贵的工具,可用于衡量用户对其开发的应用程序的反馈。

以下是一些实用的参考提示。

提示:请分析这些客户评论,并告诉我整体上是积极、消极还是中性的情感倾向?{text}

提示:这是我们用户论坛上讨论最新更新的一些帖子。你能为我总结整体的情感倾向吗?{text}

提示:我整理了来自应用商店页面的一系列反馈。你能根据其情感倾向对评论进行分类吗?{text}

提示:请评估这些关于我们产品公告的博客帖子评论的情感倾向。大家的共识是什么?{text}

你可以指导LLM提供建议,这对于开发者是缩短工作流程的宝贵资源,无论是消除错误、优化代码还是更高效地使用API。

以下是一些实用的参考提示。

提示:调用以下代码片段时抛出NullPointerException异常。你能帮助我找出潜在原因并提出修复建议吗?

提示:这是我编写的一个函数,用于对整数列表进行排序。你能否提出一些优化建议,使其运行得更快或更具可读性?

LLM的建议可以成为你工作中的强大助力,它不仅能节省大量的时间,还能提供你可能未曾考虑到的想法,特别是在处理复杂或微妙的任务时。

然而,LLM并非无懈可击。一个潜在的问题是,模型的回答可能过于简化,忽略了某些细节。此外,由于模型的知识是截至某个时间点的,它可能无法掌握最新的信息或趋势。

总之,LLM的建议可以是开启一项工作的方式,但你需要自己深入研究和探索,以获得更全面的了解并加以掌握。

本地化本质上是使软件适应特定地区的语言和文化的过程。它让软件能够使用当地语言,并理解当地特有的行为习惯,是扩大市场并与目标受众建立紧密联系的关键。本地化带来的好处是显而易见的:用户感到更加满意,因为他们觉得软件是为他们量身定制的,而用户的满意度直接关系到企业利润的增长。

在竞争激烈的市场中,本地化可以为产品提供竞争优势,尤其当竞品在这方面存在不足或完全没有本地化时。此外,使软件适应当地的习俗和法规,不仅能让软件在市场中占有一席之地,往往还能使其成为当地用户唯一的选择。

然而,本地化并非没有挑战。它既昂贵又耗时,需要严格的质量保证来维持软件在不同语言中的一致性。与此同时,软件开发是一个持续的过程,本地化则是一个不断更新和增加新功能的循环,每个新功能都可能有自己的本地化需求。这种持续性增加了项目的复杂性和成本。

这正是LLM可以发挥作用的地方。这种先进的系统能够在多种语言之间进行翻译,成为开发者工具箱中的一款强大工具。表3-2列出了一些在本地化过程中可能会用到的语言翻译提示,以帮助开发者更高效地进行软件的本地化。

表3-2 语言翻译提示范例

我们应当审慎地对待LLM的多语言能力,因为它们并非完美无缺。有时这些模型可能会忽略语言之间的微妙差异、习语表达和独特的文化背景。语言之间的细微差别极其复杂,直接翻译并不总是正确的方法;更重要的是要传达出正确的意义和语境。

处理特定术语或专有名称尤为棘手,特别是在目标语言中没有直接对应词汇的情况下。此外,保持正确的语调和风格也是一个挑战。这不仅仅是单词选择的问题,更关乎如何表达,而这在不同的语言和文化中可能大相径庭。

让语言专家审查LLM的输出结果可以避免许多潜在的问题,确保翻译的准确性和文化适应性。

在构建提示时,使用####或"""等特殊符号来明确区分指令和希望LLM学习的内容或信息,是一种非常有效的策略。这些符号充当边界或标记,旨在帮助LLM清晰地识别指令的结束点和内容的开始点。

例如,当软件开发者需要从长篇文档中提取有关正在集成的新API的核心要点时,可以采用以下提示结构。

提示:从下面的文本中提取出API的关键实施步骤。

文档:"""

{API文档内容}

"""

使用"""分隔符将指令与API文档内容明确分开的方法既简洁又直观。它不仅能让LLM更清楚地理解任务要求,还提高了获得清晰、准确的步骤摘要的可能性。此外,分隔符有助于整理提示信息,使其更易于阅读和理解,这对于处理较长或较复杂的文本输入尤其有用。

在提示中,可以告诉LLM如何格式化输出。请看下面的例子。

提示:创建一个Python函数,接收用户对象列表(每个对象包含一个用户的ID和姓名),并返回一个将用户ID映射到姓名的JSON对象。将输出转换为JSON格式。

ChatGPT的响应如下。

{

    "code": "def map_user_ids_to_names(users):\n

      user_map = {user['id']: user['name'] for user in users}\n

      return user_map",

    "example_usage": {

        "input": [

            {"id": 1, "name": "Alice"},

            {"id": 2, "name": "Bob"},

            {"id": 3, "name": "Charlie"}

        ],

        "output": {

            "1": "Alice",

            "2": "Bob",

            "3": "Charlie"

        }

    }

}

其他可以进行格式化输出的提示范例如表3-3所示。

表3-3 格式化输出提示范例

在构建提示时,可以通过指定期望的回答长度来进一步指导LLM。例如,通过使用“请提供一个简短的概述”或“请写出一个详细的解释”等指令,可以帮助模型理解回答的深度和广度。如果需要更精确地控制回答的长度,可以明确地给出要求,如“请将回答限制在300字以内”。虽然有时LLM可能会超出设定的字数限制,但它通常会在指定的大致范围内给出回答。

接下来我们将探讨一些制作有效提示的优秀实践,以帮助你从LLM中获得所需的答案。然而,这些建议不应视为一成不变的法则,它们更多是基于经验的指导性建议,可能带有主观性,并非不可更改。随着你与LLM交流的深入,你将逐渐发现一些适合自己的、更为有效的提问技巧。这些提问技巧是提示工程这一领域的重要组成部分。

编写一个恰当的提示就像在愉快的对话中找到那个恰到好处的点,这是与文本生成系统达成默契的关键步骤。提示中的信息越详尽、越清晰越好。如果提示过于模糊,LLM就可能做出错误的假设,甚至产生不切实际的幻想。

首先,我们来看一些过于笼统的提示范例。

提示:开发一个增强数据安全的功能。

提示:你能构建一款自动化流程的工具吗?

提示:优化这段代码。

提示:我们需要一个处理事务的函数。

相比之下,以下是一些更详细的提示,它们更有可能让你获得满意的结果。

提示:开发一个Python函数,用于从字符串中解析日期。该函数应能处理以下日期格式:YYYY-MM-DD、MM/DD/YYYY和Month DD, YYYY。它应返回一个datetime对象。请提供一个脚本,演示该函数正确处理每种日期格式的至少3个示例,并在附带文档中说明任何依赖项、函数中使用的逻辑,以及如何运行该脚本。

提示:开发一个SQL查询,从数据库中检索2023年最后一个季度消费超过500美元的客户列表。该查询应返回客户的全名、电子邮件地址、消费总金额和上次购买日期。查询结果应按消费总金额降序排列。请确保该查询已针对性能进行了优化。

在构建提示时,明确专业术语和缩略语至关重要。缩略语在不同的语境中往往有不同的含义,这可能导致模型提供不相关或无效的回答。因此,最好使用专业术语的完整形式,并对所使用的专业术语提供清晰的定义或解释。

假设你正在使用ChatGPT帮助解决数据库连接问题,以下是一个设计不当的提示。

提示:DB连接出现问题。如何解决?

在上述提示中,“DB”指代不清,因为它可能指MySQL、PostgreSQL或其他数据库系统,而且也没有说明数据库连接问题的细节。

更有效的提示如下。

提示:在尝试使用JDBC连接PostgreSQL数据库时,我遇到了连接超时问题。如何解决这个问题?

这个改进后的提示清楚地指明了正在使用的数据库系统(PostgreSQL)、连接的方法(使用JDBC)以及遇到的具体问题(连接超时)。

马克·吐温说:“恰当的表达和不恰当的表达,它们之间的区别就像闪电虫和闪电之间的区别。”这句话同样适用于写作提示的编写。一个好的提示能够直击要点,引导出清晰、有力的回答;而一个含糊的提示则可能导致混淆和无效的交流。

在零样本学习(zero-shot learning)中,往往只需要提供一个精心构思的提示,就能引导模型给出正确的答案。这种方法在许多情况下都非常有效。然而,考虑到编程语言和框架的复杂性,有时单纯的提示可能不足以让你获得满意的结果,这时就需要采取进一步的措施。

少样本学习(few-shot learning)是解决这一问题的有效途径。少样本学习指的是LLM能够利用极少量的示例或训练数据来理解任务要求并执行任务。与传统的机器学习模型相比,这无疑是一个巨大的优势,因为传统模型通常需要大量的训练数据才能完成复杂的任务。LLM之所以具备这一能力,是因为它在针对特定任务进行微调之前,就已经在广泛的网络文本上进行了大规模的预训练。

以下是一个少样本学习的示例。假设我们需要生成一个函数,用于对给定的数字列表进行归一化处理,使取值区间变为[0, 1]。在指令中,我们提供了几个输入和归一化输出的示例。

提示:根据以下示例,将数字列表归一化,使取值区间变为[0, 1]。

输入:[2, 4, 6, 8] 输出:[0, 0.3333, 0.6667, 1]

输入:[5, 10, 15] 输出:[0, 0.5, 1]

输入:[1, 3, 2] 输出:[0, 1, 0.5]

请生成一个Python函数,该函数接受一个数字列表作为输入,并返回另一个归一化的数字列表。

通过这种方式,ChatGPT可以从提供的示例中“学习”并生成所需的代码,如下所示。

def normalize(numbers):

    min_value = min(numbers)

    max_value = max(numbers)

    if min_value == max_value:

        return [0] * len(numbers) # Handle the case where

                                  # all numbers are the same

    else:

        return [(x - min_value) / (max_value - min_value) for x in numbers]

# Test the function with one of the examples

print(normalize([2, 4, 6, 8]))  # Output: [0.0, 0.3333333333333333,

                                # 0.6666666666666666, 1.0]

引导词是一种特殊的关键字或短语,它能够指导LLM生成特定类型的输出。在某些情况下,仅仅一个恰当的引导词就足以激发模型按照预期的方式做出回应。以下是一个示例。

提示:

# 创建一个简单的Python函数,该函数能够

# 1. 提示输入华氏温度

# 2. 将华氏温度转换为摄氏温度

def

这里使用def作为引导词,告知模型接下来应该开始编写一个Python函数。表3-4列出了更多的引导词。

表3-4 引导词

2022年,Google的研究人员在论文“Chain-of-Thought Prompting Elicits Reasoning in Large Language Models”中提出了一种创新的提示技术——思维链(Chain-of-Thought,CoT)提示。CoT提示通过将复杂问题分解为一系列步骤,显著增强了LLM的推理能力。实际上,CoT提示的原理与少样本学习类似,通过向模型展示少量示例来引导其理解和执行任务。

在软件代码生成任务中,CoT提示显得尤为有效。下面用一个示例来说明。假设你打算使用Python语言的Flask框架来开发一个具备用户注册与登录功能的Web应用程序,表3-5展示了如何应用CoT提示来指导模型。

表3-5 CoT提示范例

在构建提示时,引导性问题可能导致LLM产生不寻常或不准确的回答。为了获得最佳结果,提示应当保持中立,避免带有任何倾向。同时,清晰和明确的表述对于避免误解和臆断至关重要。

以下提示会产生引导性问题。

提示:迁移到微服务架构并不总是能提升系统可扩展性,对吗?

优化后的提示如下。

提示:迁移到微服务架构在系统可扩展性方面有哪些优势和潜在挑战?

设想你并不熟悉面向对象编程中继承的概念。打开ChatGPT并输入以下提示。

提示:解释面向对象编程中继承的概念。

你将得到一个详细的答复。如果你希望获得更易于理解的解释,一种有效的方法是让LLM使用类比来说明。

提示:通过类比解释面向对象编程中继承的概念。

ChatGPT:把继承想象成一棵家谱树,孩子从父母那里继承某些特征和属性,而这些特征和属性也可能是孩子从祖父母那里继承的。

在这里,ChatGPT通过类比的方式提供了一种更加具体且形象的解释,来帮助阐释继承的核心要素。

在第2章中,我们提到提示LLM时可能会导致其产生幻觉,即生成的内容是虚假或误导性的,但LLM会把内容当成真的来响应。幻觉对于准确性要求高的软件开发来说尤其具有挑战性。

本章中的经验教训无疑可以帮助减少幻觉问题。然而,即便是精心设计的提示,也可能触发幻觉。造成幻觉的原因多种多样,包括如下这些。

缺乏基本事实验证

LLM根据从训练数据中获得的知识生成响应,但它无法验证信息的准确性或真实性。

过拟合与记忆

模型可能会记住训练数据集中不正确或误导性的信息,尤其是当这些信息重复出现或较为常见时。

训练数据的偏见

如果训练数据包含偏见、不准确或虚假的信息,则模型可能会在输出中复制这些内容。

推断和推测

模型有时可能会根据数据中的模式进行推断,生成训练数据未充分覆盖的主题或问题的响应。

缺乏或误解上下文

LLM可能会误解上下文或缺乏必要的背景知识,无法准确回答某些提问。模型可能不完全理解一些查询的细微差别或含义。

俚语和习语

俚语和习语可能会产生歧义,导致模型误解原意,尤其是当模型在训练过程中没有看到足够多的俚语或习语示例时。

为了减少幻觉,首先应避免提出过于开放性的问题,例如下面的提示。

提示:优化数据库有哪些不同的方法?

开放性提示可能会鼓励模型进行猜测或过度概括,模型也可能误解问题的意图或所需回答的格式,导致回答偏离主题或包含虚构信息。

一种有效的方法是提供一组预定义的选项,让LLM从中选择。例如,上述提示可以改写成如下形式。

提示:以下哪一项是优化数据库的方法,索引、碎片整理还是压缩?

另外,考虑要求LLM对某个结论给出判断。下面是一个有效的提示。

提示:在Java中初始化数组时,下列语法是否正确?请回答“是”或“否”。

也可以在提示中包含多个步骤,以引导模型完成结构化流程,降低偏离正轨的可能性。

提示:

步骤1 创建斐波那契数列生成器。

步骤2 使用迭代法。

步骤3 编写一个名为generate_fibonacci的Python函数,将整数n作为参数。

步骤4 该函数以列表形式返回斐波那契数列中的前n个数字。

在构建提示时,确保安全和隐私至关重要。实际上,应将采取适当预防措施的责任纳入组织的规章制度。在提示中应避免包含任何敏感或个人信息,例如个人身份信息。以下是一个包含个人身份信息的提示。

提示:你将如何解决John Doe报告的账号john.doe@example.com的登录问题?

更明智的提示方式是去标识化,例如下面的提示。

提示:如何处理用户报告的登录问题?

避免在提示中泄露任何敏感的系统详细信息也是明智之举。应避免构建如下提示。

提示:如何修复IP地址为192.168.1.1的生产服务器上的数据库连接错误?

相反,使用更通用的问题往往更安全,例如下面的提示。

提示:如何修复通用数据库连接错误?

此外,要确保提示不会在无意中诱发不正当的行为。从安全角度来看,如下提示是恰当的。

提示:如何检测和防止SQL注入?

但下面的提示可能会诱导一些不良意图。

提示:如何利用网站的SQL漏洞?

除了遵守安全和隐私规则以外,在构建提示时,接受多样性和包容性同样重要。理解和控制偏见(通常反映在训练数据中)至关重要。最好使用中性和包容性的语言,避免在提示中使用任何歧视性或排他性的措辞。此外,从不同人群中获取对提示的反馈也很有帮助,这不仅能提高与LLM互动时的公平性和包容性,还有助于更准确、更全面地理解主题。

到目前为止,我们已经了解逐步引导LLM的整个过程,这是软件代码生成的核心所在。

然而,AI Agent能够提供更进一步的功能。它们不仅可以按照提示执行任务,还能与LLM协同工作,发挥创造力,为你提出的任何目标制订策略和计划。这些Agent能够利用Pinecone和Chroma DB等专业数据库,处理模型所能够理解的复杂词嵌入。

自治的AI Agent是学术研究的成果,通常作为开源项目的一部分使用。它们真正的强大之处在于其自动化能力。接下来我们通过一个示例来解释它们的工作方式。假设你的目标如下。

提示:创建一个简单的带有用户登录系统的天气应用程序。

表3-6列举了自治的AI Agent可能经历的阶段。

表3-6 自治的AI Agent可能经历的阶段

自治的AI Agent技术正站在行业的前沿,并展现出巨大的发展潜力。当然,挑战也在所难免,具体如下。

资源密集型

AI Agent可能会消耗巨大的计算资源,对处理器和数据库造成压力,这可能导致等待时间变长、可靠性降低,以及性能随着时间推移下降。

无限循环

在某些情况下,由于缺乏进展或重复的奖励机制,AI Agent可能会陷入循环,无法取得实际效果。

实验性质

作为新兴技术,AI Agent可能存在一些粗糙边缘,包括漏洞或意外行为,因而可能还不足以承担大型任务,这取决于它们的具体用途。

记忆问题

AI Agent可能会遗漏某些步骤或指令。

多任务处理困难

面对繁重的工作量,AI Agent可能会不知所措。

被细节分散注意力

AI Agent可能会被一些无关紧要的细节困扰,这可能导致它们在选择工具或方法时误入歧途。

支持LLM的另一项创新是检索增强生成(Retrieval-Augmented Generation,RAG)。通过RAG,生成式AI应用(例如使用LangChain框架构建的应用)可以访问外部数据源,通常是矢量数据库。这为模型提供了更多的具体知识,从而增强LLM的响应能力。

在处理复杂的软件开发任务时,针对以下情况,RAG尤其有用。

解决软件缺陷和故障

当开发者遇到软件缺陷和故障时,可以使用RAG技术从网络论坛、缺陷数据库等资源中挖掘出修复方法和解决方案。RAG技术可以根据具体问题提供定制的解决方案或代码补丁。

为代码审查增添价值

RAG技术可以获取公司内部的所有编程最佳实践、标准及必须遵守的规则。这意味着它可以帮助简化代码审查过程,为代码提供有用的技巧,让你的代码更加出色。

加速测试

当需要对代码进行测试时,RAG技术可以充当虚拟测试人员。它能找到各种测试场景和模式,并根据项目需求进行调整,帮助你更快地开发出测试用例或脚本。

在某些情况下,LLM会指出你的提示有问题。例如,假设你提供以下提示。

提示:使用汇编语言编写RESTful API。

ChatGPT的响应如下。

ChatGPT:由于汇编语言的低级特性,使用汇编语言编写RESTful API是非常规的且复杂的。汇编语言通常用于需要对硬件进行细粒度控制的任务,或者用于性能要求很高的应用场景。

重申一下,完美的提示是科学与艺术的结合。我们需要找到合适的方法——运用创造力、直觉和条理清晰的技巧来构建提示,以使LLM提供我们所期望的答案。在这个过程中,并没有一成不变的神奇公式。如果能够清晰地表达提示,确保逻辑连贯,并且提供一些示例,则更有可能得到满意的答案。

这是一个不断尝试和调整的过程。你需要尝试不同的提示,观察它们的成效,然后根据反馈进行调整,再继续尝试。就像其他技能一样,你在不同的主题和任务上练习得越多,你的技巧就会越娴熟。

[5]为了更好地还原两词在书写和含义之间的区别,这里直译lightning bug为闪电虫,实际应译为萤火虫。马克·吐温原意是想表达

[6]Chain-of-Thought Prompting通常译为思维链提示或思想链提示,本书统一译为思维链提示。——译者注

目录
加书签
详情
加书架
打赏
投票
自动滚动
设置
夜间

评论 0条

加载中...

设置

阅读主题
正文字体
字体大小
18
页面宽度
滚动速度
5
语音朗读
翻页模式
💎

余额不足

您的水晶或能量余额不足,请充值后再试。

立即前往充值

🎫 投月票

1 张月票 = 1.00 水晶。感谢支持!

🎁 打赏作品

打赏将直接扣除水晶余额,鼓励作者创作。