提示词工程教程:提示词优化技术

概述

本教程探讨了在使用大型语言模型时优化提示的高级技术。我们重点介绍两种关键策略:A/B 测试提示和迭代优化。这些方法对于提高 AI 驱动应用程序的有效性和效率至关重要。

主体

随着人工智能语言模型变得越来越复杂,用于与它们交互的提示的质量变得越来越重要。优化的提示可以带来更准确、更相关、更有用的响应,从而提高人工智能应用程序的整体性能。本教程旨在为学习者提供实用的技巧,以系统地改进他们的提示。

内容概要

  1. A/B 测试提示:一种比较不同提示变化的有效性的方法。
  2. 迭代改进:根据反馈和结果逐步改进提示的策略。
  3. 性能指标:衡量和比较不同提示的响应质量的方法。
  4. 实际实现:使用 OpenAI 的 GPT 模型和 LangChain 的实际示例。

教案

1. **设置**:我们将首先使用必要的库和 API 密钥设置我们的环境。 2. **A/B 测试**: - 定义提示的多个版本 - 为每个版本生成响应 - 使用预定义的指标比较结果 3. **迭代细化**: - 从初始提示开始 - 生成响应并评估 - 确定需要改进的领域 - 根据见解完善提示 - 重复这个过程,不断增强提示 4. **绩效评估**: - 定义相关指标(例如相关性、特异性、连贯性) - 实施评分功能 - 比较不同提示版本的分数

在整个教程中,我们将使用实际示例来演示这些技术,为学习者提供快速优化的实践经验。

结论

在本教程结束时,学习者将获得:
  1. 进行 A/B 测试以进行快速优化的实用技巧
  2. 理解提示的迭代改进过程
  3. 能够定义并使用指标来评估即时有效性
  4. 拥有使用 OpenAI 和 LangChain 库进行快速优化的实践经验

这些技能将使学习者能够通过系统地改善与语言模型的交互来创建更有效的人工智能应用程序。

设置

首先,让我们导入必要的库并设置我们的环境。
import os
import re

from langchain_openai import ChatOpenAI
from langchain.prompts import PromptTemplate
import numpy as np

from dotenv import load_dotenv
load_dotenv()

# Set up OpenAI API key
os.environ["OPENAI_API_KEY"] = os.getenv('OPENAI_API_KEY')

# Initialize the language model
llm = ChatOpenAI(model="gpt-4o")

# Define a helper function to generate responses
def generate_response(prompt):
    """使用语言模型生成响应。

    参数:
        prompt(str):输入提示。

    返回: str 
:        生成的响应。
    """
    return llm.invoke(prompt).content

A/B 测试提示

让我们从 A/B 测试开始,比较特定任务的不同提示变化。
# Define prompt variations
prompt_a = PromptTemplate(
    input_variables=["topic"],
    template="用简单术语解释{topic} 。"
)

prompt_b = PromptTemplate(
    input_variables=["topic"],
    template="提供{topic}的初学者友好解释,包括关键概念和示例。"
)

# Updated function to evaluate response quality
def evaluate_response(response, criteria):
    """根据给定的标准评估响应的质量。

    参数:
        响应(str):生成的响应。
        标准(列表):要评估的标准列表。

    返回:
        提示模板:最终完善的提示模板。
    """
    scores = []
    for criterion in criteria:
        print(f"根据{ criterion }评估响应...")
        prompt = f"在 1-10 的范围内,对{ criterion }上的以下响应进行评分。用数字分数开始您的回应:\n\n { response } "
        response = generate_response(prompt)
        # show 50 characters of the response
        # Use regex to find the first number in the response
        score_match = re.search(r'\d+', response)
        if score_match:
            score = int(score_match.group())
            scores.append(min(score, 10))  # Ensure score is not greater than 10
        else:
            print(f"警告:无法提取 {criterion} 的数字分数。使用默认分数 5。")
            scores.append(5)  # Default score if no number is found
    return np.mean(scores)

# Perform A/B test
topic = "机器学习"
response_a = generate_response(prompt_a.format(topic=topic))
response_b = generate_response(prompt_b.format(topic=topic))

criteria = ["清晰度", "信息量", "参与度"]
score_a = evaluate_response(response_a, criteria)
score_b = evaluate_response(response_b, criteria)

print(f"提示A得分: {score_a:.2f}")
print(f"提示B得分: {score_b:.2f}")
print(f"获胜提示: {'A' if score_a > score_b else 'B'}")
根据清晰度评估反应...
根据信息量评估响应...
根据参与度评估响应...
根据清晰度评估反应...
根据信息量评估响应...
根据参与度评估响应...
提示 A 得分:8.33
提示 B 得分:9.00
获胜提示:B

迭代细化

现在,让我们演示改进提示的迭代细化过程。
def refine_prompt(initial_prompt, topic, iterations=3):
    """通过多次迭代细化提示。
    参数:
        initial_prompt(PromptTemplate):起始提示模板。
        topic (str):要解释的主题。
        iterations (int):细化迭代的次数。
    返回:
        PromptTemplate:最终完善的提示模板。
    """
    current_prompt = initial_prompt
    for i in range(iterations):
        try:
            response = generate_response(current_prompt.format(topic=topic))
        except KeyError as e:
            print(f"Error in iteration {i+1}: Missing key {e}. Adjusting prompt...")
            # Remove the problematic placeholder
            current_prompt.template = current_prompt.template.replace(f"{{{e.args[0]}}}", "relevant example")
            response = generate_response(current_prompt.format(topic=topic))
        
        # 生成反馈和改进建议
        feedback_prompt = f"分析{ topic }的以下解释并对生成它的提示提出改进建议:\n\n { response } "
        feedback = generate_response(feedback_prompt)
        
        # 使用反馈来改进提示
        refine_prompt = f"根据此反馈:' { feedback } ',改进以下提示模板。确保仅在模板中使用变量{{ topic }} : \n\n { current_prompt.template } "
        refined_template = generate_response(refine_prompt)
        
        current_prompt = PromptTemplate(
            input_variables=["topic"],
            template=refined_template
        )
        
        print(f"迭代 {i+1} 提示: {current_prompt.template}")
    
    return current_prompt

# 实施A/B测试
topic = "机器学习"
response_a = generate_response(prompt_a.format(topic=topic))
response_b = generate_response(prompt_b.format(topic=topic))

criteria = ["清晰度", "信息量", "参与度"]
score_a = evaluate_response(response_a, criteria)
score_b = evaluate_response(response_b, criteria)

print(f"提示A得分: {score_a:.2f}")
print(f"提示B得分:{score_b:.2f}")
print(f"获胜提示: {'A' if score_a > score_b else 'B'}")

# Start with the winning prompt from A/B testing
initial_prompt = prompt_b if score_b > score_a else prompt_a
refined_prompt = refine_prompt(initial_prompt, "机器学习")

print("\n最终完善提示:")
print(refined_prompt.template)
根据清晰度评估反应...
根据信息量评估响应...
根据参与度评估响应...
根据清晰度评估反应...
根据信息量评估响应...
警告:无法提取信息量的数字分数。使用默认分数 5。
根据参与度评估响应...
提示 A 得分:8.67
提示 B 得分:6.67
获胜提示:A
次迭1提示:用简单的术语解释{topic},涵盖不同类型的方法,例如监督学习、无监督学习和强化学习。包括实际应用来说明其影响,并描述学习过程,包括数据训练和模型评估。讨论其优势、局限性和挑战,并提供算法和数据预处理技术的技术见解,以便全面理解。
迭代2提示:针对特定受众水平(初学者、中级或高级)量身定制对 {topic} 的全面解释。在您的回答中明确定义受众。讨论不同的方法,例如监督学习、无监督学习和强化学习,并说明各个行业的实际应用以展示其影响。描述学习过程,包括数据训练和模型评估,并强调该领域的最新进展或趋势。解决优势、局限性和挑战,包括道德考虑和环境影响。提供算法和数据预处理技术的技术见解,并结合视觉辅助工具或图表来阐明复杂的概念。包括互动元素或练习,例如简单的编码任务,以吸引学习者。提供关键术语词汇表并建议其他资源,如书籍或在线课程,以进一步探索该主题。
第三次迭代提示:为初学者创建引人入胜且具有教育意义的{topic}解释。一开始就明确定义学习目标,例如解释基本概念、识别类型和理解{topic}中的简单算法。使用简单的语言和相关的类比来确保可访问性。整合图表或流程图等视觉辅助工具来描述关键思想,例如不同的学习方法或数据处理步骤,以满足视觉学习者的需求。突出显示现实世界的示例以说明{topic}的实际影响,例如技术或日常生活场景中的应用。加入不需要大量编程知识的交互式元素,例如使用在线工具或探索数据集,以帮助学习者尝试这些概念。使用易于理解的定义扩展词汇表,并包含指向进一步解释或视频的链接。推荐补充材料,例如视频、文章和播客,以适应不同的学习风格。解决有关{topic}的常见误解,并包括有关道德考虑的部分,提供具体示例和缓解策略。包括反馈机制来收集读者的意见,以不断改进指南。

最终完善提示:
为初学者创建引人入胜且具有教育意义的{topic}解释。一开始就明确定义学习目标,例如解释基本概念、识别类型和理解{topic}中的简单算法。使用简单的语言和相关的类比来确保可访问性。集成图表或流程图等视觉辅助工具来描述关键思想,例如不同的学习方法或数据处理步骤,以满足视觉学习者的需求。突出显示现实世界的示例以说明{topic}的实际影响,例如技术或日常生活场景中的应用。加入不需要大量编程知识的交互式元素,例如使用在线工具或探索数据集,以帮助学习者尝试这些概念。使用易于理解的定义扩展词汇表,并包含进一步解释或视频的链接。推荐补充材料,例如视频、文章和播客,以适应不同的学习风格。解决有关{topic}的常见误解,并包括有关道德考虑的部分,提供具体示例和缓解策略。包括反馈机制以收集读者的意见,以不断改进指南。

比较原始提示和精炼提示

让我们比较一下原始提示和精炼提示的性能。
original_response = generate_response(initial_prompt.format(topic="机器学习"))
refined_response = generate_response(refined_prompt.format(topic="机器学习"))

original_score = evaluate_response(original_response, criteria)
refined_score = evaluate_response(refined_response, criteria)

print(f"原始提示得分: {original_score:.2f}")
print(f"完善提示得分: {refined_score:.2f}")
print(f"改进: {(refined_score - original_score):.2f} points")
根据清晰度评估反应...
根据信息量评估响应...
根据参与度评估响应...
根据清晰度评估反应...
根据信息量评估响应...
根据参与度评估响应...
原始提示得分:8.67
完善提示得分:9.00
改进:0.33分
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值