一、Prompt工程介绍:
1、概念:
Prompt工程,也称为提示工程或指令工程,是在自然语言处理(NLP)领域中一种重要的技术和方法。它主要用于指导预训练的大规模语言模型(Large Language Models, LLMs)生成高质量、准确且有针对性的输出。通过设计、实验和优化输入提示词(Prompt),Prompt工程能够引导预训练语言模型生成所需的响应或完成特定任务。
2、构成要素:
引导语或指示语:明确告诉模型需要完成什么样的任务。
下文信息:提供必要的背景知识,帮助模型更好地理解问题。
任务描述:明确地描述期望模型执行的具体任务。
输出格式指示:如果需要特定格式的输出,需要在Prompt中指明。
角色设定:为模型定义一个角色,以缩小问题范围并减少歧义。
3、应用:
指导模型行为:通过精确的Prompt,可以明确地告诉模型需要执行什么任务,比如回答问题、创作故事、提供建议等。
提高输出内容准确性:精心设计的Prompt可以帮助模型生成更准确、相关度更高的内容。
减少输出内容偏差:通过提供适当的指导,可以减少模型可能产生的偏见或错误信息。
规定输出格式:对于需要特定格式的输出,如表格、列表、段落等,可通过Prompt指定输出格式。
促进创造性应用:规范的Prompt可以激发模型创造力,生成新颖的想法、故事或艺术作品。
灵活调整:通过修改Prompt,可以在不改变模型本身的情况下调整其输出,从而实现快速迭代和测试。
二、代码展示:
!pip install simple-aesthetics-predictor !pip install -v -e data-juicer !pip uninstall pytorch-lightning -y !pip install peft lightning pandas torchvision !pip install -e DiffSynth-Studio from modelscope.msdatasets import MsDataset ds = MsDataset.load( 'AI-ModelScope/lowres_anime', subset_name='default', split='train', cache_dir="/mnt/workspace/kolors/data" ) import json, os from data_juicer.utils.mm_utils import SpecialTokens from tqdm import tqdm os.makedirs("./data/lora_dataset/train", exist_ok=True) os.makedirs("./data/data-juicer/input", exist_ok=True) with open("./data/data-juicer/input/metadata.jsonl", "w") as f: for data_id, data in enumerate(tqdm(ds)): image = data["image"].convert("RGB") image.save(f"/mnt/workspace/kolors/data/lora_dataset/train/{data_id}.jpg") metadata = {"text": "二次元", "image": [f"/mnt/workspace/kolors/data/lora_dataset/train/{data_id}.jpg"]} f.write(json.dumps(metadata)) f.write("\n") data_juicer_config = """ # global parameters project_name: 'data-process' dataset_path: './data/data-juicer/input/metadata.jsonl' # path to your dataset directory or file np: 4 # number of subprocess to process your dataset text_keys: 'text' image_key: 'image' image_special_token: '<__dj__image>' export_path: './data/data-juicer/output/result.jsonl' # process schedule # a list of several process operators with their arguments process: - image_shape_filter: min_width: 1024 min_height: 1024 any_or_all: any - image_aspect_ratio_filter: min_ratio: 0.5 max_ratio: 2.0 any_or_all: any """ with open("data/data-juicer/data_juicer_config.yaml", "w") as file: file.write(data_juicer_config.strip()) !dj-process --config data/data-juicer/data_juicer_config.yaml import pandas as pd import os, json from PIL import Image from tqdm import tqdm texts, file_names = [], [] os.makedirs("./data/data-juicer/output/images", exist_ok=True) with open("./data/data-juicer/output/result.jsonl", "r") as f: for line in tqdm(f): metadata = json.loads(line) texts.append(metadata["text"]) file_names.append(metadata["image"][0]) df = pd.DataFrame({"text": texts, "file_name": file_names}) df.to_csv("./data/data-juicer/output/result.csv", index=False) df from transformers import CLIPProcessor, CLIPModel import torch model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32") processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32") images = [Image.open(img_path) for img_path in df["file_name"]] inputs = processor(text=df["text"].tolist(), images=images, return_tensors="pt", padding=True) outputs = model(**inputs) logits_per_image = outputs.logits_per_image # this is the image-text similarity score probs = logits_per_image.softmax(dim=1) # we can take the softmax to get the probabilities probs from torch.utils.data import Dataset, DataLoader class CustomDataset(Dataset): def __init__(self, df, processor): self.texts = df["text"].tolist() self.images = [Image.open(img_path) for img_path in df["file_name"]] self.processor = processor def __len__(self): return len(self.texts) def __getitem__(self, idx): inputs = self.processor(text=self.texts[idx], images=self.images[idx], return_tensors="pt", padding=True) return inputs dataset = CustomDataset(df, processor) dataloader = DataLoader(dataset, batch_size=8) for batch in dataloader: outputs = model(**batch) logits_per_image = outputs.logits_per_image probs = logits_per_image.softmax(dim=1) print(probs) import torch from diffusers import StableDiffusionPipeline torch.manual_seed(1) pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v-1-4", torch_dtype=torch.float16) pipe = pipe.to("cuda") prompt = "二次元,一个紫色长发小女孩穿着粉色吊带漏肩连衣裙,在练习室练习唱歌,手持话筒" negative_prompt = "丑陋、变形、嘈杂、模糊、低对比度" guidance_scale = 4 num_inference_steps = 50 image = pipe( prompt=prompt, negative_prompt=negative_prompt, guidance_scale=guidance_scale, num_inference_steps=num_inference_steps, height=1024, width=1024, ).images[0] image.save("example_image.png") image from PIL import Image torch.manual_seed(1) image = pipe( prompt="二次元,日系动漫,演唱会的观众席,人山人海,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙坐在演唱会的观众席,舞台上衣着华丽的歌星们在唱歌", negative_prompt="丑陋、变形、嘈杂、模糊、低对比度", cfg_scale=4, num_inference_steps=50, height=1024, width=1024, ) image.save("1.jpg") torch.manual_seed(1) image = pipe( prompt="二次元,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙坐在演唱会的观众席,露出憧憬的神情", negative_prompt="丑陋、变形、嘈杂、模糊、低对比度,色情擦边", cfg_scale=4, num_inference_steps=50, height=1024, width=1024, ) image.save("2.jpg") torch.manual_seed(2) image = pipe( prompt="二次元,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙坐在演唱会的观众席,露出憧憬的神情", negative_prompt="丑陋、变形、嘈杂、模糊、低对比度,色情擦边", cfg_scale=4, num_inference_steps=50, height=1024, width=1024, ) image.save("3.jpg") torch.manual_seed(5) image = pipe( prompt="二次元,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙,对着流星许愿,闭着眼睛,十指交叉,侧面", negative_prompt="丑陋、变形、嘈杂、模糊、低对比度,扭曲的手指,多余的手指", cfg_scale=4, num_inference_steps=50, height=1024, width=1024, ) image.save("4.jpg") torch.manual_seed(0) image = pipe( prompt="二次元,一个紫色中等长度头发小女孩穿着粉色吊带漏肩连衣裙,在练习室练习唱歌", negative_prompt="丑陋、变形、嘈杂、模糊、低对比度", cfg_scale=4, num_inference_steps=50, height=1024, width=1024, ) image.save("5.jpg") torch.manual_seed(1) image = pipe( prompt="二次元,一个紫色长发小女孩穿着粉色吊带漏肩连衣裙,在练习室练习唱歌,手持话筒", negative_prompt="丑陋、变形、嘈杂、模糊、低对比度", cfg_scale=4, num_inference_steps=50, height=1024, width=1024, ) image.save("6.jpg") torch.manual_seed(7) image = pipe( prompt="二次元,紫色长发少女,穿着黑色连衣裙,试衣间,心情忐忑", negative_prompt="丑陋、变形、嘈杂、模糊、低对比度", cfg_scale=4, num_inference_steps=50, height=1024, width=1024, ) image.save("7.jpg") torch.manual_seed(0) image = pipe( prompt="二次元,紫色长发少女,穿着黑色礼服,连衣裙,在台上唱歌", negative_prompt="丑陋、变形、嘈杂、模糊、低对比度", cfg_scale=4, num_inference_steps=50, height=1024, width=1024, ) image.save("8.jpg") import numpy as np from PIL import Image images = [np.array(Image.open(f"{i}.jpg")) for i in range(1, 9)] image = np.concatenate([ np.concatenate(images[0:2], axis=1), np.concatenate(images[2:4], axis=1), np.concatenate(images[4:6], axis=1), np.concatenate(images[6:8], axis=1), ], axis=0) image = Image.fromarray(image).resize((1024, 2048)) image
三、代码分析:
1、数据处理:
数据加载与预处理:
首先,使用modelscope.msdatasets加载了一个名为AI-ModelScope/lowres_anime的数据集,这是一个二次元低分辨率动漫图像的数据集。接着,通过遍历数据集中的每个样本,将图像转换为RGB格式并保存到指定路径。同时,为每个图像生成一个包含文本("二次元")和图像路径的元数据文件metadata.jsonl。
数据清洗与过滤:
使用data-juicer工具(通过dj-process命令)对图像数据进行进一步处理,包括形状过滤和长宽比过滤,以确保图像满足一定的质量要求。处理后的结果保存在result.jsonl文件中,并转换成CSV格式以便于后续操作。
2、图像-文本相似度分析(使用CLIP模型):
加载预训练的CLIP模型(CLIPModel.from_pretrained("openai/clip-vit-base-patch32"))和对应的处理器(CLIPProcessor)。将清洗后的图像和对应的文本("二次元")作为输入,通过CLIP模型计算图像-文本的相似度得分。使用CustomDataset和DataLoader将数据和模型整合到PyTorch的数据加载流程中,以便进行批量处理。
3、图像生成(使用StableDiffusionPipeline):
加载预训练的StableDiffusion模型(StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v-1-4")),并配置到CUDA上进行加速。使用不同的prompt(包含详细的描述信息)和negative_prompt(排除不希望出现的元素)来指导模型生成图像。通过调整cfg_scale(引导强度)、num_inference_steps(推理步数)等参数来控制生成图像的质量和细节。将生成的图像保存到本地文件中,并进行展示或进一步处理。
四、实践:
1、更换提示词:
2、操作过程具体看task 01;
3、生成图片展示:
总结
### 文章总结#### 一、Prompt工程介绍
**1. 概念**
- **Prompt工程**(也称为提示工程或指令工程)是自然语言处理(NLP)中的一种技术方法,用于指导预训练的大规模语言模型(LLMs)生成高质量、准确且有针对性的输出。通过精心设计、实验和优化输入提示词(Prompt),该技术能够引导模型执行特定任务。
**2. 构成要素**
- **引导语或指示语**:明确告诉模型任务要求。
- **下文信息**:提供必要背景知识,帮助模型理解问题。
- **任务描述**:详细阐述期望模型执行的具体任务。
- **输出格式指示**:如果需要特定格式的输出,需在Prompt中指定。
- **角色设定**:为模型定义角色,缩小问题范围并减少歧义。
**3. 应用**
- **指导模型行为**:精确控制模型任务执行,如回答问题、创作故事等。
- **提高输出准确性**:优化Prompt设计以提升内容的准确度和相关性。
- **减少偏差**:通过适当指导减少模型偏见和错误信息。
- **规定输出格式**:通过Prompt指定输出格式如表格、列表等。
- **促进创造性**:规范的Prompt激发模型创作能力。
- **灵活调整**:不改变模型本身,通过修改Prompt快速迭代和测试输出。
#### 二、代码展示
代码展示部分包括数据处理、图像-文本相似度分析(使用CLIP模型)、图像生成(使用StableDiffusionPipeline)。
- **数据处理**:使用`modelscope.msdatasets`加载数据集,对数据进行遍历、清洗与过滤,并保存到指定路径和文件格式。
- **图像-文本相似度分析**:利用CLIP模型计算图像与其描述文本("二次元")的相似度得分,利用`DataLoader`进行批量处理。
- **图像生成**:加载StableDiffusion模型,通过调整不同的prompt和negative_prompt,以及配置参数如引导强度和推理步数,生成高质量的二次元图像,并保存展示。
#### 三、代码分析
**1. 数据处理**
- 数据集加载与预处理:加载动漫图像数据集,转换并保存图像,生成元数据文件。
- 数据过滤:使用data-juicer工具进行图像形状和长宽比过滤,确保数据质量。
**2. 图像-文本相似度分析**
- 加载并使用CLIP模型,计算图像与文本描述("二次元")之间的相似度得分。
- 使用自定义数据集和`DataLoader`进行批量处理。
**3. 图像生成**
- 加载并配置StableDiffusion模型,使用CUDA加速生成图像。
- 通过精确控制的Prompt和negative_prompt引导模型生成多样化的二次元图像,调整参数优化图像质量。
#### 四、实践
建议通过**更换不同的提示词**(Prompt)来观察并体验图像生成的多样性和灵活性。具体操作可参考任务01中的详细步骤。生成的图片可以进一步展示或用于其他分析。 prompt二次元cliclipjsondiffusionstablediffusiontpu数据集git图像生成prompt工程预训练提示词模型生成数据处理演唱会文本相似度kolcsv