概述
本教程重点介绍评估 AI 语言模型中提示效果的方法和技术。我们将探索衡量提示性能的各种指标,并讨论手动和自动评估技术。主题
随着提示工程在 AI 应用中变得越来越重要,拥有强大的方法来评估提示的有效性至关重要。这使开发人员和研究人员能够优化他们的提示,从而提高 AI 模型的性能并提高输出的可靠性。内容概述
- 衡量及时表现的指标
- 人工评估技术
- 自动评估技术
- 使用 OpenAI 和 LangChain 的实际示例
实施方案
我们将首先设置环境并介绍评估提示的关键指标。然后,我们将探索手动评估技术,包括人工评估和比较分析。接下来,我们将深入研究自动评估方法,利用困惑度评分和自动语义相似性比较等技术。在整个教程中,我们将使用 OpenAI 的 GPT 模型和 LangChain 库提供实际示例,以实际演示这些概念。结论
在本教程结束时,您将全面了解如何使用手动和自动化技术评估提示的有效性。您将掌握实用的工具和方法来优化提示,从而实现更高效、更准确的 AI 模型交互。设置
首先,让我们导入必要的库并设置我们的环境。import os
from langchain_openai import ChatOpenAI
from sklearn.metrics.pairwise import cosine_similarity
from sentence_transformers import SentenceTransformer
import numpy as np
# Load environment variables
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-mini")
# Initialize sentence transformer for semantic similarity
sentence_model = SentenceTransformer('all-MiniLM-L6-v2')
def semantic_similarity(text1, text2):
"""Calculate semantic similarity between two texts using cosine similarity."""
embeddings = sentence_model.encode([text1, text2])
return cosine_similarity([embeddings[0]], [embeddings[1]])[0][0]
衡量及时表现的指标
让我们定义一些评估提示有效性的关键指标:def relevance_score(response, expected_content):
"""根据与预期内容的语义相似度计算相关性分数。"""
return semantic_similarity(response, expected_content)
def consistency_score(responses):
"""根据多个响应之间的相似性计算一致性分数。"""
if len(responses) < 2:
return 1.0 # 如果只有一个响应,则完全一致
similarities = []
for i in range(len(responses)):
for j in range(i+1, len(responses)):
similarities.append(semantic_similarity(responses[i], responses[j]))
return np.mean(similarities)
def specificity_score(response):
"""根据响应长度和唯一文字数计算特异性分数。"""
words = response.split()
unique_words = set(words)
return len(unique_words) / len(words) if words else 0
人工评估技术
手动评估涉及对提示-响应对的人工评估。让我们创建一个函数来模拟这个过程def manual_evaluation(prompt, response, criteria):
"""模拟对提示-响应对的手动评估。"""
print(f"提示: {prompt}")
print(f"回答: {response}")
print("\n评估标准:")
for criterion in criteria:
score = float(input(f"{criteria}的分数(0-10): "))
print(f"{criterion}: {score}/10")
print("\n附件评论:")
comments = input("输入任何其他评论: ")
print(f"评论: {comments}")
# Example usage
prompt = "用简单的术语解释机器学习的概念。"
response = llm.invoke(prompt).content
criteria = ["清晰度", "准确性", "简单性"]
manual_evaluation(prompt, response, criteria)
提示:用简单的术语解释机器学习的概念。
回答:机器学习是一种计算机技术,它允许计算机从数据中学习并随着时间的推移提高其性能,而无需为每个特定任务进行明确的编程。
简单来说,想象一下教孩子识别不同的动物。你不必向他们详细描述每种动物,而是向他们展示许多猫、狗和鸟的图片。随着时间的推移,孩子会学会根据他们在图片中看到的模式(如形状、颜色和大小)来识别这些动物。
同样,机器学习需要向计算机输入大量数据(如图片、数字或文本),让计算机找出模式并自行做出决策。例如,可以通过分析垃圾邮件和非垃圾邮件的示例来训练机器学习模型识别垃圾邮件。经过训练后,它可以自动识别新邮件是否为垃圾邮件。
因此,从本质上讲,机器学习就是教计算机从经验中学习,适应新信息,并根据所学知识做出预测或决策。
评估标准:
清晰度:5.0/10
准确度:5.0/10
简洁性:5.0/10
附加评论:
评论数:5
自动评估技术
现在,让我们实现一些自动评估技术:def automated_evaluation(prompt, response, expected_content):
"""对提示-响应对进行自动评估。"""
relevance = relevance_score(response, expected_content)
specificity = specificity_score(response)
print(f"提示: {prompt}")
print(f"回答: {response}")
print(f"\n相关性得分: {relevance:.2f}")
print(f"特异性得分: {specificity:.2f}")
return {"relevance": relevance, "specificity": specificity}
# Example usage
prompt = "机器学习的三种主要类型是什么?"
expected_content = "机器学习的三种主要类型是监督学习、无监督学习和强化学习。"
response = llm.invoke(prompt).content
automated_evaluation(prompt, response, expected_content)
提示:机器学习有哪三种主要类型?
回答:机器学习的三种主要类型是:
- 监督学习:在监督学习中,模型在标记数据集上进行训练,这意味着输入数据与正确的输出配对。目标是让模型学习将输入映射到正确的输出,以便它可以对新的、未见过的数据进行预测。常见的应用包括分类(例如垃圾邮件检测)和回归(例如预测房价)。
- 无监督学习:在无监督学习中,模型在没有标记输出的数据上进行训练。目标是识别数据中的模式、结构或关系。常用技术包括聚类(例如,根据购买行为对客户进行分组)和降维(例如,在保留重要信息的同时减少特征数量)。
- 强化学习:在强化学习中,代理通过与环境交互来学习做出决策。代理会根据其行为以奖励或惩罚的形式接收反馈,并旨在随着时间的推移最大化累积奖励。这种类型的学习通常用于游戏(例如 AlphaGo)和机器人等应用。
这三种类型代表了从数据中学习的不同方法,并用于多个领域的各种应用。
相关性得分:0.74
特异性评分:0.64
{‘相关性’:0.73795843,‘特异性’:0.6403940886699507}
比较分析
让我们比较一下不同提示对于同一任务的有效性:def compare_prompts(prompts, expected_content):
"""比较同一任务的多个提示的有效性。"""
results = []
for prompt in prompts:
response = llm.invoke(prompt).content
evaluation = automated_evaluation(prompt, response, expected_content)
results.append({"提示": prompt, **evaluation})
# Sort results by relevance score
sorted_results = sorted(results, key=lambda x: x['relevance'], reverse=True)
print("提示比较结果:")
for i, result in enumerate(sorted_results, 1):
print(f"\n{i}. 提示: {result['prompt']}")
print(f" 相关性: {result['relevance']:.2f}")
print(f" 特异性: {result['specificity']:.2f}")
return sorted_results
# Example usage
prompts = [
"列出机器学习的类型。",
"机器学习算法的主要类别是什么?",
"解释机器学习的不同方法。"
]
expected_content = "机器学习的主要类型有监督学习、无监督学习和强化学习。"
compare_prompts(prompts, expected_content)
提示:列出机器学习的类型。
回答:机器学习大致可以分为几种类型,每种类型都有不同的目的和应用。机器学习的主要类型有:
1.监督学习:
- 涉及在标记数据集上训练模型,其中输入数据与正确的输出配对。该模型学习将输入映射到输出,并根据其对新数据、未见过的数据的结果预测准确程度来评估其性能。
- 常见算法:线性回归、逻辑回归、决策树、支持向量机、神经网络。
- 无监督学习:
- 涉及在没有标记响应的数据上训练模型。该模型试图学习数据中的底层结构或分布,通常识别模式、集群或关系。
- 常见算法:K均值聚类、层次聚类、主成分分析(PCA)、t分布随机邻域嵌入(t-SNE)。
3.半监督学习:
- 将标记数据和未标记数据结合起来进行训练。当获取完全标记的数据集成本高昂或耗时时,这种方法非常有用。该模型利用这两种类型的数据来提高学习准确性。
- 常见的应用包括图像分类、文本分类和语音识别。
4.强化学习:
- 涉及通过与环境交互来训练代理做出决策。代理通过以奖励或惩罚的形式接收反馈来学习实现目标。学习过程基于反复试验。
- 常见应用:游戏(例如 AlphaGo)、机器人、推荐系统。
- 自我监督学习:
- 无监督学习的一个子集,其中模型根据输入数据生成自己的标签,从而允许其学习数据的表示而不需要标记的示例。它通常用于自然语言处理和计算机视觉。
- 常用技术:对比学习,预测输入数据的掩蔽部分(例如,掩蔽语言建模)。
- 多示例学习:
- 一种学习类型,其中模型是在实例包而不是单个标记实例上进行训练的。每个包都有标记,但包中的单个实例可能没有标记。
- 常见应用:药物活性预测、图像分类任务。
7.迁移学习:
- 涉及在一个任务上采用预先训练的模型,并在不同的但相关的任务上对其进行微调。当新任务的标记数据稀缺时,这种方法特别有用。
- 常用于深度学习应用,尤其是计算机视觉和自然语言处理。
这些类型的机器学习可以应用于各个领域,包括医疗保健、金融、营销等,具体取决于手头任务的具体要求。
相关性得分:0.74
特异性评分:0.57
提示:机器学习算法的主要类别有哪些?
回答:根据机器学习算法的学习方式和设计用于解决的问题类型,机器学习算法大致可以分为几个主要类别。以下是主要类别:
1.监督学习:
- 在此类别中,算法在标记数据上进行训练,这意味着每个训练示例都与一个输出标签配对。目标是学习从输入到输出的映射。
- 常见算法包括:
- 线性回归
- 逻辑回归
- 决策树
- 支持向量机(SVM)
- 神经网络
- 随机森林
- 梯度提升机(例如 XGBoost)
- 无监督学习:
- 这种类型的学习处理未标记的数据,其中算法尝试在没有明确输出的情况下学习数据的底层结构或分布。
- 常见算法包括:
- K均值聚类
- 层次聚类
- 主成分分析(PCA)
- t 分布随机邻域嵌入 (t-SNE)
- 自动编码器
3.半监督学习:
- 此类别在训练期间结合了标记数据和未标记数据。当获取完全标记的数据集成本高昂或耗时时,它特别有用。
- 常见的方法包括结合未标记数据来改善学习的监督算法的变化。
4.强化学习:
- 在强化学习中,代理通过在环境中采取行动来学习做出决策,以最大化累积奖励。学习过程涉及探索和利用。
- 常见算法包括:
- Q 学习
- 深度 Q 网络(DQN)
- 策略梯度
- 近端策略优化(PPO)
- Actor-Critic 方法
- 自我监督学习:
- 这是一种无监督学习,系统根据输入数据生成自己的监督信号。它在自然语言处理和计算机视觉领域特别流行。
- 技术通常涉及从其他部分预测输入数据的部分(例如,Transformer 中的掩蔽语言建模)。
- 迁移学习:
- 这种方法涉及采用预先训练的模型(通常在大型数据集上训练)并在较小的特定任务数据集上对其进行微调。这在深度学习应用中特别有用。
7.集成学习:
- 集成方法将多个模型组合在一起,产生比任何单个模型更好的性能。这可能涉及 bagging、boosting 和 stacking 等技术。
- 常见算法包括随机森林(bagging)和AdaBoost(boosting)。
这些类别涵盖了各种算法,每种算法适用于不同类型的任务和数据集。算法的选择通常取决于手头的问题、数据的性质和期望的结果。
相关性得分:0.68
特异性评分:0.60
提示:解释机器学习的不同方法。
回答:机器学习 (ML) 是人工智能的一个子集,专注于构建能够从数据中学习并根据数据做出决策的系统。机器学习有几种主要方法,大致可分为以下几类:
1. 监督学习
在监督学习中,模型是在带标签的数据集上进行训练的,这意味着每个训练示例都与相应的输出标签相关联。目标是学习从输入到输出的映射,以便模型可以预测新的、未见过的数据的标签。-示例:
- 分类(例如垃圾邮件检测、图像识别)
- 回归(例如预测房价、气温预测)
- 常见算法:
- 线性回归
- 逻辑回归
- 决策树
- 支持向量机(SVM)
- 神经网络
2.无监督学习
无监督学习涉及使用没有标记输出的数据来训练模型。目标是在没有明确指导的情况下找到数据中的模式、结构或关系。-示例:
- 聚类(例如,客户细分、对相似项目进行分组)
- 降维(例如主成分分析、t-SNE)
- 异常检测(例如欺诈检测)
- 常见算法:
- K均值聚类
- 层次聚类
- DBSCAN(基于密度的带噪声应用空间聚类)
- 自动编码器
3.半监督学习
半监督学习是一种混合方法,结合标记数据和未标记数据进行训练。当获取完全标记的数据集成本高昂或耗时时,这种方法特别有用。该模型利用标记数据来指导学习过程,同时也受益于未标记数据中存在的结构。-示例:
- 仅标记少量文档的文本分类
- 具有有限标记图像的图像识别任务
- 常见算法:
- 自我训练
- 联合培训
- 基于图的方法
4.强化学习
强化学习 (RL) 是一种机器学习,其中代理通过与环境交互来学习做出决策。代理会根据其操作以奖励或惩罚的形式获得反馈,从而学习最佳策略,以随着时间的推移最大化累积奖励。-示例:
- 玩游戏(例如 AlphaGo)
- 机器人技术(例如机器人控制系统)
- 自动驾驶汽车
- 常见算法:
- Q 学习
- 深度 Q 网络(DQN)
- 近端策略优化(PPO)
- Actor-Critic 方法
5. 自监督学习
自监督学习是一种模型根据输入数据生成自己的标签的技术。这种方法通常用于自然语言处理和计算机视觉,其中模型学习预测输入的缺失部分或对输入数据执行转换。-示例:
- 预测句子中的下一个单词(像 GPT 这样的语言模型)
- 图像修复,即填充图像的部分内容
- 常见算法:
- 对比学习
- 掩蔽语言建模
6.迁移学习
迁移学习涉及采用预先训练的模型(通常在大型数据集上训练)并在较小的特定数据集上对其进行微调。当目标域的数据有限时,这种方法特别有用,因为它可以利用从相关任务中获得的知识。-示例:
- 使用在 ImageNet 上训练的模型执行特定的图像分类任务
- 对特定领域文本的语言模型进行微调
- 通用框架:
- TensorFlow 和 PyTorch 通常为各种任务提供预训练模型。
### 结论
这些方法各有优缺点,选择使用哪种方法取决于数据的性质、要解决的具体问题以及可用资源。机器学习的许多实际应用可能涉及这些方法的组合,以实现最佳结果。
相关性得分:0.69
特异性评分:0.52
提示比较结果:
- 提示:列出机器学习的类型。
相关性:0.74
特异性:0.57 - 提示:解释机器学习的不同方法。
相关性:0.69
特异性:0.52
3.提示:机器学习算法的主要类别有哪些?
相关性:0.68
特异性:0.60
[{‘提示’: ‘列出机器学习的类型。’,
‘相关性’:0.73586243,
‘特异性’:0.5693430656934306},
{‘提示’: ‘解释机器学习的不同方法。’,
‘相关性’:0.68791693,
‘特异性’:0.5223880597014925,
{‘提示’: ‘机器学习算法的主要类别有哪些?’,
‘相关性’:0.67862606,
‘特异性’:0.6039603960396039]
综合起来
现在,让我们创建一个结合手动和自动化技术的综合提示评估功能:def evaluate_prompt(prompt, expected_content, manual_criteria=['Clarity', 'Accuracy', 'Relevance']):
"""使用手动和自动化技术对提示进行全面评估。"""
response = llm.invoke(prompt).content
print("自动评估:")
auto_results = automated_evaluation(prompt, response, expected_content)
print("\n手动评估:")
manual_evaluation(prompt, response, manual_criteria)
return {"提示": prompt, "回答": response, **auto_results}
# Example usage
prompt = "解释机器学习中的过度拟合概念。"
expected_content = "当模型对训练数据的学习过好(包括其噪声和波动)时,就会发生过度拟合,从而导致对新的、未见过的数据的泛化能力较差。"
evaluate_prompt(prompt, expected_content)
自动评估:
提示:解释机器学习中过度拟合的概念。
回答:过度拟合是机器学习中常见的问题,即模型不仅学习训练数据中的底层模式,还学习噪声和随机波动。这导致模型在训练数据集上表现异常出色,但在看不见的数据或测试数据集上表现不佳。本质上,模型变得过于复杂,捕获了无法推广到新数据点的细节。
过度拟合的关键方面:
1. **模型的复杂性**:当模型相对于可用的训练数据量而言过于复杂时,通常会发生过度拟合。例如,高阶多项式回归可能完美地拟合一小组数据点,但不能很好地推广到新数据。 2. **训练与验证性能**:过度拟合的一个明显迹象是,训练数据上的性能指标(如准确率、损失等)明显优于验证或测试数据上的性能指标。这种差异表明模型没有学习真正的潜在关系,而是记住了训练示例。 3. **噪音**:过度拟合的模型可能会从训练数据中的噪音中学习,将随机变化视为重要信号,这可能导致较差的预测性能。视觉表现:
在可视化模型性能时,通常可以看到过度拟合的现象,模型与训练数据的拟合度非常接近(训练数据的准确度很高),但在验证数据上却存在很大差异,导致在绘制训练和验证性能与模型复杂度的关系图时出现 U 形曲线。缓解策略:
有几种技术可以帮助缓解过度拟合:- 正则化:L1(Lasso)和 L2(Ridge)正则化等技术会对模型中较大的系数进行惩罚,从而阻止过于复杂的模型。
- 交叉验证:使用 k 折交叉验证有助于确保模型的性能在数据的不同子集之间保持一致。
- 修剪:在决策树中,可以通过修剪来删除不太重要的分支,从而简化模型。
- 早期停止:在神经网络等迭代模型中,当验证集上的性能开始下降时,可以停止训练,以防止模型过于接近训练数据。
- 数据增强:通过数据增强技术增加训练数据集的大小可以帮助模型更好地泛化。
- 简化模型:选择一个更简单的模型来捕捉数据的基本特征可以降低过度拟合的风险。
### 结论:
总而言之,过度拟合是机器学习中的一个关键问题,它会影响模型推广到新的、未见过的数据的能力。从业者必须认识到过度拟合的迹象并实施缓解策略,确保他们创建的模型稳健可靠。
相关性得分:0.82
特异性评分:0.54
人工评估:
提示:解释机器学习中过度拟合的概念。
回答:过度拟合是机器学习中常见的问题,即模型不仅学习训练数据中的底层模式,还学习噪声和随机波动。这导致模型在训练数据集上表现异常出色,但在看不见的数据或测试数据集上表现不佳。本质上,模型变得过于复杂,捕获了无法推广到新数据点的细节。
过度拟合的关键方面:
1. **模型的复杂性**:当模型相对于可用的训练数据量而言过于复杂时,通常会发生过度拟合。例如,高阶多项式回归可能完美地拟合一小组数据点,但不能很好地推广到新数据。 2. **训练与验证性能**:过度拟合的一个明显迹象是,训练数据上的性能指标(如准确率、损失等)明显优于验证或测试数据上的性能指标。这种差异表明模型没有学习真正的潜在关系,而是记住了训练示例。 3. **噪音**:过度拟合的模型可能会从训练数据中的噪音中学习,将随机变化视为重要信号,这可能导致较差的预测性能。视觉表现:
在可视化模型性能时,通常可以看到过度拟合的现象,模型与训练数据的拟合度非常接近(训练数据的准确度很高),但在验证数据上却存在很大差异,导致在绘制训练和验证性能与模型复杂度的关系图时出现 U 形曲线。缓解策略:
有几种技术可以帮助缓解过度拟合:- 正则化:L1(Lasso)和 L2(Ridge)正则化等技术会对模型中较大的系数进行惩罚,从而阻止过于复杂的模型。
- 交叉验证:使用 k 折交叉验证有助于确保模型的性能在数据的不同子集之间保持一致。
- 修剪:在决策树中,可以通过修剪来删除不太重要的分支,从而简化模型。
- 早期停止:在神经网络等迭代模型中,当验证集上的性能开始下降时,可以停止训练,以防止模型过于接近训练数据。
- 数据增强:通过数据增强技术增加训练数据集的大小可以帮助模型更好地泛化。
- 简化模型:选择一个更简单的模型来捕捉数据的基本特征可以降低过度拟合的风险。
### 结论:
总而言之,过度拟合是机器学习中的一个关键问题,它会影响模型推广到新的、未见过的数据的能力。从业者必须认识到过度拟合的迹象并实施缓解策略,确保他们创建的模型稳健可靠。
评估标准:
清晰度:6.0/10
准确度:7.0/10
相关性:6.0/10
附加评论:
评论:无
‘提示’: ‘解释机器学习中的过度拟合概念。’,
‘回答’:“过度拟合是机器学习中常见的问题,模型不仅学习训练数据中的底层模式,还学习噪声和随机波动。这导致模型在训练数据集上表现异常出色,但在看不见的数据或测试数据集上表现不佳。本质上,模型变得过于复杂,捕获了无法推广到新数据点的细节。
过度拟合的关键方面:
-
模型的复杂性:当模型相对于可用的训练数据量而言过于复杂时,通常会发生过度拟合。例如,高阶多项式回归可能完美地拟合一小组数据点,但不能很好地推广到新数据。
-
训练与验证性能:过度拟合的明显迹象是训练数据的性能指标(如准确度、损失等)明显优于验证或测试数据。这种差异表明模型没有学习真正的底层关系,而是记住了训练示例。
-
噪声:过度拟合的模型可能会从训练数据中的噪声中学习,将随机变化视为重要信号,这可能导致预测性能不佳。
可视化表示:
在可视化模型的性能时,通常可以在图中看到过度拟合,其中模型非常紧密地拟合训练数据(训练数据的高精度),但在验证数据上存在显着差异,导致在绘制训练和验证性能与模型复杂度的关系时出现 U 形曲线。
缓解策略:
有几种技术可以帮助缓解过度拟合:
-
正则化:L1(Lasso)和 L2(Ridge)正则化等技术会对模型中的较大系数进行惩罚,从而阻止过于复杂的模型。
-
交叉验证:使用 k 倍交叉验证有助于确保模型的性能在不同数据子集之间保持一致。
-
修剪:在决策树中,修剪可用于删除不太重要的分支,从而简化模型。
-
提前停止:在神经网络等迭代模型中,当验证集上的性能开始下降时,可以停止训练,以防止模型与训练数据过于接近。
-
数据增强:通过数据增强技术增加训练数据集的大小可以帮助模型更好地泛化。
-
简化模型:选择一个更简单的模型来捕捉数据的基本特征可以降低过度拟合的风险。
结论:
总之,过度拟合是机器学习中的一个关键问题,它会影响模型泛化到新的、未见过的数据的能力。从业者必须识别过度拟合的迹象并实施缓解策略,确保他们创建的模型稳健可靠。
‘相关性’:0.82301676,
‘特异性’:0.5372460496613995