生成语言模型在解决逻辑与分析性自然语言处理(NLP)任务方面表现得相当出色。此外,使用的技巧可以显著提升它们的性能。例如,链式思维(CoT)被广泛认可能够增强模型解决复杂多步问题的能力。为了进一步提高涉及推理的任务的准确性,一种提示方法被提出,该方法在语言生成过程中用随机解码替代贪婪解码。
是一项全面托管的服务,提供来自领先 AI 公司和 Amazon 的高性能基础模型选项,用户可以通过单一 API 使用,具备建设 应用的丰富能力,同时确保安全、隐私和负责任的 AI实践。通过 API,用户可以更高效地使用 Amazon Bedrock运行基础模型的推理,批量获取响应。本文展示了如何借助批量推理在 Amazon Bedrock 上实施自一致性提示,提升模型在算术和选择题推理任务上的表现。
语言模型的自一致性提示依赖于生成多个响应并将其汇总为一个最终答案。与 CoT等单一生成方法相比,自一致性采样和边际化程序生成多种模型完成,从而导致更一致的解决方案。生成给定提示的不同响应之所以可行,是因为采用了随机而非贪婪的解码策略。
下图显示了自一致性与贪婪 CoT 的不同,前者生成多样的推理路径并加以汇总以产生最终答案。

解码器语言模型逐字展开生成文本,根据前文上下文预测下一个标记。对于给定的提示,模型计算每个标记在序列中出现的概率分布。解码过程将这些概率分布转化为实际文本。文本生成受到一组的调控,这些参数通常是解码方法本身的超参数。其中一个例子是,它调节下一个标记的概率分布并影响模型输出的随机性。
是一种决定性的解码策略,在每个步骤中选择概率最高的标记。虽然这种方法简单高效,但由于忽视了更广泛的概率空间,容易产生重复模式。在推理时将温度参数设置为0实质上等同于实施贪婪解码。
则通过根据预测的概率分布随机选择后续标记,将随机性引入解码过程。随机性导致输出的多样性更大,更能捕捉潜在输出的丰富性,常常能产生更具创造性的响应。较高的温度值会引入更多波动,增加模型回应的创造性。
通过提示工程,可以增强语言模型的推理能力。特别是,CoT 已被证明能够在复杂的 NLP任务中。实施零-shot CoT的一种方式是通过增加“逐步思考”的指令来增强提示。另一种是以的形式将模型暴露于中间推理步骤的示例中。在这两种情况下,通常使用贪婪解码。与简单指令提示相比,CoT在算术、常识和符号推理任务上显著提高了性能。
基于这样的假设:在推理过程中引入多样性将有助于模型收敛到正确答案。该技术通过随机解码实现这一目标,具体分三步进行:
自一致性在流行的算术和常识推理基准测试中表现出优于 CoT 提示的性能。此方法的一个局限性是其更高的计算成本。
在这篇文章中,我们展示了自一致性提示是如何增强生成语言模型在两项 NLP 推理任务上的表现:算术问题解决和选择题领域特定问答。我们通过 AmazonBedrock 的批量推理演示该方法:
本教程假设满足以下先决条件:
iam:PassRole
策略的(IAM),以便在 SageMaker 笔记本实例中运行 Jupyter。BedrockBatchInferenceRole
角色,具有访问 (Amazon S3)和 sts:AssumeRole
信任策略。更多信息请参见。![管理 Amazon Bedrock删除)
运行本文所示代码的预估成本为100美元,假设您在一次运行中使用30条推理路径并采用一个温度值进行自一致性提示。
是一个人类组装的基础数学问题数据集,具有高语言多样性。每个问题需要2到8步才能解决,并需要执行一系列基本运算。该数据通常用于基准评测生成语言模型的多步算术推理能力。包含7473条记录。以下是一个示例:
json {"question": "Natalia sold clips to 48 of her friends in April, and thenshe sold half as many clips in May. How many clips did Natalia sell altogetherin April and May?", "answer": "Natalia sold 48/2 = <<48/2=24>>24 clips inMay.\nNatalia sold 48+24 = <<48+24=72>>72 clips altogether in April andMay.\n#### 72"}
批量推理允许你异步运行多次对 Amazon Bedrock 的推理调用,从而提高在大数据集上的模型推理性能。该服务目前处于预览状态,仅通过 API提供。在使用自定义 SDK 访问批量推理 API时,请参阅。
下载并解压至 SageMaker 笔记本实例后,可以在 Jupyter 笔记本单元中运行以下代码进行安装:
# 安装预览 SDK 包
!pip install -q $(ls ./bedrock-python-sdk-reinvent/botocore-_.whl | head -1) !pip install -q $(ls ./bedrock-python-sdk-reinvent/boto3-_.whl | head -1) ```
## 格式化并上传输入数据到 Amazon S3
批量推理的输入数据需要以 JSONL 格式准备,包含 `recordId` 和 `modelInput` 键。后者应与要在 Amazon Bedrock上调用的模型的体字段相匹配。特别是,某些支持的推理参数包括用于随机性的 `temperature`,用于输出长度的 `max_tokens`,以及用于生成多个响应的
`num_generations`,这些内容与 `prompt` 一同作为 `modelInput` 传递:
`python data = 以获取更多详细信息,包括其他模型提供者。
我们的算术推理实验设置为少样本条件,不对 Cohere Command进行自定义或微调。我们使用从链式思维()和自一致性()论文中提取的同一组八个少样本示例。通过将示例与
GSM8K 训练集中的每个问题串联,创建提示。
我们将 `max_tokens` 设置为 512,并将 `num_generations` 设置为5,为 Cohere Command所允许的最大值。对于贪婪解码,我们设定 `temperature` 为 0;而对于自一致性,则在 0.5、0.7 和 1的温度下运行三组实验。每种设置根据相应的温度值生成不同的输入数据。数据格式为 JSONL,并存储在 Amazon S3。
```python
# 设置 S3 客户端
session = boto3.Session() s3 = session.client("s3")
# 创建唯一名称的 S3 桶以存储输入/输出数据
suffix = str(uuid.uuid4())[:8] bucket = f"bedrock-self-consistency-{suffix}"
s3.create_bucket( Bucket=bucket,
CreateBucketConfiguration={"LocationConstraint": session.region_name} )
# 处理数据并以新行格式输出为 JSONL
input_key = f"gsm8k/T{temperature}/input.jsonl" s3_data = "" for row in data:
s3_data += json.dumps(row) + "\n" s3.put_object(Body=s3_data, Bucket=bucket,
Key=input_key) ```
## 创建并运行 Amazon Bedrock 中的批量推理作业
创建批量推理作业需要一个 Amazon Bedrock 客户端。我们指定 S3 输入和输出路径,并为每个调用作业指定一个唯一名称:
```python
# 创建 Bedrock 客户端
bedrock = boto3.client("bedrock")
# 输入和输出配置
input_config = {"s3InputDataConfig": {"s3Uri": f"s3://{bucket}/{input_key}"}}
output_config = {"s3OutputDataConfig": {"s3Uri":
f"s3://{bucket}/{output_key}"}}
# 创建唯一作业名称
suffix = str(uuid.uuid4()):
`python response = bedrock.create_model_invocation_job(
roleArn=f"arn:aws:iam::{account_id}:role/BedrockBatchInferenceRole",
modelId="cohere.command-text-v14", jobName=job_name,
inputDataConfig=input_config, outputDataConfig=output_config, ) job_arn =
response、,以及批量推理作业。当作业创建完成时,它们的状态最初显示为 `Submitted`,然后是
`InProgress`,最后可能为 `Stopped`、`Failed` 或 `Completed`。
```python
# 获取作业详情
job_details = bedrock.get_model_invocation_job(jobIdentifier=job_arn) ```
如果作业成功完成,可以通过其唯一的输出位置从 Amazon S3 检索生成的内容。
```python
# 获取输出文件键
s3_prefix = f"s3://{bucket}/" output_path =
job_details["outputDataConfig"]["s3OutputDataConfig"]["s3Uri"].replace(
s3_prefix, "" ) output_folder = job_details["jobArn"].split("/")[1]
output_file = (
f'{job_details["inputDataConfig"]["s3InputDataConfig"]["s3Uri"].split("/")[-1]}.out'
) result_key = f"{output_path}{output_folder}/{output_file}"
# 获取输出数据
obj = s3.get_object(Bucket=bucket, Key=result_key) content =
obj["Body"].read().decode("utf-8").strip().split("\n")
# 显示第一个问题的答案
print(json.loads(content。最终解决方案通过选出出现频率最高的选项来汇总,若出现频率相同,则随机选择其中一项。我们计算的准确性和标准差值是基于100次运行的平均值。
下图显示了 Cohere Command 在 GSM8K 数据集上的准确性,其中使用贪婪 CoT(蓝色)和自一致性在温度值 0.5(黄色)、0.7(绿色)和
1.0(橙色)下采样的路径数量对比。
![Cohere Command 自一致性与
删除)
从图可以看出,自一致性在低至三条采样路径时就提升了算术的准确性
Leave a Reply