使用 Qwen 进行Self-instruct数据生成

本文涉及的产品
视觉智能开放平台,分割抠图1万点
NLP自然语言处理_高级版,每接口累计50万次
视觉智能开放平台,视频资源包5000点
简介: 使用Qwen进行自指令数据生成,通过Self-instruct技术自动化为大型语言模型生成指令。用户可安装CAMEL包并设置Qwen API密钥,配置ChatAgent和SelfInstructPipeline,基于种子指令迭代生成大量新指令。支持多种过滤器(如长度、关键词、标点符号等)确保生成指令的质量和多样性。欢迎加入Discord获取支持与交流。

使用 Qwen 进行自指令数据生成

本cookbook在线运行链接:
https://colab.research.google.com/drive/1tNRrC3u6TjdHz_vG3VicYz6Q7DV_E1cq?usp=sharing

⭐ 为代码库点赞

如果你觉得 CAMEL 很有用或有趣,请考虑在我们的 CAMEL 仓库为我们点赞!你的点赞能帮助更多人发现这个项目,并激励我们持续改进。

Self-instruct是一种为大型语言模型(LLMs)自动生成指令的技术。手动创建这些数据集可能既耗时又昂贵。Self-instruct提供了一种自动化这个过程的方法,可以快速高效地生成大量指令。

安装和设置

首先,安装 CAMEL 包及其所有依赖

!pip install "git+https://github.com/camel-ai/camel.git@master#egg=camel-ai[all]"

如果您尚未拥有 Qwen API 密钥,可以按照以下步骤获取:

访问 阿里云模型工作室控制台,并按照屏幕上的说明激活模型服务。
在控制台右上角,点击您的账户名称,然后选择 API-KEY。
在 API 密钥管理页面,点击 创建 API 密钥 按钮以生成新的密钥。

import os
from getpass import getpass

qwen_api_key = getpass('输入你的 Qwen API 密钥: ')
os.environ["QWEN_API_KEY"] = qwen_api_key
输入你的 Qwen API 密钥: ··········
from camel.configs import QwenConfig
from camel.models import ModelFactory
from camel.types import ModelPlatformType, ModelType
from camel.agents import ChatAgent
from camel.messages import BaseMessage

qwen_model = ModelFactory.create(
    model_platform=ModelPlatformType.QWEN,
    model_type=ModelType.QWEN_TURBO,
    model_config_dict=QwenConfig(temperature=0.2).as_dict(),
)

基础Agent设置

from camel.agents import ChatAgent
from camel.datagen.self_instruct import SelfInstructPipeline

agent = ChatAgent(
    model=qwen_model,
)

基础Pipeline设置

该Pipeline通过从一小组种子(人工编写)指令开始工作,然后使用 LLM 基于这些种子生成新的指令。

  • 种子指令通常存储在 JSON Lines (JSONL) 文件中。文件中的每一行都代表 JSON 格式的单个指令。

  • 与种子文件一样,输出也以 JSONL 格式存储,便于解析和用于进一步的任务,如训练或微调语言模型。

请将 seed_path 替换为你的种子文件路径,将 data_output_path 替换为你想要的输出位置。

import os
import requests

# 为本地数据创建目录
os.makedirs('local_data', exist_ok=True)

# 更新为原始文件内容的 URL
url = "https://raw.githubusercontent.com/camel-ai/camel/master/examples/synthetic_datagen/self_instruct/seed_tasks.jsonl"

# 获取原始文件
response = requests.get(url)

with open('local_data/seed_tasks.jsonl', 'wb') as file:
    file.write(response.content)
seed_path = 'local_data/seed_tasks.jsonl'
data_output_path = 'data_output.json'

Self-instruct以迭代方式工作。在每一轮中:

  1. seed_path 中选择一定数量的人工编写指令(num_human_sample)。
  2. 从之前的轮次中选择一定数量的机器生成指令(num_machine_sample)。
  3. 使用这些选定的指令来指导语言模型生成新的指令。
  4. 这些新指令被添加到机器生成指令池中,然后重复这个过程,直到生成所需数量的指令。

human_to_machine_ratio 帮助控制整个过程中人工指导和模型创造力之间的平衡。通过调整这个比率,你可以影响生成指令的质量和多样性。

你可以自由调整 num_human_samplenum_machine_sample,这两个值稍后都将传入 human_to_machine_ratio

num_human_sample = 6
num_machine_sample = 2

请将 target_num_instructions 替换为你想要生成的机器指令数量

target_num_instructions = 10

将所有内容传递给我们的流水线。

pipeline = SelfInstructPipeline(
    agent=agent,
    seed=seed_path,
    num_machine_instructions=target_num_instructions,
    data_output_path=data_output_path,
    human_to_machine_ratio=(num_human_sample, num_machine_sample),
)

尝试生成!你将看到生成的数据文件被创建在你指定的位置!

pipeline.generate()

过滤函数

新生成的指令在被添加到结果中之前会经过过滤和评估。只有符合预定标准的指令才会被包含。CAMEL 提供了一些可以在Self-instruct中使用的过滤函数。此外,我们还支持自定义过滤器以进行定制评估!过滤函数在指令有效时返回 True,否则返回 False

长度过滤器

LengthFilter 过滤掉所有长度小于 min_len 或大于 max_len 的指令。

from camel.datagen.self_instruct import LengthFilter

length_filter = LengthFilter(min_len=5, max_len=50)

instructions = [
    "按升序排列数字。",
    "计算总和。",
    "创建一个详细说明每月支出和储蓄的电子表格报告。"
]

filtered_instructions = [instr for instr in instructions if length_filter.apply(instr)]
print(filtered_instructions)
['按升序排列数字。', '创建一个详细说明每月支出和储蓄的电子表格报告。']

关键词过滤器

KeywordFilter 过滤包含特定不需要关键词的指令。

from camel.datagen.self_instruct import KeywordFilter

keyword_filter = KeywordFilter(keywords=["禁止", "禁用", "禁令"])

instructions = [
    "禁止使用塑料袋。",
    "鼓励回收计划。",
    "禁止在公共场所吸烟。"
]

filtered_instructions = [instr for instr in instructions if keyword_filter.apply(instr)]
print(filtered_instructions)
['鼓励回收计划。']

标点符号过滤器

PunctuationFilter 过滤以非字母数字字符开头的指令。

from camel.datagen.self_instruct import PunctuationFilter

punctuation_filter = PunctuationFilter()

instructions = [
    "按类别对数据进行排序。",
    "#分析随时间变化的趋势。",
    "*创建结果摘要。"
]

filtered_instructions = [instr for instr in instructions if punctuation_filter.apply(instr)]
print(filtered_instructions)
['按类别对数据进行排序。']

非英语过滤器

NonEnglishFilter 过滤不以英文字母开头的指令。

from camel.datagen.self_instruct import NonEnglishFilter

non_english_filter = NonEnglishFilter()

instructions = [
    "Analyze the performance metrics.",
    "计算结果的统计数据.",
    "Test the new algorithm."
]

filtered_instructions = [instr for instr in instructions if non_english_filter.apply(instr)]
print(filtered_instructions)

['Analyze the performance metrics.', 'Test the new algorithm.']

ROUGE 相似度过滤器

RougeSimilarityFilter 基于 ROUGE 分数过滤与现有指令过于相似的指令。

from camel.datagen.self_instruct import RougeSimilarityFilter

existing_instructions = [
    "总结这篇文章。",
    "写一个文本的简要概述。"
]

similarity_filter = RougeSimilarityFilter(existing_instructions, threshold=0.5)

instructions = [
    "总结内容。",
    "为文本创建一个摘要。",
    "提供文本分析。"
]

filtered_instructions = [instr for instr in instructions if similarity_filter.apply(instr)]
print(filtered_instructions)
['为文本创建一个摘要。', '提供文本分析。']

自定义过滤函数

此外,你还可以实现自己的过滤函数。

from camel.datagen.self_instruct import FilterFunction

class CustomFilter(FilterFunction):

    def apply(self, instruction: str) -> bool:
        # 在这里应用你的逻辑
        logic = ...
        return logic

指令过滤器

InstructionFilter 管理所有过滤函数。我们可以使用自定义的 InstructionFilter 来初始化Pipeline。

首先添加你想要的过滤函数并配置它们。

filter_config = {
   
  "length": {
   "min_len": 5, "max_len": 100},
  "keyword": {
   "keywords": ["图片", "视频"]},
  "non_english": {
   },
  "rouge_similarity": {
   
      "existing_instructions": ["一些现有的指令"],
      "threshold": 0.6
  }
}

然后,初始化一个 InstructionFilter

from camel.datagen.self_instruct import InstructionFilter
filters = InstructionFilter(filter_config)

我们可以通过运行以下代码轻松应用所有过滤函数:

instructions = [
    "按升序排列数字。",
    "计算总和。",
    "创建一个详细说明每月支出和储蓄的电子表格报告。",
    "*创建结果摘要。",
    "计算结果的统计数据。"
]

filtered_instructions = [instr for instr in instructions if filters.filter(instr)]
print(filtered_instructions)
['按升序排列数字。', '创建一个详细说明每月支出和储蓄的电子表格报告。']

使用自定义 InstructionFilter 设置流水线

CAMEL 在流水线中有一些默认的过滤函数,但你也可以选择自己的!

pipeline = SelfInstructPipeline(
    agent=agent,
    seed=seed_path,
    num_machine_instructions=target_num_instructions,
    data_output_path='data_output_path',
    human_to_machine_ratio=(num_human_sample, num_machine_sample),
    instruction_filter=filters,    # 传入你的 InstructionFilter
)

或者如果你想使用默认的函数过滤器,但使用不同的配置,你也可以只传入过滤器配置

最后,开始生成!

pipeline.generate()

这就是全部内容:对 🐫 CAMEL-AI 有疑问?加入我们的 Discord!无论你是想分享反馈、探索多智能体系统的最新进展、获取支持,还是与其他人在激动人心的项目上建立联系,我们都很欢迎你加入社区!🤝

查看我们的其他工作:

  1. 🐫 创建你的第一个 CAMEL 代理 免费 Colab

  2. Graph RAG 教程 免费 Colab

  3. 🧑‍⚖️ 使用 Workforce 创建黑客马拉松评委委员会 免费 Colab

  4. 🔥 使用 Firecrawl 和 CAMEL 从网站获取数据的 3 种方法 免费 Colab

  5. 🦥 使用 CAMEL 和 Mistral 模型进行代理 SFT 数据生成,使用 Unsloth 进行微调 免费 Colab

来自 🐫 CAMEL-AI 团队的感谢





Github 上给我们点星,加入我们的 Discord 或关注我们的 X
相关文章
|
8月前
|
机器学习/深度学习 人工智能 算法
通义千问Qwen-72B-Chat大模型在PAI平台的微调实践
本文将以Qwen-72B-Chat为例,介绍如何在PAI平台的快速开始PAI-QuickStart和交互式建模工具PAI-DSW中高效微调千问大模型。
|
8月前
|
机器学习/深度学习 算法 测试技术
使用ORPO微调Llama 3
ORPO是一种结合监督微调和偏好对齐的新型微调技术,旨在减少训练大型语言模型所需资源和时间。通过在一个综合训练过程中结合这两种方法,ORPO优化了语言模型的目标,强化了对首选响应的奖励,弱化对不期望回答的惩罚。实验证明ORPO在不同模型和基准上优于其他对齐方法。本文使用Llama 3 8b模型测试ORPO,结果显示即使只微调1000条数据一个epoch,性能也有所提升,证实了ORPO的有效性。完整代码和更多细节可在相关链接中找到。
376 10
|
自然语言处理 安全 机器人
什么是Chat GPT3
随着 Chat GPT 技术的进一步发展,有几个关键方面值得关注。 首先是模型的扩展和改进。尽管 Chat GPT 在生成对话方面取得了很大的进展,但仍然存在一些局限性。模型在处理复杂问题和多轮对话时可能存在困难,很容易陷入回答模棱两可或不相关的内容。因此,改进模型在上下文理解和对话逻辑方面的能力是很重要的。 其次是对话的多模态处理。目前的 Chat GPT 模型主要基于文本输入和生成。然而,与人类对话经常伴随着语音、图像和其他非文本的元素不同,模型在多模态对话中的表现仍然较弱。因此,将多模态信息整合到 Chat GPT 中,使其能够更好地处理多媒体对话,将是一个有挑战性但有前景的方向。
213 0
|
8月前
|
监控 PyTorch 算法框架/工具
Qwen-VL怎么用自己的数据集微调
Qwen-VL怎么用自己的数据集微调
1032 0
|
3天前
|
搜索推荐 物联网 PyTorch
Qwen2.5-7B-Instruct Lora 微调
本教程介绍如何基于Transformers和PEFT框架对Qwen2.5-7B-Instruct模型进行LoRA微调。
362 30
Qwen2.5-7B-Instruct Lora 微调
|
1天前
|
并行计算 PyTorch 算法框架/工具
阿里云PAI-部署Qwen2-VL-72B
阿里云PAI-部署Qwen2-VL-72B踩坑实录
|
23天前
|
定位技术 API 数据安全/隐私保护
QWEN-VL Plus 使用小记
近期尝试使用Qwen VL Plus模型处理图像识别任务,以GIS专业背景选择了一张街景图片进行测试。体验上,API调用流畅,环境配置简单,且成本低廉,免费额度可支持约1,000张图片的处理。不过,模型在某些情况下会产生幻觉,如对仅含Google水印的街景图片错误地描述存在地名信息。此外,其文本描述风格多变,从轻松愉快到沉稳不一,有时甚至会拒绝回答。
96 5
|
2月前
|
人工智能 JSON 监控
Qwen2.5-Coder-7B-Instruct Lora 微调 SwanLab 可视化记录版
本节我们简要介绍如何基于 transformers、peft 等框架,对Qwen2.5-Coder-7B-Instruct 模型进行Lora微调。使用的数据集是中文法律问答数据集 DISC-Law-SFT,同时使用 SwanLab 监控训练过程与评估模型效果。
127 4
|
4月前
|
自然语言处理 API Python
LLaMA
【9月更文挑战第26天】
157 63
|
8月前
|
机器学习/深度学习 人工智能 API
如何在 TensorRT-LLM 中支持 Qwen 模型
大型语言模型正以其惊人的新能力推动人工智能的发展,扩大其应用范围。然而,由于这类模型具有庞大的参数规模,部署和推理的难度和成本极高,这一挑战一直困扰着 AI 领域。此外,当前存在大量支持模型部署和推理的框架和工具,如  ModelScope 的 Model Pipelines API,和 HuggingFace 的 Text Generation Inference 等,各自都有其独特的特点和优势。然而,这些工具往往未能充分发挥  GPU 的性能。
71733 0
如何在 TensorRT-LLM 中支持 Qwen 模型