使用Adala掌握数学推理
在大型语言模型(LLMs)领域,掌握数学推理能力是一项显著挑战。这项任务需要结合多步骤问题解决、自然语言理解和强大的计算能力。在严格测试这些能力的数据集中,OpenAI的GSM8K作为评估这些能力的关键基准脱颖而出。
在这次技术探索中,我们将应用Adala——一种旨在提升提示效率的前沿工具——来增强LLM在GSM8K数据集上的表现。通过运用Adala,我们观察到LLM在该数据集上的基准性能实现了29.26%的绝对提升,准确率从44.88%提升至74.14%。更令人印象深刻的是,这一性能飞跃是在无需人工提示工程的情况下实现的,充分彰显了该工具的高效性。
什么是Adala?
Adala (自主数据标注智能体) 是一个专为数据处理和标注设计的智能体框架。它创新性地将大语言模型与多种工具和方法相结合,从而形成Adala智能体。这些智能体擅长处理和标注数据样本。Adala在处理大规模未标注数据集时尤其有价值,因为从零开始处理这些数据是一项艰巨的挑战。通过迭代式的"人在回路"流程,Adala智能体能够逐步提升其处理能力,并以人工标注的真实数据作为改进基准。
Adala框架概述
接下来,让我们深入探讨Adala在GSM8K数据集上的实际应用。
GSM8K数据集
GSM8K数据集涵盖了小学数学课程中遇到的广泛数学挑战。该数据集不仅限于基础算术,还涉及更复杂的领域,如代数、几何和概率。GSM8K的独特之处在于它将自然语言处理(NLP)与数学推理相结合。数据集中的每个问题都以文字问题的形式呈现,要求大型语言模型不仅要理解文本,还要识别关键信息并应用相关数学概念来推导解决方案。
让我们进一步分解这个问题。当面对来自GSM8K的文字题时,大型语言模型首先需要解析语言——这包括理解上下文、识别提出的具体数学问题,以及区分关键信息和冗余信息。随后,它必须进行数学推理,范围涵盖从简单计算到复杂的代数运算或几何解释。
来自GSM8K数据集的样本。
总的来说,GSM8K数据集不仅仅是对计算能力的衡量。它是一个复杂、多方面的基准测试,严格评估大型语言模型在融合语言理解、数学逻辑和多步骤问题解决复杂性方面的能力。这使其成为评估和提升像Adala改进的大型语言模型能力的理想测试平台。
我们将通过以下代码将这些数据加载到数据框中开始我们的示例:
import pandas as pd
from datasets import load_dataset
gsm8k = load_dataset("gsm8k", "main")
df_train = pd.DataFrame({'question': gsm8k['train']['question'], 'answer': gsm8k['train']['answer']})
df_test = pd.DataFrame({'question': gsm8k['test']['question'], 'answer': gsm8k['test']['answer']})
df_train.head()
下面展示了我们训练数据框中的一个样本。
训练数据框中的一个样本
Adala 数学求解智能体
创建Adama数学解题智能体的第一步是构建特定的技能集,以指导我们的大语言模型处理数据。这里,我们引入了一个"TransformerSkill"模板,用于帮助分离问题和答案。我们的方法最初避开了详细指令,倾向于采用学习驱动的方式。这意味着智能体在处理更多数据的过程中,会逐渐获得识别和应用这些指令的能力。
让我们深入了解代码结构:
skills = LinearSkillSet(skills=[
TransformSkill(
name='math_solver',
# instructions=prompt
# Our agent will learn the instructions
instructions='',
# instructions=prompt,
input_template='Q: {question}',
# here is the baseline established in Kojima et al., 2022 paper
# output_template='A: Let’s think step by step. {rationale}\nFinal numerical answer:{answer}',
output_template='A: {answer}',
instructions_first=False
)
])
在这个代码片段中,'TransformSkill'被定义时没有预设指令。我们可以在这里加入一个提示作为起点,但我们将让智能体从数据中自然演化其提示。输入模板很简单,将每个条目标记为问题,而输出目前设置为仅提供答案而不包含详细原理。您可能会注意到我们的技能属于`LinearSkillSet`的一部分。一个智能体可以拥有多项技能并学习它们。在此示例中,我们将只关注其中一项。
接下来,我们创建一个Adala智能体,为其配备数学求解技能和运行环境。该环境类似于训练场,包含一个训练数据集和一个用于评估智能体响应准确性的关键函数。
我们采用GPT-4作为智能体的核心大语言模型。该模型将被提示评估数据集中的样本,将生成的响应与真实答案进行比较,并提出对我们技能指令的改进建议。
agent = Agent(
skills=skills,
# this is where agent receives the ground truth signal
environment = StaticEnvironment(
df=df_train,
matching_function=evaluate_answers
),
teacher_runtimes={'gpt4': OpenAIChatRuntime(model='gpt-4-1106-preview')},
default_teacher_runtime='gpt4'
)
配置好我们的智能体后,我们可以在GSM8K数据集上测试其性能,无需特定指令。这个测试阶段至关重要,因为它为后续改进建立了基准。我们在测试数据集上运行智能体,有意省略答案以评估其自主解题能力。
# run baseline agent on a test dataset
result_baseline = agent.run(df_test.drop(columns='answer'))
accuracy = StaticEnvironment(df=df_test, \
matching_function=evaluate_answers).get_feedback(skills, \
result_baseline).get_accuracy()
print(f'Baseline accuracy: {accuracy["answer"]}')
Applying skill: math_solver
100%|██████████| 1319/1319
# Baseline accuracy: 0.4488248673237301
这一过程使用GPT-4获得了44.88%的基准准确率,考虑到缺乏具体指令的情况下,这一成绩令人印象深刻。这将成为我们使用Adala框架进行进一步优化的起点。
智能体学习
现在,我们来到Adala能力的核心——它的学习机制。在我们的场景中,Adala智能体通过与环境的交互来提升技能:即数学问答训练数据集。以下是该过程的概述:
- 初始预测与比较: 智能体预测答案并与数据集中的实际答案进行比较。
- 错误分析: 对于错误的预测,智能体会进行彻底分析,找出错误发生的位置和原因。
- 教学改进: 基于此分析,智能体会要求LLM修订其技能指令,从而从错误中学习。
我们的实验聚焦于非常小的一批5个样本,将这个学习过程迭代五次。我们观察智能体在每次迭代中对这些样本的表现,追踪其进展。
agent.learn(batch_size=5, learning_iterations=5)
学习过程会产生大量输出,但智能体指令的演变尤其值得关注。学习完成后,这些指令会变得更加全面和定制化:
print(agent.skills['math_solver'].instructions)
For each arithmetic word problem provided, follow these steps:
- Begin by comprehensively identifying and understanding the relationships, conditions, and any given numerical
information, including the units of measurement (e.g., days, weeks, months) and the related arithmetic operations
involved in the scenario.
- Clarify the units and timing of events in the word problem, and restate them if necessary to align with the final
units desired for the solution.
- Select the appropriate mathematical operations necessary to obtain the solution. These operations may involve
addition, subtraction, multiplication, division, or the application of ratios, percentages, and proportions. Pay
special attention to any transformations or calculations that entail changes over time, such as growth rates,
aging, or accumulation of resources, ensuring proper application of increases, decreases, or proportional changes.
- Perform the calculations methodically, verifying at each juncture that the operations and results conform to the
problem's conditions. Clearly articulate each step of your calculation process, demonstrating the setup of
equations or proportions and explaining the choice of mathematical methods to maintain clarity and logic throughout
your reasoning.
- Examine each intermediate result within multi-step problems, confirming accuracy before proceeding further.
Reiterate the logical sequence of steps, especially when the problem involves cumulative or sequential changes, to
ensure continuity and logical progression in the calculation process.
- Conclude by cross-checking the final answer against the conditions and expectations set forth by the problem.
Resolve any inconsistencies encountered and articulate a coherent, exact solution.
新学习的指令指导智能体:
- 透彻理解问题中的关系、条件和数值数据。
- 明确并重申单位和时间线,以符合解决方案的要求。
- 选择适当的数学运算,考虑随时间变化的转换或计算。
- 系统地执行计算,根据问题的条件验证每一步。
- 检查多步骤问题中的中间结果,确保准确性和逻辑连贯性。
- 最后,根据问题的初始条件交叉检查解决方案,并纠正任何不一致之处。
这些由智能体自主开发的指令,展示了Adala技能调优能力的强大之处。它们结构精巧、条理清晰,展现出人工操作难以企及的细节水平。
随着技能集的提升,我们再次测试智能体:
result_new = agent.run(df_test.drop(columns='answer'))
accuracy = StaticEnvironment(df=df_test, \
matching_function=evaluate_answers).get_feedback(skills, \
result_baseline).get_accuracy()
print(f'New accuracy: {accuracy["answer"]}')
计算新的准确率:
New accuracy: 0.7414708112206216
结果如何?74.14%的新准确率相较最初44.88%的基准线实现了29.26%的显著提升。仅通过少量样本的五轮迭代就能取得如此重大突破,充分证明了Adala学习机制的有效性及其对大型语言模型性能的变革性影响。
超越提示调优的进阶之路
在我们的探索中,我们仅使用了五个训练示例的小型数据集,就显著提升了模型性能。这一成果只是展现了Adala所能实现潜力提升的冰山一角。优化智能体技能的空间非常广阔,Adala为我们提供了超越简单提示调优的多种探索途径。
以下是后续步骤和可能性的详细说明:
- 扩展训练数据集: 虽然我们最初只使用了最小数据集,但增加训练样本数量可以显著提升智能体的学习能力和准确性。每个新增样本都会为智能体的理解增添细微差别和复杂性,从而进一步优化其能力。
- 将技能应用于新的未标注数据: 当智能体的技能达到一定熟练程度后,我们可以将其部署到全新的未标注数据集上。这在初始标签有限或缺失的场景中尤为有利。智能体的预测结果能提供初步的标签集,为后续数据标注和分析奠定宝贵基础。
- 迭代学习与人类输入整合: 随着我们收集更多真实数据,这些数据可以输入到智能体的环境中,促进持续学习和技能提升。这种人机输入与AI驱动分析相结合的迭代过程,形成了一个动态改进循环。
这种结合自动化学习与人工监督的迭代过程,充分展现了Adala的优势。它通过持续学习和人工验证,不仅加速了数据标注流程,还提升了输出结果的质量。Adala构建了一个机器学习与人类专业知识协同共生的环境,使模型得以持续优化并日趋精准。
结论
我们通过Adala的探索展示了其利用真实数据作为指导自动优化提示的卓越能力。将Adala应用于GSM8K数据集后,我们显著提升了基线准确率。这一进步不仅停留在理论层面:当我们对照GSM8K排行榜时(撰写本文时),仅通过学习五个示例,我们的排名就从第70位跃升至第38位。
这个示例展示了Adala在数据引导自动化和提示调优中的实际效用和影响力。请务必查看示例笔记本完整版,该资源位于Adala GitHub仓库,并加入Adala Discord频道的讨论。