概述
本教程使用 OpenAI 的 GPT 模型和 LangChain 库探索小样本学习和上下文学习的前沿技术。这些方法使 AI 模型能够使用最少的示例执行复杂的任务,从而彻底改变了我们处理机器学习问题的方式。主题
传统机器学习通常需要大量数据集进行训练,这非常耗时且耗费资源。小样本学习和上下文学习利用大型语言模型的强大功能,仅用少量示例即可执行任务,从而解决了这一限制。这种方法在标记数据稀缺或获取成本高昂的情况下尤其有用。内容概要
- OpenAI 的 GPT 模型:最先进的语言模型,作为我们学习技术的基础。
- LangChain 库:一个强大的工具,可简化处理大型语言模型的过程。
- PromptTemplate:一种格式化语言模型输入的结构化方法。
- LLMChain:管理提示和语言模型之间的交互。
实施方案
1. 基础小样本学习
+ 使用少量学习来实现情绪分类任务。 + 演示如何构建提示并提供示例供模型学习。 + 解释模型如何从这些示例推广到新的输入。2. 高级小样本技术
+ 探索情感分析和语言检测的多任务学习。 + 讨论如何设计提示以使单个模型能够执行多个相关任务。 + 深入了解这种方法的好处,例如提高效率和更好的泛化。3. 情境学习
+ 自定义任务(例如文本转换)的上下文学习演示。 + 仅根据提示中提供的示例来解释模型如何适应新任务。 + 讨论该方法的灵活性和局限性。4. 最佳实践与评估
+ 为小样本学习选择有效示例的指南。 + 用于优化模型性能的快速工程技术。 + 实施评估框架来评估模型准确性。 + 讨论多样化测试用例和适当指标的重要性。结论
少量学习和上下文学习代表了人工智能领域的重大进步。通过使模型能够使用最少的示例执行复杂任务,这些技术为数据有限的领域的人工智能应用开辟了新的可能性。本教程为理解和实施这些强大的方法提供了坚实的基础,为学习者提供了在自己的项目中有效利用大型语言模型的工具。随着该领域的不断发展,掌握这些技术对于希望保持自然语言处理和机器学习前沿的人工智能从业者来说至关重要。
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChainload_dotenv()
os.environ["OPENAI_API_KEY"] = os.getenv('OPENAI_API_KEY') # OpenAI API keyllm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
print("Setup complete.")
设置完成
基础小样本学习
我们将实现一个用于情绪分类的基本小样本学习场景。情绪分类:
- 定义:确定一系列词语背后的情感基调。
- 应用:客户服务、市场研究、社交媒体分析。
少量学习方法:
- 提供一小组标记示例(在本例中为 3 个)。
- 构建提示以清晰地呈现示例和新输入。
- 利用语言模型的预先训练的知识。
关键组件:
- PromptTemplate:构建模型的输入。
- LLMChain:管理提示和语言模型之间的交互。
def few_shot_sentiment_classification(input_text):few_shot_prompt = PromptTemplate(input_variables=["input_text"],template="""将情绪分类为积极,消极或中性。示例:文本:我喜欢这个产品!太棒了。情绪:积极文本:这部电影很糟糕。我讨厌它。情绪:消极文本:今天的天气还可以。情绪:中性, 分类以下:文本: {input_text}情绪:""")chain = few_shot_prompt | llmresult = chain.invoke(input_text).content# Clean up the resultresult = result.strip()# Extract only the sentiment labelif ':' in result:result = result.split(':')[1].strip()return result # 将仅返回“积极”、“消极”或“中性”test_text = "我真不敢相信这家新餐厅有多棒!"result = few_shot_sentiment_classification(test_text)print(f"输入: {test_text}")print(f"预测情绪: {result}")
输入:我简直不敢相信这家新餐厅有多棒!
预测情绪:积极
高级小样本技术
我们现在将探索情感分析和语言检测的多任务学习。多任务学习:
- 定义:训练模型同时执行多个相关任务。
- 好处:提高效率,泛化能力更强,减少过度拟合。
执行:
- 设计一个包含多个任务示例的提示模板。
- 使用特定于任务的指令来指导模型的行为。
- 演示同一模型如何根据输入在任务之间切换。
def multi_task_few_shot(input_text, task):few_shot_prompt = PromptTemplate(input_variables=["input_text", "task"],template="""对给定的文本执行指定的任务。示例:文本:我喜欢这个产品!它太棒了。任务: 情绪结果: 积极文本:Bonjour, comment allez-vous?任务: 语言结果: 法语现在,执行以下任务:文本: {input_text}任务: {task}结果:""")chain = few_shot_prompt | llmreturn chain.invoke({"input_text": input_text, "task": task}).contentprint(multi_task_few_shot("我真不敢相信这有多棒!", "情绪"))
print(multi_task_few_shot("Guten Tag, wie geht es Ihnen?", "语言"))
积极的
结果:德语
情境学习
上下文学习允许模型根据提示中提供的示例适应新任务。关键方面:
- 无需微调:模型从提示中的示例中学习。
- 灵活性:可应用于多种任务。
- 提示工程:精心设计提示对于性能至关重要。
示例实现:我们将演示自定义任务(将文本转换为猪拉丁语)的上下文学习。
def in_context_learning(task_description, examples, input_text):example_text = "".join([f"输入: {e['input']}\n输出: {e['output']}\n\n" for e in examples])in_context_prompt = PromptTemplate(input_variables=["task_description", "examples", "input_text"],template="""任务: {task_description}示例:{examples}现在,对以下输入执行任务:输入: {input_text}输出:""")chain = in_context_prompt | llmreturn chain.invoke({"task_description": task_description, "examples": example_text, "input_text": input_text}).contenttask_desc = "将给定的文本转换为猪拉丁语。"
examples = [{"input": "hello", "output": "ellohay"},{"input": "apple", "output": "appleay"}
]
test_input = "python"result = in_context_learning(task_desc, examples, test_input)
print(f"输入: {test_input}")
print(f"输出: {result}")
入:python
输出:输出:ythonpay
最佳实践与评估
为了最大限度地提高小样本学习和情境学习的有效性:- 选择示例:
- 多样性:涵盖任务的不同方面。
- 清晰度:使用明确的例子。
- 相关性:选择与预期输入相似的例子。
- 平衡:确保类别/种类的代表性均等。
- 边缘情况:包括不寻常或困难的情况的例子。
- 快捷工程:
- 明确的指示:明确指定任务。
- 一致的格式:保持示例和输入的统一结构。
- 简洁性:避免不必要的信息导致模型混淆。
- 评估:
- 创建多样化的测试集。
- 将模型预测与真实标签进行比较。
- 根据任务使用适当的指标(例如准确度、F1 分数)。
def evaluate_model(model_func, test_cases):'''Evaluate the model on a set of test cases.Args:model_func: The function that makes predictions.test_cases: A list of dictionaries, where each dictionary contains an "input" text and a "label" for the input.Returns:The accuracy of the model on the test cases. '''correct = 0total = len(test_cases)for case in test_cases:input_text = case['input']true_label = case['label']prediction = model_func(input_text).strip()is_correct = prediction.lower() == true_label.lower()correct += int(is_correct)print(f"Input: {input_text}")print(f"Predicted: {prediction}")print(f"Actual: {true_label}")print(f"Correct: {is_correct}\n")accuracy = correct / totalreturn accuracytest_cases = [{"input": "This product exceeded my expectations!", "label": "Positive"},{"input": "I'm utterly disappointed with the service.", "label": "Negative"},{"input": "The temperature today is 72 degrees.", "label": "Neutral"}]accuracy = evaluate_model(few_shot_sentiment_classification, test_cases)print(f"Model Accuracy: {accuracy:.2f}")
输入:该产品超出了我的预期!
预测:正面
实际:正数
正确:正确输入:我对这项服务非常失望。
预测:负面
实际:负面
正确:正确输入:今天的温度是 72 度。
预测:中性
实际情况:中性
正确:正确模型准确率:1.00