Generating Usable Text with AI

使用 AI 生成可用的文本

9 分钟阅读

编者按:这篇文章由 Mutt Data 通过 LangChain 的合作伙伴计划撰写。

简介

概述

在我们之前的讨论中,我们不仅深入研究了实施生成式 AI 应用的挑战,还探讨了针对图像生成问题的有效缓解策略。现在,是时候将我们的重点转移到生成文本时出现的一系列独特挑战上了。

在这篇博文中,我们简要概述了这些挑战,同时分享了我们利用大型语言模型 (LLM) 的一些见解。为了为我们的探索奠定基础,我们将首先介绍一些基本概念,例如提示词提示词工程。让我们直接开始吧!

提示词

如果您在最近几个月参与了生成式 AI 领域,您可能听说过提示词。提示词是特定的用户提供的输入,用于引导 LLM 生成适合给定任务的适当响应。 

正如我们期望演示文稿的章节(引言、讨论、解决方案和结论)有一定的顺序一样,如果我们遵循提示词中的一些结构,LLM 的效果会更好。此外,这种结构可能会因我们想要执行的任务而有很大差异。为了说明,LLM 支持的一些常见任务包括:分类、问答、摘要、代码生成和推理。在为这些不同的任务编写提示词时,根据每种任务类型的具体要求和特点调整结构至关重要。

提示词工程

通过选择合适的词语、短语、句子、标点符号和分隔符来优化输入提示词,从而有效地使用 LLM 的实践,被称为提示词工程。换句话说,提示词工程是以符合 LLM 预期理解的方式与其沟通并提高其性能的艺术。

下面附上了一个结构良好的提示词示例,用于摘要任务

结构良好的提示词示例。摘自 docs.aws.amazon.com

另一方面,如果您的用例是分类,在上下文信息之后为每个类别包含一些示例(输入-响应对)可能会非常有帮助。这被称为少样本提示,也可能适用于更复杂的任务,例如问答。但是,任务越复杂,提高性能所需的示例就越多。

另一种强大的技术是要求 LLM 在给出最终答案之前进行推理解释,也称为“逐步”推理。这背后的基本概念依赖于这些模型的自回归性质,这意味着每个预测的词都会影响序列中下一个元素的生成。请在此处找到更多详细信息:此处。 

最后但并非最不重要的是,我们可以考虑使用修饰符来改进我们的提示词,例如包括有关输入数据的详细信息、指定输出格式或只是在提示词末尾鼓励 LLM。Amazon Web Services 提供了关于此的更多详细信息

1) 少即是多

挑战当使用 LLM 时,我们是在与程序对话,而不是与人对话。

与人类对话不同,在人类对话中我们可以有些混乱并自我纠正,向 LLM 提供复杂或有争议的指令可能会导致不一致和不正确的响应。清晰和直接的指令对于帮助 LLM 专注于相关信息并产生准确的结果至关重要。

解决方案清晰、简洁和智能的提示。

在编写提示词时,尽可能清晰。也称为提示词工程,为清晰简洁的指令选择精确的词语和短语是关键。您还可以探索提示模板,以了解某些任务的有效结构。

示例:让我们考虑两个提示词,用于将食品产品描述从冗长的描述总结为简洁的标题和包装说明。

提示词 1:请分析关于这种食品产品的广泛细节,包括成分、益处、说明和顾客评论。提取最重要的信息,同时考虑营养价值、口味、用户体验和整体市场趋势等各个方面。创建一个适合产品包装的简洁摘要,在简洁性和捕捉产品多方面品质之间取得平衡。此外,确保摘要迎合不同的消费者偏好,并符合当前的行业标准。它应该足够通用,以满足经验丰富的美食爱好者和那些刚接触烹饪体验的人的期望。此外,结合食品科学和技术的任何显着进步,以突出产品的创新功能。

提示词 2 总结食品产品的基本细节,重点强调成分、益处和用户体验。创建一个简短而引人注目的标题和包装说明,确保其对广泛受众的吸引力,并突出任何创新功能。在摘要中强调清晰度和简洁性,同时考虑到美食爱好者多样化的偏好和体验。

哪一个更清晰地描述了任务?

2) 分而治之

挑战:LLM 擅长处理某些特定任务,但我们不应该要求它们同时做一堆任务而使其不堪重负! 

解决方案:通过使用直接的提示词将复杂任务分解为更简单的任务,然后收集结果。

示例:当从长长的电影列表中向用户推荐电影时,我们发现,通过逐个询问电影是否合适,而不是一次性提供长长的电影列表,正确推荐的准确性得到了显着提高。查看以下两个提示词

提示词 1:你是一个语言模型,协助网络平台根据用户的偏好向用户推荐电影。你的目标是以吸引人的方式呈现电影,并按相关性级别排序。以下是所有可用电影的完整列表及其特征。以吸引人的方式描述这些属性,从电影名称开始。电影总列表包括
[ { "电影标题": "大胆的冒险",
    "类别": "冒险",
   "描述": "踏上充满曲折的激动人心的旅程。加入主人公,他们穿越令人叹为观止的风景,面对惊险的挑战。一部您不想错过的电影冒险之旅!",
},,  …(完整列表)...]
提示词 2:你是一个推荐电影的语言模型。你的工作是确定电影类别和描述是否都适合用户的自由书写描述
----
用户描述:{user_description}。 
电影类别:{movie_category}
电影描述:{movie_description}
----
以 JSON 对象回复,格式如下
"reasoning": 简要向用户解释你的理由。
"match": "YES" | "NO"

哪个任务更简单?

3) 大象的力量,蜜蜂的记忆

挑战:虽然 LLM 可以处理广泛的问题,但它们通常难以持续回忆特定的指令。虽然它们的上下文在增长,但它们保留此类细节的能力却在下降。

解决方案:通过管理我们应用程序中的内部状态来减少对 LLM 记忆的依赖。生成受控输出,通过中间步骤过渡以满足检查点和条件。

示例:这个见解来自于我们开发医疗预约安排应用程序的经验。我们的第一种方法是允许模型根据每位医生的可用专科和时间段列表验证所有患者指定的条件,强调禁止添加未列出的专科或时间段。然而,即使在我们已经在同一对话中指出了错误之后,这种策略仍导致 LLM 系统地生成列表中不存在的自定义专科和不可用的时间段。

 作为解决方案,我们通过在验证的步骤(状态)中编排流程来改进了我们的方法:我们首先利用 LLM 收集患者信息,例如就诊原因和可用日期。验证后,LLM 执行了原因与每个可能的专科之间的单独匹配。随后,我们采用了传统的数据库流程,根据相应的专科和可用性筛选医生,这一步骤确保我们克服了发明不存在选项的问题。最后,LLM 向患者展示可用的预约,直到确认一个预约。

我们的医疗预约安排应用程序的状态(浅蓝色)简化图。首先管理用户信息的学习,然后从中匹配正确的专科,并从数据库中筛选可能的医生和时间段

4) 评估性能 

挑战:衡量性能并获得关于文本生成质量的公正指标。 

解决方案:选择标准化的工具来测试和评估 LLM

示例:这是我们在实施医疗预约安排应用程序时面临的一个明显问题。作为第一种方法,我们对一组主题进行了可能的提示词测试套件。指的是应该获得预约的咨询,其他由于缺乏具有该专科的医生而无法完成的咨询,以及最后包含应该因恶意而被忽略或审核的消息。评估测试套件的方法是由一组测试人员手动执行测试,并让他们提供 1 到 5 的满意度评分。这既耗时又与注释者的偏见有关。 

我们了解到,这对于生产环境来说不是正确的方法,并做了一些额外的研究,直到我们发现了一个有用的工具:LangSmith。这是一个为开发面向生产环境的 LLM 应用程序提供支持的平台。它促进了测试和评估过程,并为某些指标提供了标准。此外,它还涵盖了应用程序的监控和调试,这使得整个应用程序生命周期更加高效。

作为我们用例的一个示例,我们发现确认成功的消息(即向用户提供帮助的消息)包含特定信息(如患者姓名、描述的问题和医生姓名)很有价值。

LangSmith 提供了一种用户友好且直接的方法来实现此功能,以及数据集运行的全面指标,包括分数和执行时间的平均值、标准差和百分位数。在这种情况下,从 LangChain Custom Evaluator 部分中概述的示例中汲取灵感,我们开发了一个“Criteria”评估器,利用 LLM 验证响应中是否存在指定的输入值。只需 50 行 Python 代码,我们就一切准备就绪!

为了说明示例,请考虑以下 LLM 任务…

Langchain 代码运行一个针对患者的简单响应任务,包括一些输入字段

现在让我们为我们的测试实现一个标准评估器

评估器对我们数据集中的每个样本执行测试

最后,让我们使用 LangSmith 客户端对先前创建的键值数据集中的每个样本运行测试

LangSmith 客户端代码在先前创建的键值数据集上运行测试

让我们检查 LangSmith 的 Web UI 如何记录一次特定样本的运行轨迹

开箱即用的 CriteriaEvalChain 如果满足标准,则返回 1 分,否则返回 0 分
CriteriaEvalChain prompt 用于评估标准

太棒了!通过这种方式,我们可以针对特定数据集运行具有自定义标准的独立测试,并仅用几行代码即可获得关于我们功能性能的真实指标。 

5) 安全风险

挑战:确保应用程序的可靠性,以减轻潜在的法律问题。

解决方案:对应用程序中的输入和输出都保持严格控制。避免直接利用 LLM 响应用户输入。相反,将您的流程分解为独立的任务或状态,并采用受控的提示词,仅利用 LLM 所需的特定功能。

示例:我们始终集成输入过滤器来验证和分类用户输入。如果用户的意图偏离了应用程序的预期目的,我们会温柔地提醒他们应用程序的指定用途。这种方法帮助我们规避潜在的陷阱,如下面附件中著名的例子所示。

一家公司聊天机器人给予 LLM 过多自由的著名陷阱

结论

总结一下,我们对大型语言模型 (LLM) 在文本生成中的应用所面临的挑战和解决方案的探索,强调了战略考虑的重要性。通过强调提示词的清晰度、任务分割和强大的评估实践,我们为有效的 LLM 应用铺平了道路。 

提出的实用解决方案,包括复杂任务的分解、内部状态的管理以减少对 LLM 记忆的依赖,以及对输入和输出的严格控制,为构建可靠且高效的 AI 文本应用程序提供了可操作的见解。

显而易见的是,一种深思熟虑的 LLM 集成方法,基于实用的方法论,确保了更顺畅和更有影响力的利用这些强大的语言模型。随着我们改进我们的方法,生成式 AI 在可用文本方面的可能性前景持续扩大,有望在未来迎来令人兴奋的发展。人类创造力与 AI 计算能力之间协同作用的持续探索仍然处于这个变革领域的最前沿。