Loading...
生成语言模型在解决逻辑与分析性自然语言处理NLP任务方面表现得相当出色。此外,使用提示工程的技巧可以显著提升它们的性能。例如,链式思维CoT被广泛认可能够增强模型解决复杂多步问题的能力。为了进一步提高涉及推理的任务的准确性,一种自一致性提示方法被提出,该方法在语言生成过程中用随机解码替代贪婪解码。
Amazon Bedrock 是一项全面托管的服务,提供来自领先 AI 公司和 Amazon 的高性能基础模型选项,用户可以通过单一 API 使用,具备建设生成 AI 应用的丰富能力,同时确保安全、隐私和负责任的 AI 实践。通过批量推理 API,用户可以更高效地使用 Amazon Bedrock 运行基础模型的推理,批量获取响应。本文展示了如何借助批量推理在 Amazon Bedrock 上实施自一致性提示,提升模型在算术和选择题推理任务上的表现。
语言模型的自一致性提示依赖于生成多个响应并将其汇总为一个最终答案。与 CoT 等单一生成方法相比,自一致性采样和边际化程序生成多种模型完成,从而导致更一致的解决方案。生成给定提示的不同响应之所以可行,是因为采用了随机而非贪婪的解码策略。
下图显示了自一致性与贪婪 CoT 的不同,前者生成多样的推理路径并加以汇总以产生最终答案。
解码器语言模型逐字展开生成文本,根据前文上下文预测下一个标记。对于给定的提示,模型计算每个标记在序列中出现的概率分布。解码过程将这些概率分布转化为实际文本。文本生成受到一组推理参数的调控,这些参数通常是解码方法本身的超参数。其中一个例子是温度,它调节下一个标记的概率分布并影响模型输出的随机性。
贪婪解码是一种决定性的解码策略,在每个步骤中选择概率最高的标记。虽然这种方法简单高效,但由于忽视了更广泛的概率空间,容易产生重复模式。在推理时将温度参数设置为0实质上等同于实施贪婪解码。
采样则通过根据预测的概率分布随机选择后续标记,将随机性引入解码过程。随机性导致输出的多样性更大,更能捕捉潜在输出的丰富性,常常能产生更具创造性的响应。较高的温度值会引入更多波动,增加模型回应的创造性。
通过提示工程,可以增强语言模型的推理能力。特别是,CoT 已被证明能够在复杂的 NLP 任务中引发推理。实施零shot CoT 的一种方式是通过增加“逐步思考”的指令来增强提示。另一种是以少量示例的形式将模型暴露于中间推理步骤的示例中。在这两种情况下,通常使用贪婪解码。与简单指令提示相比,CoT 在算术、常识和符号推理任务上显著提高了性能。
自一致性提示基于这样的假设:在推理过程中引入多样性将有助于模型收敛到正确答案。该技术通过随机解码实现这一目标,具体分三步进行:
以 CoT 示例提示语言模型以引发推理。用采样策略替代贪婪解码,生成多样的推理路径。汇总结果,找到响应集中最一致的答案。自一致性在流行的算术和常识推理基准测试中表现出优于 CoT 提示的性能。此方法的一个局限性是其更高的计算成本。
在这篇文章中,我们展示了自一致性提示是如何增强生成语言模型在两项 NLP 推理任务上的表现:算术问题解决和选择题领域特定问答。我们通过 Amazon Bedrock 的批量推理演示该方法:
在 Amazon SageMaker 笔记本实例的 JupyterLab 中,我们访问 Amazon Bedrock Python SDK。针对算术推理,我们在 GSM8K 数据集上提示Cohere Command。针对多项选择推理,我们在 AWS 认证解决方案架构师 助理考试中提示AI21 Labs Jurassic2 Mid。本教程假设满足以下先决条件:
拥有一个AWS 账户,并在 SageMaker 中托管一个 mlt3medium 笔记本实例。拥有一个附加AmazonBedrockFullAccess和 iamPassRole 策略的AWS 身份与访问管理IAMSageMaker 执行角色,以便在 SageMaker 笔记本实例中运行 Jupyter。拥有一个用于 Amazon Bedrock 批量推理的 IAM BedrockBatchInferenceRole 角色,具有访问 Amazon Simple Storage ServiceAmazon S3和 stsAssumeRole 信任策略。更多信息请参见为批量推理设置权限。访问承载在 Amazon Bedrock 上的模型。在 Amazon Bedrock 控制台中选择 管理模型访问,在可用选项中选择。我们在此演示中使用 Cohere Command 和 AI21 Labs Jurassic2 Mid。运行本文所示代码的预估成本为100美元,假设您在一次运行中使用30条推理路径并采用一个温度值进行自一致性提示。
GSM8K 是一个人类组装的基础数学问题数据集,具有高语言多样性。每个问题需要2到8步才能解决,并需要执行一系列基本运算。该数据通常用于基准评测生成语言模型的多步算术推理能力。GSM8K 训练集包含7473条记录。以下是一个示例:
json{question Natalia sold clips to 48 of her friends in April and then she sold half as many clips in May How many clips did Natalia sell altogether in April and May answer Natalia sold 48/2 = ltlt48/2=24gtgt24 clips in MaynNatalia sold 4824 = ltlt4824=72gtgt72 clips altogether in April and Mayn#### 72}
批量推理允许你异步运行多次对 Amazon Bedrock 的推理调用,从而提高在大数据集上的模型推理性能。该服务目前处于预览状态,仅通过 API 提供。在使用自定义 SDK 访问批量推理 API 时,请参阅运行批量推理。
下载并解压Python SDK至 SageMaker 笔记本实例后,可以在 Jupyter 笔记本单元中运行以下代码进行安装:
python
!pip install q (ls /bedrockpythonsdkreinvent/botocorewhl head 1)!pip install q (ls /bedrockpythonsdkreinvent/boto3whl head 1)
批量推理的输入数据需要以 JSONL 格式准备,包含 recordId 和 modelInput 键。后者应与要在 Amazon Bedrock 上调用的模型的体字段相匹配。特别是,某些Cohere Command支持的推理参数包括用于随机性的 temperature,用于输出长度的 maxtokens,以及用于生成多个响应的 numgenerations,这些内容与 prompt 一同作为 modelInput 传递:
pythondata = [ { recordId 1 modelInput { prompt prompt temperature temperature maxtokens maxtokens numgenerations n } } ]
请参见基础模型的推理参数以获取更多详细信息,包括其他模型提供者。
我们的算术推理实验设置为少样本条件,不对 Cohere Command 进行自定义或微调。我们使用从链式思维表20和自一致性表17论文中提取的同一组八个少样本示例。通过将示例与 GSM8K 训练集中的每个问题串联,创建提示。
我们将 maxtokens 设置为 512,并将 numgenerations 设置为5,为 Cohere Command 所允许的最大值。对于贪婪解码,我们设定 temperature 为 0;而对于自一致性,则在 05、07 和 1 的温度下运行三组实验。每种设置根据相应的温度值生成不同的输入数据。数据格式为 JSONL,并存储在 Amazon S3。
python
session = boto3Session()s3 = sessionclient(s3)
suffix = str(uuiduuid4())[8]bucket = fbedrockselfconsistency{suffix}s3createbucket( Bucket=bucket CreateBucketConfiguration={LocationConstraint sessionregionname})
inputkey = fgsm8k/T{temperature}/inputjsonls3data = for row in data s3data = jsondumps(row) ns3putobject(Body=s3data Bucket=bucket Key=inputkey)
创建批量推理作业需要一个 Amazon Bedrock 客户端。我们指定 S3 输入和输出路径,并为每个调用作业指定一个唯一名称:

python
bedrock = boto3client(bedrock)
inputconfig = {s3InputDataConfig {s3Uri fs3//{bucket}/{inputkey}}}outputconfig = {s3OutputDataConfig {s3Uri fs3//{bucket}/{outputkey}}}
suffix = str(uuiduuid4())[8]jobname = fcommandbatchT{temperature}{suffix}
通过将 IAM 角色、模型 ID、作业名称和输入/输出配置作为参数传递给 Amazon Bedrock API 来创建作业:
pythonresponse = bedrockcreatemodelinvocationjob( roleArn=farnawsiam{accountid}role/BedrockBatchInferenceRole modelId=coherecommandtextv14 jobName=jobname inputDataConfig=inputconfig outputDataConfig=outputconfig)jobarn = response[jobArn]
可通过相应的 API 调用来列出作业、监控,以及停止批量推理作业。当作业创建完成时,它们的状态最初显示为 Submitted,然后是 InProgress,最后可能为 Stopped、Failed 或 Completed。
python
jobdetails = bedrockgetmodelinvocationjob(jobIdentifier=jobarn)
如果作业成功完成,可以通过其唯一的输出位置从 Amazon S3 检索生成的内容。
安易加速器安卓版python
s3prefix = fs3//{bucket}/outputpath = jobdetails[outputDataConfig][s3OutputDataConfig][s3Uri]replace( s3prefix )outputfolder = jobdetails[jobArn]split(/)[1]outputfile = ( f{jobdetails[inputDataConfig][s3InputDataConfig][s3Uri]split(/)[1]}out)resultkey = f{outputpath}{outputfolder}/{outputfile}
obj = s3getobject(Bucket=bucket Key=resultkey)content = obj[Body]read()decode(utf8)strip()split(n)
print(jsonloads(content[0])[modelOutput][generations][0][text])
输出示例:Natalia sold 48 1/2 = 24 clips less in May This means she sold 48 24 = 72 clips in April and May The answer is 72
Cohere Command 的自一致性提示在 GSM8K 数据集上的准确性优于贪婪 CoT 基线。对于自一致性提示,我们在三个不同的温度下独立采样30条推理路径,设置 topP 和 topK 为其默认值。最终解决方案通过选出出现频率最高的选项来汇总,若出现频率相同,则随机选择其中一项。我们计算的准确性和标准差值是基于100次运行的平均值。
下图显示了 Cohere Command 在 GSM8K 数据集上的准确性,其中使用贪婪 CoT蓝色和自一致性在温度值 05黄色、07绿色和 10橙色下采样的路径数量对比。
从图可以看出,自一致性在低至三条采样路径时就提升了算术的准确性