微信扫码
与创始人交个朋友
我要投稿
上个月介绍DSPy时就有这么一个感觉,Prompt优化领域都卷成这样了,应该很快会有和梯度相关的Prompt优化技术被发出来,并且会超越DSPy。这个周末,这个优化技术验证了我的预想。GRAD-SUM:这是一种可扩展、灵活的自动prompt优化方法,基于梯度汇总,性能超越DSPy,或许它将彻底改变prompt工程的游戏规则。
图片由xiumaodalle生成
复杂数学问题Orca Math:GRAD-SUM 0.575 vs DSPY 0.455
检索问答任务Neural Bridge RAG:GRAD-SUM 0.915 vs DSPY 0.885
常识推理任务HellaSwag:GRAD-SUM 0.795 vs DSPY 0.48
多跳推理问答HotPot QA:GRAD-SUM 0.725 vs DSPY 0.626
多领域知识测试MMLU:GRAD-SUM 0.625 vs DSPY 0.56
开放域对话评估MT& Vicuna Bench:GRAD-SUM 0.95 vs DSPY 0.823
论文题目和地址:GRAD-SUM:Leveraging Gradient Summarization for Optimal Prompt Engineering(https://arxiv.org/abs/2407.12865v1)
01
GRAD-SUM的核心优势
传统的prompt优化过程往往是一个耗时耗力的手动过程,需要不断生成、评估和修改prompt。虽然已经有一些自动化prompt工程的尝试,但它们要么只适用于特定任务,要么成本过高,难以大规模应用。
DSPy我介绍有一段时间了,但很多朋友还是一头雾水,甚至实验过后并没有得到想要的结果。封装的模块,以及复杂的优化方法让很多人望而却步,甚至有时对中文的支持并不友好。没关系,现在有个简单一些的GRAD-SUM来了。
往期推荐
DSPy并非手写Prompt万能替代品,掌握这6个有效策略,能增强DSPy应用程序
GRAD-SUM的核心思想是将gradient-based优化技术与自然语言处理相结合。它不仅可以自动优化prompt,还能根据用户定义的任务描述和评估标准进行个性化调整。最令人兴奋的是,GRAD-SUM引入了一个全新的gradient summarization模块。这个模块能够有效地概括和综合多个反馈,从而生成更加通用和强大的prompt。为了验证梯度汇总模块的效果,研究团队进行了消融实验。结果显示,引入梯度汇总模块平均提升了5%的性能。这证明了该模块在提高prompt泛化能力方面的关键作用。
GRAD-SUM并不依托于封装的模块,而是用NLP领域一种叫做Beam search的优化搜索算法作为核心算法,在搜索空间保持多个“最佳”候选解,而不是仅关注单一的最优解。
GRAD-SUM的核心优势:
1. 高度灵活:适用于各种任务和场景
2. 成本效益:优化过程高效,节省时间和资源
3. 性能卓越:在多个基准测试中consistently优于现有方法
4. 易于使用:只需提供任务描述和评估标准,无需复杂设置
5.泛化能力:生成的新prompt能够更好地适应整个数据集,而不仅仅是某些特定样本。
02
GRAD-SUM实现流程
GRAD-SUM的优化过程包含5个关键模块:生成、评估、梯度生成、梯度汇总和prompt编辑。让我们逐一探讨这些模块的工作原理。
1. 生成模块:构建基础
生成模块需要三个关键元素:数据集、prompt和用于生成输出的LLM。这个模块的作用是根据给定的prompt和数据集生成初始响应。
2. 评估模块:智能判断
评估模块接收生成的响应,并根据用户定义的评估标准进行评分。这里的一个创新点是使用LLM作为评判器,这使得GRAD-SUM能够适应各种复杂的评估场景。
3. 梯度生成模块:精准反馈
梯度生成模块分析评估结果,并为每个未达到满分的响应生成改进建议。这些建议就像是传统机器学习中的"梯度",指导着prompt的优化方向。
4. 梯度汇总模块:智慧凝练
这是GRAD-SUM最独特的创新。梯度汇总模块将所有单独的改进建议综合成一个统一的、通用的优化方向。这确保了优化后的prompt不会过度拟合某些特定样本,而是能够在整个数据集上表现良好。以往的方法,如(Pryzant et al., 2023)提出的技术,往往是基于单个输出的反馈来生成新的prompt。这种方法容易导致生成的prompt过于特定,难以泛化到整个数据集。
5. Prompt编辑模块:精准优化
03
带走优化过的Prompt
You are tasked with solving a grade school math question. Follow these detailed steps to ensure a clear and accurate solution:
1. Identify the Mathematical Operation: Begin by determining the type of math operation required (e.g., addition, subtraction, multiplication, division). Clearly state this in your response and explain why this operation is needed for the given question.
2. Outline the Thought Process: Provide a logical and structured approach to solving the problem. Explain your reasoning in detail, as if you are teaching the concept to a student. Ensure each step is connected and follows logically from the previous one, making it easy to follow.
3. Step-by-Step Calculations: Break down the problem into smaller, manageable steps. Show each calculation in detail to demonstrate how you arrive at the solution. Include all intermediate steps and results to offer a comprehensive understanding.
4. Verify Accuracy: After arriving at the solution, double-check your calculations and the final numerical answer to ensure its accuracy. Explain how you verified the correctness of your answer, such as by using inverse operations or checking with a different method.
5. Final Answer: Present the final answer in a clear and precise manner, ensuring it is easy to understand. State explicitly that the answer has been verified for accuracy.
Here is the question: {question}
你需要解决一个小学数学问题。请按照以下详细步骤,确保解答清晰准确:
1. 确定数学运算:首先确定所需的数学运算类型(例如,加法、减法、乘法、除法)。在你的回答中明确指出这一点,并解释为什么这个问题需要这种运算。
2. 概述思路:提供一个逻辑且结构化的方法来解决问题。详细解释你的推理过程,就像你在教学生这个概念一样。确保每一步都与前一步相连,逻辑清晰,易于理解。
3. 步骤计算:将问题分解为较小的、可管理的步骤。详细展示每一步的计算过程,说明你是如何得出解答的。包括所有的中间步骤和结果,以提供全面的理解。
4. 验证准确性:在得到答案后,重新检查你的计算和最终数值答案,以确保其准确性。解释你是如何验证答案正确性的,例如使用反向运算或通过另一种方法检查。
5. 最终答案:以清晰准确的方式呈现最终答案,确保易于理解。明确指出答案已经过验证,确保准确无误。
以下是问题:{question}
任务描述:
任务是在给定特定上下文的情况下回答问题,该上下文应包含答案。
评估标准:
LLM 的输出是否与预期答案相符?如果模型表示没有足够的上下文来回答问题,则给它 0 分。否则,判断人类是否会将输出评为与预期答案相符。只要答案与括号中的预期答案 <EXPECTED ANSWER> 相符,围绕答案添加上下文是可以的。如果相符,则给它 1 分;如果不相符,则给它 0 分。
Initial
任务是在给定上下文的情况下回答问题,该上下文应该包含答案。
按照以下格式进行回答:
问题:
${question}
上下文:
${context}
推理:让我们逐步思考以${produce the answer}。我们...
答案:根据所提供的上下文,问题的答案是...
问题:{question}
上下文:{context}
推理:让我们逐步思考以
DSPy优化过的得分为0.885
DSPy
引导模型通过上下文仔细审查问题,利用高级推理技术有效推导隐含信息,并生成全面且精细的回答,旨在增强整体理解和洞察力。
按照以下格式进行回答:
问题:
${question}
上下文:
${context}
推理:让我们逐步思考以${produce the answer}。我们...
精细回答:根据所提供的上下文,问题的答案是...
问题:{question}
上下文:{context}
推理:让我们逐步思考以
GRADSUM
你需要根据给定的上下文回答一个问题。请按照以下详细步骤,确保你的回答具体、全面,并且完全基于所提供的上下文。
1. 仔细阅读并完全理解问题。明确问题所要求的信息。
2. 彻底分析给定的上下文。识别并提取所有直接与问题相关的信息。
3. 逻辑思考,并逐步将上下文中的相关细节与问题联系起来。清楚地解释你的推理过程,确保详细、连贯,并且直接与上下文相关。
4. 基于详细的推理过程提供最终答案,确保直接回答问题。
使用以下格式来回答:
问题:
{question}
上下文:
{context}
推理:让我们逐步思考以理解和找到答案。首先,识别上下文中与问题相关的具体细节。然后,逻辑地将这些细节联系起来得出答案。确保你的推理清晰、详细且连贯。
答案:基于所提供的上下文,问题的答案是
04
复现GRAD-SUM
论文没有提供任何代码和更为详细的方法,仅仅做了细致的介绍和结果展示。探索未知,对你来讲可能也是富有挑战的事情,你也可以和我一样用流程复现论文的优化方法成为代码或在网页上与LLM交互的伪代码:
代码环境:
from openai import OpenAI
import re
import time
def optimize_prompt(initial_prompt, task_description, evaluation_criteria):
"""GRAD-SUM优化流程"""
current_prompts = [initial_prompt]
best_score = 0
best_prompt = initial_prompt
for iteration in range(MAX_ITERATIONS):
print(f"\nIteration {iteration + 1}")
all_candidates = []
for prompt in current_prompts:
candidates = generate_candidates(prompt, task_description)
all_candidates.extend(candidates)
# 评估所有候选prompts
evaluated_candidates = [(candidate, evaluate_prompt(candidate, evaluation_criteria)) for candidate in all_candidates]
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-09-18
2024-07-02
2024-07-18
2024-07-09
2024-07-15
2024-08-14
2024-07-26
2024-07-10
2024-07-10
2024-10-17
2024-11-20
2024-11-13
2024-10-31
2024-10-29
2024-10-16
2024-09-19
2024-08-28
2024-08-24