Tag: AI

  • 评估自动文摘质量的终极指南

    评估自动文摘质量的终极指南

    你是否曾经尝试过创建自动文摘系统,但却不知道如何准确评估其质量?本文将为您提供关于如何评估抽象文摘质量的详细指南。我们将介绍传统的评估方法,如ROUGE和BERTScore,以及一种创新的方法,利用大型语言模型(LLM)作为评估器。

    1. 开篇故事

    在探讨自动文摘质量评估之前,让我们来看一个生动有趣的故事。假设你是一名AI研究员,正在开发一款自动文摘系统,这个系统可以将长篇文章精炼成简短的摘要。你花费了数月时间不断改进算法,优化性能,但你开始面临一个棘手的问题:如何准确地评估你的文摘质量?这个问题在自然语言处理领域一直备受关注,因为它涉及到了如何衡量文本的准确性、连贯性和相关性。

    在这个教程中,我们将为你揭示评估自动文摘质量的关键方法,让你的工作更具实际应用性和可衡量性。

    2. 引言

    自动文摘质量评估是一个耗时的过程,因为它涉及到不同的质量指标,如连贯性、简洁性、可读性和内容。传统的自动评估指标,如ROUGE和BERTScore等,虽然具体可靠,但可能与实际文摘质量的相关性不高。特别是对于开放性生成任务,它们与人类评价的相关性相对较低。因此,在评估文摘质量时,越来越需要依赖人类评估、用户反馈或基于模型的指标,同时需要警惕潜在的偏见。虽然人类判断提供了宝贵的见解,但通常不具备可扩展性,并且成本较高。

    除了传统的评估指标,我们还展示了一种使用大型语言模型(LLM)的方法(G-Eval),用作评估抽象性摘要的新型、无参考度量。在这种情况下,我们使用gpt-4来评分候选输出。gpt-4已经有效地学习了语言质量的内部模型,使其能够区分流畅、连贯的文本和低质量的文本。利用这种内部评分机制,可以自动评估LLM生成的新候选输出。

    3. 安装必要的软件包

    在进行评估之前,我们需要安装一些必要的软件包,以便进行评估。这些包包括ROUGE、BERTScore和OpenAI的API。

    !pip install rouge --quiet
    !pip install bert_score --quiet
    !pip install openai --quiet
    import openai
    import os
    import re
    import pandas as pd
    
    # 这里放置Python实现ROUGE指标的代码
    from rouge import Rouge
    
    # BERTScore利用BERT的上下文嵌入并通过余弦相似度匹配候选和参考句子中的单词。
    from bert_score import BERTScorer
    
    openai.api_key = os.environ.get("OPENAI_API_KEY")

    4. 示例任务

    为了本教程的目的,我们将使用以下示例文摘任务。请注意,我们提供了两个生成的摘要供比较,以及一个参考的人工撰写摘要,这是ROUGE和BERTScore等评估指标所需的。

    摘录 (excerpt):

    OpenAI的使命是确保人工通用智能(AGI)造福全人类。OpenAI将直接构建安全和有益的AGI,但如果其工作有助于其他人实现这一目标,它也将认为使命已达成。OpenAI遵循几个关键原则。首先,广泛分布的利益 – 对AGI部署的任何影响都将用于全人类的利益,以避免有害的使用或权力过度集中。其次,长期安全 – OpenAI致力于进行研究,使AGI安全,并促进这些研究在AI社区中的采纳。第三,技术领导 – OpenAI旨在处于AI能力的前沿。第四,合作导向 – OpenAI积极与其他研究和政策机构合作,并寻求创建一个共同工作的全球社区,共同解决AGI的全球挑战。

    摘要 (Summaries):

    • 参考摘要 /ref_summary(人工生成):
      OpenAI的目标是确保人工通用智能(AGI)造福所有人,避免有害用途或权力过度集中。它致力于研究AGI的安全性,并在AI社区中促进这些研究。OpenAI旨在领导AI能力的发展,与全球研究和政策机构合作,解决AGI的挑战。

    • 评估摘要1 / eval_summary_1(系统生成):
      OpenAI旨在使AGI造福全人类,避免有

    害用途和权力集中。它引领安全和有益的AGI研究,并在全球促进采用。OpenAI在AI领域保持技术领导地位,与全球机构合作,解决AGI的挑战。它力求领导一个协作的全球努力,为集体利益开发AGI。

    • 评估摘要2 / eval_summary_2(系统生成):
      OpenAI旨在确保AGI供所有人使用,完全避免有害内容或权力过度集中。致力于研究AGI的安全性,并在AI社区中促进这些研究。OpenAI希望在AI领域处于领先地位,并与全球研究和政策团体合作,探讨AGI的相关问题。

    5. 使用ROUGE进行评估

    ROUGE是Recall-Oriented Understudy for Gisting Evaluation的缩写,主要用于衡量生成的输出与参考文本之间的词语重叠。这是评估自动文摘任务的一种流行指标。在其各种变体中,ROUGE-L提供了系统生成和参考摘要之间最长连续匹配的信息,衡量系统保留原始摘要要点的程度。

    # 计算ROUGE分数的函数
    def get_rouge_scores(text1, text2):
        rouge = Rouge()
        return rouge.get_scores(text1, text2)
    
    # 计算两个摘要与参考摘要之间的ROUGE分数
    eval_1_rouge = get_rouge_scores(eval_summary_1, ref_summary)
    eval_2_rouge = get_rouge_scores(eval_summary_2, ref_summary)
    
    rouge_scores_out = []
    
    for metric in ["rouge-1", "rouge-2", "rouge-l"]:
        for label in ["F-Score"]:
            eval_1_score = eval_1_rouge[0][metric][label[0].lower()]
            eval_2_score = eval_2_rouge[0][metric][label[0].lower()]
    
            row = {
                "Metric": f"{metric} ({label})",
                "Summary 1": eval_1_score,
                "Summary 2": eval_2_score,
            }
            rouge_scores_out.append(row)
    
    # 展示ROUGE分数
    rouge_scores_out_df = (
        pd.DataFrame(rouge_scores_out)
        .set_index("Metric")
    )
    
    rouge_scores_out_df

    上述代码计算了两个不同摘要与参考文本之间的ROUGE分数。在rouge-1方面,摘要2优于摘要1,表示单词重叠较多。而在rouge-l方面,摘要2得分较高,意味着最长公共子序列匹配较好,因此可能更好地捕捉了原始文本的主要内容和顺序。由于摘要2直接提取了摘录中的许多词汇和短语,因此与参考摘要的重叠可能较高,从而导致较高的ROUGE分数。

    然而,需要注意的是,尽管ROUGE和类似的指标(如BLEU和METEOR)提供了定量的度量,但它们通常无法捕捉良好生成摘要的真正本质。它们与人类评分的相关性也较差。鉴于LLM的进展,它们擅长生成流畅和连贯的摘要,传统的指标如ROUGE可能会误判这些模型,特别是如果摘要的表达方式不同但仍然准确地包括核心信息。

    6. 使用BERTScore进行评估

    ROUGE依赖于候选文本和参考文本中单词的精确匹配,无法解释底层语义。这就是BERTScore的作用,它利用BERT模型的上下文嵌入,旨在评估在机器生成的文本背景下,预测文本和参考句子之间的相似性。通过比较两者的嵌入,BERTScore捕获了传统n-gram指标可能忽略的语义相似性。

    # 实例化英语语言的BERTScorer对象
    scorer = BERTScorer(lang="en")
    
    # 计算摘要1与摘录的BERTScore
    P1, R1, F1_1 = scorer.score([eval_summary_1], [ref_summary])
    
    # 计算摘要2与摘录的BERTScore
    P2, R2, F2_2 = scorer.score([eval_summary_2], [ref_summary])
    
    print("摘要1 F1分数:", F1_1.tolist()[0])
    print("摘要2 F1分数:", F2_2.tolist()[0])

    上述代码计算了两个摘要与摘录之间的BERTScore分数。F1分数接近表明它们在捕获关键信息方面表现相似。然而,这种小差异应谨慎解释。由于BERTScore可能无法完全理解人类评估员可能理解的微妙和高级概念,仅依赖于这一指标可能会导致对摘要的实际质量和细微差别进行错误解读。将BERTScore与人工评估和其他指标结合使用可以提供更可靠的评估。

    7. 使用GPT-4进行评估

    在这里,我们实现了一个使用gpt-4的示例无参考文本评估器,受到G-Eval框架的启发,该框架使用大型语言模型评估生成文本的质量。与ROUGE或BERTScore等依赖于与

    参考摘要的比较的指标不同,基于gpt-4的评估器仅基于输入提示和文本评估生成内容的质量,而无需任何基准参考。这使其适用于新数据集和任务,其中人类参考文献稀缺或不可用。

    以下是此方法的概述:

    • 我们定义了四个不同的标准:

      • 相关性:评估摘要是否仅包含重要信息并排除多余信息。
      • 连贯性:评估摘要的逻辑流程和组织结构。
      • 一致性:检查摘要是否与源文档中的事实一致。
      • 流畅性:评估摘要的语法、拼写、标点、词汇选择和句子结构。
    • 我们为每个标准创建提示,以原始文档和摘要作为输入,并利用思维链生成和引导模型以输出每个标准的1-5之间的数值评分。

    • 我们使用定义的提示从gpt-4生成分数,然后比较它们在不同摘要之间。

    # 评估提示模板基于G-Eval
    EVALUATION_PROMPT_TEMPLATE = """
    您将获得一份为一篇文章写的摘要。您的任务是根据一个度量标准对摘要进行评分。
    请确保您非常仔细地阅读和理解这些说明。
    请在审阅时保持这个文档打开,并根据需要参考它。
    
    评估标准:
    
    {criteria}
    
    评估步骤:
    
    {steps}
    
    示例:
    
    源文本:
    
    {document}
    
    摘要:
    
    {summary}
    
    评估表单(仅分数):
    
    - {metric_name}
    """
    
    # 标准1:相关性
    RELEVANCY_SCORE_CRITERIA = """
    相关性(1-5) - 从源文本中选择重要内容。 \
    摘要应仅包含源文档中的重要信息。 \
    评估员被要求惩罚包含冗余和多余信息的摘要。
    """
    
    RELEVANCY_SCORE_STEPS = """
    1. 仔细阅读摘要和源文档。
    2. 比较摘要与源文档,并确定文章的主要要点。
    3. 评估摘要多好地涵盖了文章的主要要点,以及它包含了多少无关或多余的信息。
    4. 指定一个从1到5的相关性评分。
    """
    
    # 标准2:连贯性
    COHERENCE_SCORE_CRITERIA = """
    连贯性(1-5) - 所有句子的综合质量。 \
    我们将此维度与DUC质量问题中的结构和连贯性一致,即“摘要应该具有良好的结构和组织。 \
    摘要不应仅仅是一堆相关信息,而应该从句子到一\
    个关于一个主题的连贯信息体中逐渐构建起来。”
    """
    
    COHERENCE_SCORE_STEPS = """
    1. 仔细阅读文章,确定主要主题和要点。
    2. 仔细阅读摘要,并将其与文章进行比较。检查摘要是否涵盖了文章的主要主题和要点,
       并且是否以清晰且逻辑的顺序呈现它们。
    3. 根据评估标准,为连贯性评分,评分范围从1到5,其中1是最低的,5是最高的。
    """
    
    # 标准3:一致性
    CONSISTENCY_SCORE_CRITERIA = """
    一致性(1-5) - 摘要与被总结源文之间的事实一致性。 \
    一个事实一致的摘要仅包含源文档支持的陈述。 \
    评估员还被要求惩罚包含虚构事实的摘要。
    """
    
    CONSISTENCY_SCORE_STEPS = """
    1. 仔细阅读文章,确定它呈现的主要事实和细节。
    2. 仔细阅读摘要,并将其与文章进行比较。检查摘要是否包含文章不支持的任何事实错误。
    3. 根据评估标准,为一致性评分。
    """
    
    # 标准4:流畅性
    FLUENCY_SCORE_CRITERIA = """
    流畅性(1-3): 摘要的质量,涉及语法、拼写、标点、词汇选择和句子结构。
    1: 差。摘要有许多错误,使其难以理解或听起来不自然。
    2: 一般。摘要有一些错误,影响了文本的清晰度或流畅性,但主要要点仍然可以理解。
    3: 良好。摘要几乎没有错误,阅读和理解起来很容易。
    """
    
    FLUENCY_SCORE_STEPS = """
    阅读摘要并根据给定的标准评估其流畅性。指定一个从1到3的流畅性评分。
    """
    
    # 为不同标准准备数据
    evaluation_metrics = {
        "相关性": (RELEVANCY_SCORE_CRITERIA, RELEVANCY_SCORE_STEPS),
        "连贯性": (COHERENCE_SCORE_CRITERIA, COHERENCE_SCORE_STEPS),
        "一致性": (CONSISTENCY_SCORE_CRITERIA, CONSISTENCY_SCORE_STEPS),
        "流畅性": (FLUENCY_SCORE_CRITERIA, FLUENCY_SCORE_STEPS),
    }
    
    summaries = {"摘要1": eval_summary_1, "摘要2": eval_summary_2}
    
    data = {"评估
    
    标准": [], "摘要": [], "评分": []}
    
    for metric, (criteria, steps) in evaluation_metrics.items():
        for summary_name, summary_text in summaries.items():
            prompt = EVALUATION_PROMPT_TEMPLATE.format(
                criteria=criteria, steps=steps, document=excerpt, summary=summary_text, metric_name=metric
            )
            response = openai.Completion.create(
                engine="text-davinci-003", prompt=prompt, max_tokens=100
            )
            rating = int(re.search(r"\d", response.choices[0].text).group())
            data["评估标准"].append(metric)
            data["摘要"].append(summary_name)
            data["评分"].append(rating)
    
    # 将数据转换为DataFrame以进行比较
    evaluation_df = pd.DataFrame(data)
    
    # 输出评估结果
    evaluation_df

    上述代码使用gpt-4基于定义的四个标准为两个摘要生成了1-5之间的分数。这些标准包括相关性、连贯性、一致性和流畅性。根据每个标准的提示,gpt-4生成了评分,然后将这些评分与不同摘要进行比较。根据评估结果,您可以看到每个摘要在不同标准下的表现如何。

    8. 总结

    自动文摘质量评估是一个复杂的任务,涉及多个方面,包括文本的相关性、连贯性、一致性和流畅性。传统的评估指标如ROUGE和BERTScore提供了一种方式来量化自动生成的文本与参考文本之间的相似性,但它们不能全面捕捉文本质量的各个方面。因此,将它们与基于大型语言模型的评估器结合使用可能会更全面地评估文本质量。

    在这个教程中,我们展示了如何使用ROUGE、BERTScore和基于gpt-4的评估器来评估自动生成的文本的质量。请记住,这些指标和方法只是评估文本质量的一部分,最终的评估可能需要人工评估和用户反馈来全面评估文本生成系统的性能。希望这个指南能帮助您更好地了解如何评估自动文摘质量,从而改进和优化您的自动生成文本的系统。

  • 如何使用Chat模型进行微调:一个食谱命名实体识别教程

    如何使用Chat模型进行微调:一个食谱命名实体识别教程

    在数字时代,人工智能技术正不断演进,为我们的生活和工作带来了革命性的变化。开放AI(OpenAI)的GPT-3.5-turbo模型是一项重要的技术,它可以用于各种自然语言处理任务,包括聊天和命名实体识别(NER)。本教程将向您展示如何使用GPT-3.5-turbo进行微调,以执行食谱命名实体识别任务。

    1. 引子:解锁人工智能的潜力

    在当今的数字世界中,人工智能技术正日益成熟和普及。无论是自动化客户支持,还是从大规模数据中提取有用信息,AI都发挥着关键作用。而GPT-3.5-turbo模型是一种强大的AI工具,可以用于许多自然语言处理任务,使您能够创建智能聊天机器人,或者像本教程一样执行命名实体识别任务。

    2. 准备工作:设置环境

    在开始微调之前,确保您已经安装了最新版本的OpenAI Python包,并已获取了OpenAI API密钥。这个密钥将用于与GPT-3.5-turbo模型进行通信。

    # 安装最新版本的OpenAI Python包
    !pip install --upgrade openai
    
    import json
    import openai
    import os
    import pandas as pd
    from pprint import pprint
    
    # 添加您的OpenAI API密钥
    OPENAI_API_KEY = os.getenv("OPENAI_API_KEY", "")

    3. 数据准备:准备数据进行微调

    在进行微调之前,您需要准备训练数据。在本教程中,我们将使用食谱数据集,并从中提取通用的食材名称作为命名实体。以下是数据准备的步骤:

    3.1 数据集加载和筛选

    为了进行微调,我们需要一个特定领域的数据集。数据集应该足够专注,以便模型可以学习,但也要足够通用,以便不会错过未见过的示例。在本教程中,我们从RecipesNLG数据集中提取了一个子集,该子集只包含来自www.cookbooks.com的文档。

    # 读取我们将在此任务中使用的数据集
    recipe_df = pd.read_csv("data/cookbook_recipes_nlg_10k.csv")
    
    # 显示数据集的前几行
    recipe_df.head()

    3.2 数据格式转换

    在微调时,我们需要将数据转换为适用于ChatCompletion格式的训练示例。每个训练示例都是一个包含多个消息的对话列表。以下是数据转换的示例代码:

    training_data = []
    
    system_message = "You are a helpful recipe assistant. You are to extract the generic ingredients from each of the recipes provided."
    
    def create_user_message(row):
        return f"""Title: {row['title']}\n\nIngredients: {row['ingredients']}\n\nGeneric ingredients: """
    
    def prepare_example_conversation(row):
        messages = []
        messages.append({"role": "system", "content": system_message})
    
        user_message = create_user_message(row)
        messages.append({"role": "user", "content": user_message})
    
        messages.append({"role": "assistant", "content": row["NER"]})
    
        return {"messages": messages}
    
    # 对数据集的每一行应用数据转换函数
    training_data = recipe_df.apply(prepare_example_conversation, axis=1).tolist()

    3.3 上传文件

    将转换后的数据保存为.jsonl文件,然后上传到OpenAI的Files端点,以供微调使用。

    def write_jsonl(data_list: list, filename: str) -> None:
        with open(filename, "w") as out:
            for ddict in data_list:
                jout = json.dumps(ddict) + "\n"
                out.write(jout)
    
    # 保存训练数据和验证数据为.jsonl文件
    training_file_name = "tmp_recipe_finetune_training.jsonl"
    write_jsonl(training_data, training_file_name)
    
    validation_file_name = "tmp_recipe_finetune_validation.jsonl"
    write_jsonl(validation_data, validation_file_name)
    
    # 使用OpenAI的Files端点上传文件
    training_response = openai.File.create(
        file=open(training_file_name, "rb"), purpose="fine-tune"
    )
    training_file_id = training_response["id"]
    
    validation_response = openai.File.create(
        file=open(validation_file_name, "rb"), purpose="fine-tune"
    )
    validation_file_id = validation_response["id"]

    4. 微调模型

    现在,我们可以使用准备好的文件创建微调任务。在创建任务时,我们需要指定训练文件、验证文件、模型名称和可选的后缀来标识模型。以下是微调模型的示例代码:

    response = openai.FineTuningJob.create(
        training_file=training_file_id,
        validation_file=validation_file_id,
        model="gpt-3.5-turbo",
        suffix="recipe-ner",
    )
    
    job_id = response["id"]

    您可以使用以下代码检查微调任务的状态:

    response = openai.FineTuningJob.retrieve(job_id)
    
    print("Job ID:", response["id"])
    print("Status:", response["status"])

    5. 跟踪微调进度

    微调任务可能需要一些时间来完成。您可以使用以下代码跟踪微调进度:

    response = openai.FineTuningJob.list_events(id=job_id, limit=50)
    
    events = response["data"]
    events.reverse()
    
    for event in events:
        print(event["message"])

    6. 微调成功!

    一旦微调任务完成,您将获得一个微调模型的ID。以下是

    如何获取微调模型的示例代码:

    response = openai.FineTuningJob.retrieve(job_id)
    fine_tuned_model_id = response["fine_tuned_model"]
    
    print("Fine-tuned model ID:", fine_tuned_model_id)

    7. 使用微调模型进行推理

    最后,您可以使用微调的模型来执行推理。只需调用ChatCompletions并指定微调模型的名称和消息列表。以下是如何使用微调模型进行推理的示例代码:

    test_df = recipe_df.loc[201:300]
    test_row = test_df.iloc[0]
    test_messages = []
    test_messages.append({"role": "system", "content": system_message})
    user_message = create_user_message(test_row)
    test_messages.append({"role": "user", "content": create_user_message(test_row)})
    
    response = openai.ChatCompletion.create(
        model=fine_tuned_model_id, messages=test_messages, temperature=0, max_tokens=500
    )
    print(response["choices"][0]["message"]["content"])

    8. 结论

    通过本教程,您已经学会了如何使用GPT-3.5-turbo模型进行微调,以执行食谱命名实体识别任务。这个过程涵盖了数据准备、模型微调和推理的所有关键步骤。希望这个教程对您在自然语言处理领域的工作和项目中有所帮助。

  • 如何使用Python优化爬虫和数据可视化

    如何使用Python优化爬虫和数据可视化

    你是否曾经想过如何从Bilibili网站上获取有关UP主的信息,并将其可视化呈现出来?本教程将向你展示如何使用Python、Selenium、Pandas和Matplotlib优化你的爬虫和数据可视化流程,以更轻松地收集和分析数据。

    前言

    在这个信息爆炸的时代,我们有许多方法来获取数据。而对于喜欢Bilibili的用户来说,UP主的粉丝数量和内容质量是非常关键的信息。我们将使用Python编程语言来自动抓取Bilibili上UP主的信息,并通过数据可视化来更好地理解这些数据。

    准备工作

    在开始之前,确保你已经安装了以下Python库:

    • Pandas:用于数据处理和分析。
    • Matplotlib:用于数据可视化。
    • Selenium:用于网页自动化操作。

    你还需要下载Microsoft Edge浏览器驱动,确保与你的浏览器版本相匹配。现在,让我们开始吧!

    第一步:设置环境

    首先,让我们设置Python环境并导入必要的库:

    import pandas as pd
    import matplotlib.pyplot as plt
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    import pinyin

    在这里,我们导入了所需的库,包括Pandas用于数据处理、Matplotlib用于可视化、Selenium用于网页自动化操作以及pinyin用于处理拼音。

    第二步:设置中文显示

    由于我们将处理中文字符,我们需要设置Matplotlib以正确显示中文字符:

    plt.rcParams["font.sans-serif"] = ["SimHei"]
    plt.rcParams["axes.unicode_minus"] = False

    这将确保你的可视化图表中可以正确显示中文。

    第三步:编写辅助函数

    在进行爬取和数据处理之前,我们将编写一些辅助函数来处理文字数据:

    def getStrAllAlpha(string):
        return pinyin.get_initial(string, delimiter="").upper()
    
    def getStrFirstAlpha(string):
        string = getStrAllAlpha(string)
        string = string[0:1]
        return string.upper()

    这两个函数将用于将UP主的名字转换为拼音,并提取首字母,以便后续的数据整理。

    第四步:爬取UP主信息

    现在,让我们开始爬取Bilibili上UP主的信息。我们将使用Selenium来自动化这个过程。首先,设置Bilibili的搜索页面URL:

    url = "https://search.bilibili.com/upuser?keyword=mc&from_source=webtop_search&spm_id_from=333.1007&order=fans"

    接下来,设置浏览器的User-Agent,以模拟用户操作:

    header = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36'}
    opt = webdriver.EdgeOptions()
    opt.add_argument('--user-agent=%s' % header)
    edge = webdriver.Edge(options=opt)

    然后,让浏览器打开Bilibili的搜索页面:

    edge.get(url)

    现在,我们准备开始爬取UP主信息。我们将循环爬取100个UP主的名字和粉丝数量,并将它们存储在两个列表中:

    name_list = []
    people_list = []
    
    for i in range(1, 101):
        try:
            # 使用XPath定位UP主信息
            li = edge.find_element(by=By.XPATH, value='//*[@id="user-list"]/div[1]/ul/li[' + str(i) + ']')
            txt = li.text
            name = txt.split("\n")[0].split("+")[0]
            people = txt.split("\n")[2].split(":")[1].split("万")[0]
            name_list.append(name)
            people_list.append(float(people))
            print(name, people)
        except:
            print("切页")
            # 点击下一页按钮
            button = edge.find_element(by=By.XPATH, value='//*[@id="user-list"]/div[1]/div[2]/div/ul/li[' + str(page) + ']/button').click()
            page += 1

    这个循环将遍历100个UP主的信息,并将它们存储在两个列表中。如果需要翻页,它还会自动点击下一页按钮。

    第五步:数据整理

    现在,我们已经成功爬取了UP主的信息,接下来让我们对数据进行整理。首先,我们将按照首字母对UP主进行分类:

    abc_name = []
    abc_name2 = []
    abc_people = []
    abc_people2 = []
    abc = "A"
    
    for i in range(26):
        for j in name_list:
            if getStrFirstAlpha(j) == abc:
                abc_name.append(j)
                tt = name_list.index(j)
        abc = chr(ord(abc) + 1)
    
    for id in abc_name:
        if id not in abc_name2:
            abc_name2.append(id)
    
    for i in abc_name2:
        abc_people2.append(people_list[name_list.index(i)])

    这段代码会将UP主按照首字母进行分类,并创建两个新的列表,分别存储UP主的名字和粉丝数量。

    第六步:数据保存

    我们将整理好的数据保存为CSV文件,以备后续分析和可视化使用:

    data = pd.DataFrame({"UP主名字": name_list, "粉丝数量/万": people_list})
    data.to_csv("up主信息.csv")
    
    data = pd.DataFrame({"UP主名字": abc_name2, "粉丝数量/万": abc_people2})
    data.to_csv("按首字母分类.csv")

    这将创建两个CSV文件

    ,分别存储UP主的详细信息和按首字母分类的信息。

    第七步:数据可视化

    现在,我们已经成功获取和整理了UP主的信息,接下来让我们使用Matplotlib进行数据可视化。我们将创建两个柱状图,一个显示所有UP主的粉丝数量,另一个按首字母分类显示:

    plt.subplot(1, 2, 1)
    bar1 = plt.bar(name_list, people_list, color=['r', 'r', 'r', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b'])
    plt.xticks(rotation=90, fontsize=13)
    plt.bar_label(bar1, label_type='edge')
    
    plt.subplot(1, 2, 2)
    bar2 = plt.bar(abc_name2, abc_people2, color=['r', 'r', 'r', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b'])
    plt.bar_label(bar2, label_type='edge')
    plt.xticks(rotation=90, fontsize=13)
    
    plt.show()

    这段代码会创建两个子图,一个显示所有UP主的粉丝数量,另一个按首字母分类显示。最后,通过plt.show()将图表显示出来。

    总结

    通过这个教程,你学会了如何使用Python、Selenium、Pandas和Matplotlib来爬取Bilibili上UP主的信息,并将其进行数据整理和可视化。这对于分析UP主的粉丝数量和分类是非常有用的。

    现在,你可以探索更多的数据分析和可视化方法,或者将这些数据用于其他有趣的项目。希望这个教程对你有所帮助!

  • 解锁ChatGPT Plus:绕开OpenAI限制的全新方式

    解锁ChatGPT Plus:绕开OpenAI限制的全新方式

    有一天,你突然发现自己的ChatGPT Plus账号被OpenAI封禁了,或者付费被拒绝,无法再享受这一令人着迷的AI服务。别急,我们为你带来了一个全新的解决方案,让你可以继续畅享ChatGPT Plus的魅力。本文将详细介绍通过支付宝购买美区App Store礼品卡的方法,来绕开封号和支付限制,让你再次体验ChatGPT Plus的卓越功能。

    第一步:确认账号状态

    首先,让我们来确认你的ChatGPT账号是否处于被封禁或付费被取消的状态。如果你遇到以下情况之一,那么本文适用于你:

    • 当你尝试登录ChatGPT账号时,系统提示:“You do not have an account because it has been deleted or deactivated. If you believe this was an error, please contact us through our help center at help.openai.com。”

    • 你收到OpenAI的邮件,内容主要提到账号上出现可疑活动,为了保护平台安全,已经取消了你的ChatGPT Plus订阅。你将无法再访问ChatGPT Plus服务。邮件中还提到,如果你认为这是错误的操作,可以提交上诉以恢复你的账号。

    • 你尝试使用depay付费,但支付被拒绝,账号变为普通版。这可能意味着你的ChatGPT账号已被风控,需要采用新的续费方式,甚至注册新账号。

    第二步:注册新的ChatGPT账号

    如果你的账号没有被封禁,只是Plus付费被取消,请跳过此步骤。

    如果你的账号已被封禁,无法登录,你需要重新注册一个新的ChatGPT账号。

    第三步:注册美区Apple ID

    现在,你需要一个美区App Store账号。如果你还没有一个美区账号,可以参考以下两篇文章来注册账号并安装ChatGPT的iOS版本:

    1. 使用国内的App Store账号,将区域切换到美国。

    第四步:使用支付宝充值美区App Store

    为什么我们不建议在闲鱼上直接购买礼品卡呢?因为在闲鱼上购买的礼品卡很难验证是否合法,如果你使用非法的卡片进行充值,有很大可能会导致你的美区Apple ID账号被封禁。

    当你成功注册美区账号后,接下来就是使用支付宝购买美区App Store礼品卡,按照以下步骤进行操作:

    1. 将支付宝的地理位置切换到“旧金山”,激活美区App Store充值入口。

    2. 切换地理位置后,在页面下滑,找到App Store充值入口。

    3. 注册账号,并完成充值。请注意,你在注册时填写的邮箱将会收到App Store的激活码,请务必准确填写。此外,购买礼品卡的金额应大于20美元,因为ChatGPT Plus的月费是19.9美元。如果你直接购买20美元的礼品卡,可能会在后续步骤中遇到账户余额不足的问题。建议你充值25美元,以确保足够的余额。

    4. 付款完成后,登录时填写的邮箱将在大约2分钟内收到App Store激活码的邮件。如果没有收到,请检查你的垃圾邮件文件夹。

    5. 打开已登录美区账号的App Store,输入激活码。

    st=>start: 第一步:确认账号状态
    op=>operation: 如果账号被封禁或付费被取消
    op2=>operation: 如果账号未被封禁,只是付费被取消
    cond=>condition: 是否需要重新注册新的ChatGPT账号?
    op3=>operation: 第二步:注册新的ChatGPT账号
    op4=>operation: 第三步:注册美区Apple ID
    op5=>operation: 第四步:使用支付宝充值美区App Store
    op6=>operation: 第五步:ChatGPT Plus续费
    e=>end: 完成
    
    st->op->cond
    cond(yes)->op3
    cond(no)->op2
    op3->op4->op5->op6->e
    

    第五步:ChatGPT Plus续费

    在成功充值App Store余额后,现在可以在ChatGPT的iOS应用程序上续费Plus账户了。

    续费完成后,你可以在PC浏览器上登录ChatGPT账号,继续使用GPT-4版本。

    总结

    ChatGPT近日更新了风控规则,导致之前使用depay虚拟信用卡支付的账号大多被封禁或取消续费。本文提供了一个全新的方法,通过美区App Store购买礼品卡来支付Plus账户,希望这个方案可以帮助解决你的续费问题。如果你按照步骤仍然遇到问题,请在文章下方留言,我们将尽力提供帮助。

    希望这篇文章能帮助你解锁ChatGPT Plus,绕开OpenAI的限制,继续享受这一出色的AI服务。如果你有任何问题或需要进一步的帮助,请随时留言。

  • 让语言模型在你的计算机上运行代码:Open Interpreter

    让语言模型在你的计算机上运行代码:Open Interpreter

    你是否曾经梦想过拥有一个能够运行代码的助手,能够执行各种任务,从编辑照片、视频、PDF文件,到控制浏览器进行研究,再到绘制、清理和分析大型数据集?现在,这个梦想成真了!Open Interpreter是OpenAI的Code Interpreter的本地开源实现,它可以让语言模型在你的计算机上运行代码,为你提供一个自然语言界面,让你可以通过终端与它进行交互。在本文中,我们将探讨Open Interpreter的功能、用法以及与OpenAI的Code Interpreter的比较。

    开篇故事

    想象一下,你正在处理一个庞大的数据集,需要进行数据清理和分析。你不想编写大量的代码,也不想手动进行这些任务,因为这既费时又繁琐。然后,你听说了一种神奇的工具,可以让你用自然语言命令来完成这些任务。你迫不及待地想要尝试一下,看看它是否能够让你的工作事半功倍。这个神奇的工具就是Open Interpreter!

    什么是Open Interpreter?

    Open Interpreter是OpenAI的Code Interpreter的本地开源实现,它让你可以在你的计算机上运行代码。你可以使用自然语言与Open Interpreter进行交互,就像与ChatGPT一样,只需在安装后运行 $ interpreter 即可。Open Interpreter支持多种编程语言,包括Python、JavaScript、Shell等,这意味着你可以使用它执行各种任务,无需编写繁琐的代码。

    如何开始

    使用Open Interpreter非常简单。首先,你需要安装它,只需运行以下命令:

    pip install open-interpreter

    安装完成后,你可以在终端中运行以下命令来启动Open Interpreter:

    interpreter

    这将打开一个ChatGPT-like的界面,你可以在其中使用自然语言命令来与Open Interpreter进行交互。例如,你可以输入以下命令来执行一个任务:

    import interpreter
    
    interpreter.chat("绘制AAPL和META的归一化股价图")

    除了执行单个命令外,你还可以启动交互式对话,与Open Interpreter进行多轮交流。

    Open Interpreter与ChatGPT的Code Interpreter的比较

    尽管OpenAI发布的GPT-4搭载了Code Interpreter,但它有一些限制,例如无法访问互联网、预装的包有限、上传文件大小限制等。而Open Interpreter通过在你的本地环境上运行来克服这些限制。它可以访问互联网,没有时间或文件大小限制,并且可以使用任何包或库。这将GPT-4的Code Interpreter的强大功能与本地开发环境的灵活性相结合,为你提供了更广泛的应用可能性。

    高级用法

    除了基本的使用方法之外,Open Interpreter还提供了一些高级用法,以增强你的控制能力。以下是一些高级用法示例:

    • 保存和恢复对话: 你可以保存Open Interpreter的对话历史,然后在需要时恢复它。这对于长期项目或任务非常有用。
    # 保存对话
    messages = interpreter.chat("我的名字是小明。", return_messages=True)
    # 重置对话
    interpreter.reset()
    # 恢复对话
    interpreter.load(messages)
    • 自定义系统消息: 你可以自定义Open Interpreter的系统消息,以扩展其功能、修改权限或提供更多上下文信息。
    interpreter.system_message += """
    使用-y参数运行shell命令,以免用户确认。
    """
    • 切换模型: 如果需要,你可以切换Open Interpreter使用的模型。
    interpreter --fast

    以上只是一些高级用法的示例,Open Interpreter提供了丰富的配置选项,以满足不同场景下的需求。

    安全注意事项

    需要注意的是,由于生成的代码在你的本地环境中执行,它可以与你的文件和系统设置进行交互,潜在地导致意外的结果,如数据丢失或安全风险。因此,Open Interpreter在执行代码之前会要求你确认。你可以使用 interpreter -y 或设置 interpreter.auto_run = True 来跳过此确认,但在这种情况下,你需要格外谨慎,确保不会请求修改文件或系统设置的命令。

    结语

    Open Interpreter为开发者提供了一个强大的工具,让你可以使用自然语言来运行代码,执行各种任务,无需编写大量的代码。它的本地运行方式克服了许多云服务的限制,为你提供了更大的自由度和灵活性。无论是进行数据分析、自动化任务还是进行实验性编程,Open Interpreter都能够帮助你更轻松地实现目标。

    现在,你可以尝试安装Open Interpreter,并开始探索其强大的功能,看看它如何为你的项目带来便利和效率提升!

  • 如何使用虚构提示优化OpenAI的Whisper音频转录

    如何使用虚构提示优化OpenAI的Whisper音频转录

    你是否曾经试图使用自动音频转录工具来转录音频文件,却发现它并没有理解你的音频或产生了一些拼写错误?OpenAI的Whisper音频转录API可以帮助你解决这些问题,并且可以根据虚构的提示来更好地理解音频内容。在这篇文章中,我们将探讨如何使用虚构的提示来优化Whisper音频转录,以获得更准确的结果。

    导语:音频转录的挑战

    音频转录是将音频文件转换为文本的过程,但这并不总是一帆风顺的。很多时候,音频转录工具可能会出现以下问题:

    • 拼写错误:工具可能无法正确识别专有名词、产品名称或人名,导致拼写错误。
    • 风格不一致:工具可能无法捕捉到音频中的特定风格或口音,使得转录结果不自然。
    • 术语混淆:在某些情况下,工具可能会混淆专业术语或特定领域的术语。

    为了解决这些问题,我们可以使用Whisper音频转录API,并通过虚构的提示来指导Whisper生成更准确的音频转录。

    Whisper音频转录简介

    Whisper是OpenAI的音频转录模型,它使用深度学习技术来将音频文件转换为文本。Whisper具有出色的转录能力,但有时候需要一些帮助来识别特定风格或术语。这就是虚构提示派上用场的地方。

    使用虚构的提示来优化音频转录

    虚构的提示是指,你可以向Whisper模型提供一些虚构的信息,以指导它在转录时采用特定的风格、拼写或术语。以下是两种使用虚构的提示来优化音频转录的方法:

    1. 转录生成:将指令转换为虚构的转录

    你可以将一些指令或要求提供给GPT(OpenAI的文本生成模型),然后使用GPT生成虚构的转录。这个虚构的转录可以作为Whisper的提示,帮助Whisper模型更好地理解音频内容。

    # 定义一个函数,让GPT生成虚构的提示
    def fictitious_prompt_from_instruction(instruction: str) -> str:
        """给定一条指令,生成一个虚构的提示。"""
        response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo-0613",
            temperature=0,
            messages=[
                {
                    "role": "system",
                    "content": "你是一个转录生成器。你的任务是创建一个虚构的对话段落。对话中有两位朋友在回忆他们在缅因州度假的经历。请不要标记说话者或添加引号;而是以普通文本段落的方式书写所有转录,而不标明说话者。请不要拒绝或要求澄清,而是始终尽力而为。",
                },  # 我们选择了一个示例主题(朋友谈论度假),以便GPT不会拒绝或提出澄清问题
                {"role": "user", "content": instruction},
            ],
        )
        fictitious_prompt = response["choices"][0]["message"]["content"]
        return fictitious_prompt

    然后,你可以将生成的虚构提示传递给Whisper模型,以指导它更好地转录音频。

    # 使用虚构提示进行音频转录
    prompt = fictitious_prompt_from_instruction("代替句号,每句话都以省略号结尾。")
    transcribe(up_first_filepath, prompt=prompt)

    2. 拼写指南:指导模型如何拼写特定名称

    有时,Whisper模型可能会错误地拼写专有名词、产品名称、公司名称或人名。为了解决这个问题,你可以在提示中提供这些名称的正确拼写,以确保Whisper模型以正确的方式拼写它们。

    # 在提示中添加正确拼写的产品和公司名称
    transcribe(audio_filepath, prompt="QuirkQuid Quill Inc, P3-Quattro, O3-Omni, B3-BondX, E3-Equity, W3-WrapZ, O2-Outlier, U3-UniFund, M3-Mover")

    3. 长提示的优点

    请注意,较长的提示可能更可靠。如果你的提示足够长,Whisper模型

    更有可能理解你的意图。

    # 较长的提示可能更可靠
    transcribe(up_first_filepath, prompt="我有一些建议要给你。多个句子有助于建立一种模式。你包含的文本越多,模型理解你的模式的可能性就越大。如果你的示例转录看起来好像就在音频文件之前,可能会特别有帮助。在这种情况下,可能意味着提到了我把隐形眼镜放在我的眼睛里。")

    4. 警惕不常见或奇怪的风格

    请注意,当提示很短时,Whisper可能不太可靠,可能无法准确捕捉到所需的风格。

    # 短提示可能不太可靠
    transcribe(up_first_filepath, prompt="总统拜登。")

    5. 风格不常见的提示

    如果你的提示要求Whisper采用不常见的风格,Whisper可能不太可靠。

    # 风格不常见的提示可能不太可靠
    transcribe(up_first_filepath, prompt="""嗨,欢迎来到节目。
    ###
    今天我们非常兴奋。
    ###
    让我们马上开始。
    ###""")

    通过以上方法,你可以根据需要引导Whisper模型,以获得更准确、一致和风格符合预期的音频转录结果。

    Whisper提示与GPT提示的比较

    需要注意的是,Whisper提示与GPT提示不同。如果你提交了一个类似于“在Markdown格式中格式化列表”的尝试性指令,Whisper模型不会执行这个指令,因为它会遵循提示的风格,而不是其中包含的任何指令。

    另外,提示的长度受到限制,只能包含224个标记。如果提示的长度超过224个标记,只有提示的最后224个标记将被考虑;之前的标记将被忽略。

    为了获得最佳结果,请精心制作可以表达你所需风格的示例。

    结论

    使用虚构的提示来优化OpenAI的Whisper音频转录是一个强大的工具,可以帮助你获得更准确、一致和风格符合预期的音频转录结果。无论你是在为广播节目制作转录、记录会议或进行研究,Whisper API都可以成为提高生产力的有力工具。

    现在,尝试使用虚构的提示来优化你的音频转录,看看它如何帮助你获得更好的结果!

  • 如何使用DALL·E API:创建惊艳图像的秘诀

    如何使用DALL·E API:创建惊艳图像的秘诀

    注意:本文将教你如何使用OpenAI的DALL·E图像API,但请确保你已经获得了相应的API访问权限。

    你是否曾经想过能够通过简单的文字描述生成令人惊艳的图像?OpenAI的DALL·E图像API为你提供了这个机会。本文将向你展示如何使用DALL·E API的三个关键端点:生成、编辑和变化,以及一些有用的提示和技巧。

    开场故事

    想象一下,你是一名创意设计师,你的任务是为一家时尚杂志创建独特的封面图像。你需要一种方法来将你的创意快速转化为视觉艺术,而不需要繁琐的图像编辑工作。幸运的是,有一种新颖的技术可以帮助你实现这一目标,那就是使用DALL·E API。在本文中,我们将探讨如何使用这个API来生成、编辑和变换图像,让你的创意得以充分展示。

    准备工作

    在开始之前,你需要完成一些准备工作。

    导入必要的库

    首先,导入你需要的Python库。这些库将帮助你与DALL·E API进行交互,并进行图像处理。

    import openai  # OpenAI Python库,用于进行API调用
    import requests  # 用于下载图像
    import os  # 用于访问文件路径
    from PIL import Image  # 用于显示和编辑图像

    设置API密钥

    在继续之前,确保你已经获取了OpenAI的API密钥,并将其设置为环境变量。你可以在终端中运行以下命令来设置API密钥:

    export OPENAI_API_KEY="你的API密钥"

    设置保存图像的目录

    为了保存生成的图像,创建一个目录,以便后续使用。你可以使用以下代码来创建目录:

    # 设置保存DALL·E图像的目录
    image_dir_name = "images"
    image_dir = os.path.join(os.curdir, image_dir_name)
    
    # 如果目录不存在,则创建它
    if not os.path.isdir(image_dir):
        os.mkdir(image_dir)

    使用DALL·E API

    现在,让我们深入了解如何使用DALL·E API的不同端点来生成、编辑和变换图像。

    生成图像

    生成端点用于根据文本描述生成图像。你只需提供一个文本描述,DALL·E就会尝试创建相应的图像。

    必要输入:

    • prompt(str):对所需图像的文本描述。最大长度为1000个字符。

    可选输入:

    • n(int):要生成的图像数量。必须介于1和10之间,默认为1。
    • size(str):生成图像的尺寸。必须是以下尺寸之一:”256×256″、”512×512″或”1024×1024″。较小的图像生成速度更快,默认为”1024×1024″。
    • response_format(str):生成的图像返回格式。必须是”url”或”b64_json”之一,默认为”url”。
    • user(str):代表你的最终用户的唯一标识符,有助于OpenAI监测和检测滥用。了解更多信息。

    让我们看看如何使用DALL·E API生成图像的示例:

    # 设置文本描述
    prompt = "一个赛博朋克的猴子黑客,梦想着一堆美味的香蕉,数字艺术"
    
    # 调用OpenAI API
    generation_response = openai.Image.create(
        prompt=prompt,
        n=1,
        size="1024x1024",
        response_format="url",
    )
    
    # 打印响应
    print(generation_response)

    上述代码将返回生成的图像的URL。你可以将这个URL用于下载图像,如下所示:

    # 保存图像
    generated_image_name = "生成的图像.png"  # 任何你喜欢的名称,文件类型应为.png
    generated_image_filepath = os.path.join(image_dir, generated_image_name)
    generated_image_url = generation_response["data"][0]["url"]  # 从响应中提取图像URL
    generated_image = requests.get(generated_image_url).content  # 下载图像
    
    with open(generated_image_filepath, "wb") as image_file:
        image_file.write(generated_image)  # 将图像写入文件

    接下来,我们可以使用PIL库来显示生成的图像:

    # 显示生成的图像
    print(generated_image_filepath)
    Image.open(generated_image_filepath)

    变换图像

    变换端点用于生成与输入图像相似的新图像(变体)。

    必要输入:

    • image(str):要用作变体基础的图像。必须是有效的PNG文件,小于4MB,并且是正方形。

    可选输入:

    • n(int):要生成的图像数量。必须介于1和10之间,默认为1。
    • size(str):生成图像的尺寸。必须是以下尺寸之一:”256×256″、”512×512″或”1024×1024″。较小的图像生成速度更快,默认为”1024×1024″。
    • response_format(str):生成的图像返回格式。必须是”url”或”b64_json”之一,默认为”url”。
    • user(str):代表你的最终用户的唯一标识符,

    有助于OpenAI监测和检测滥用。了解更多信息。

    以下是如何生成图像变体的示例:

    # 调用OpenAI API,使用`create_variation`而不是`create`
    variation_response = openai.Image.create_variation(
        image=generated_image,  # 从上面生成的图像获取
        n=2,
        size="1024x1024",
        response_format="url",
    )
    
    # 打印响应
    print(variation_response)

    类似于生成图像,我们可以将变体的URL用于下载图像,如下所示:

    # 保存变体图像
    variation_urls = [datum["url"] for datum in variation_response["data"]]  # 提取URL
    variation_images = [requests.get(url).content for url in variation_urls]  # 下载图像
    variation_image_names = [f"变体图像_{i}.png" for i in range(len(variation_images))]  # 创建名称
    variation_image_filepaths = [os.path.join(image_dir, name) for name in variation_image_names]  # 创建文件路径
    for image, filepath in zip(variation_images, variation_image_filepaths):  # 遍历变体
        with open(filepath, "wb") as image_file:  # 打开文件
            image_file.write(image)  # 将图像写入文件

    接下来,我们可以使用PIL库来显示生成的原始图像和变体图像:

    # 显示原始图像
    print(generated_image_filepath)
    Image.open(generated_image_filepath)
    
    # 显示新的变体图像
    for variation_image_filepaths in variation_image_filepaths:
        print(variation_image_filepaths)
        Image.open(variation_image_filepaths)

    编辑图像

    编辑端点使用DALL·E生成现有图像的指定部分。编辑需要三个输入:要编辑的图像、指定要重新生成的部分的蒙版和描述所需图像的提示。

    必要输入:

    • image(str):要编辑的图像。必须是有效的PNG文件,小于4MB,并且是正方形。
    • mask(str):另一个图像,其完全透明区域(例如,alpha为零的区域)指示图像应该进行编辑。必须是有效的PNG文件,小于4MB,并且与图像具有相同的尺寸。
    • prompt(str):对所需图像的文本描述。最大长度为1000个字符。

    可选输入:

    • n(int):要生成的图像数量。必须介于1和10之间,默认为1。
    • size(str):生成图像的尺寸。必须是以下尺寸之一:”256×256″、”512×512″或”1024×1024″。较小的图像生成速度更快,默认为”1024×1024″。
    • response_format(str):生成的图像返回格式。必须是”url”或”b64_json”之一,默认为”url”。
    • user(str):代表你的最终用户的唯一标识符,有助于OpenAI监测和检测滥用。了解更多信息。

    编辑需要一个“蒙版”,以指定图像的哪个部分需要重新生成。蒙版是一个图像,其中alpha值为0(透明)的任何像素都将重新生成。下面的代码创建一个1024×1024的蒙版,其中底半部分是透明的:

    # 创建一个蒙版
    width = 1024
    height = 1024
    mask = Image.new("RGBA", (width, height), (0, 0, 0, 1))  # 创建一个不透明的图像蒙版
    
    # 将底半部分设置为透明
    for x in range(width):
        for y in range(height // 2, height):  # 仅循环遍历蒙版的底半部分
            # 将alpha(A)设置为零以使像素变为透明
            alpha = 0
            mask.putpixel((x, y), (0, 0, 0, alpha))
    
    # 保存蒙版
    mask_name = "底半部分蒙版.png"
    mask_filepath = os.path.join(image_dir, mask_name)
    mask.save(mask_filepath)

    现在,我们可以使用这个蒙版来编辑图像,生成一些编辑的示例:

    # 编辑图像
    
    # 调用OpenAI API
    edit_response = openai.Image.create_edit(
        image=open(generated_image_filepath, "rb"),  # 来自生成部分的图像
        mask=open(mask_filepath, "rb"),  # 来自上面的蒙版
        prompt=prompt,  # 来自生成部分的文本描述
        n=1,
        size="1024x1024",
        response_format="url",
    )
    
    # 打印响应
    print(edit_response)

    与前面的示例一样,我们可以将编辑的图像的URL用于下载图像,如下所示:

    # 保存图像
    edited_image_name = "编辑后的图像.png"  # 任何你喜欢的名称,文件类型应为.png
    edited_image_filepath = os.path.join(image_dir, edited_image_name)
    edited_image_url = edit_response["data"][0]["url"]  # 从响应中提取图像URL
    edited_image = requests.get(edited_image_url).content  # 下载图像
    
    with open(edited_image_filepath, "wb") as image_file:
        image_file.write(edited_image)  # 将图像写入文件

    现在,我们可以使用PIL库来显示原始图像和编辑后的图像:

    # 显示原始图像
    print(generated_image_filepath)
    Image.open(generated_image_filepath)
    
    # 显示编辑后的图像
    print(edited_image_filepath)
    Image.open(edited_image_filepath)

    小贴士

    在使用DALL·E API时,以下是一些有用的小贴士:

    • 尝试不同的文本描述:通过尝试不同的文本描述来获得不同风格和主题的图像。
    • **实验编辑

    **:尝试使用不同的蒙版和文本描述来编辑图像,以获得不同的效果。

    • 注意图像尺寸:选择适合你项目需要的图像尺寸,较小的图像生成速度更快。
    • 保留API密钥安全:确保不分享你的API密钥,以防止滥用。

    现在,你已经了解如何使用DALL·E API生成、编辑和变换图像,你可以尝试将这些技巧应用到你的创意项目中,为你的设计工作增添一些魔法。

    结论

    DALL·E API为创意设计师和艺术家提供了一个令人兴奋的机会,可以通过简单的文本描述来生成、编辑和变换惊艳的图像。无论你是在制作杂志封面、广告宣传、艺术作品还是任何其他创意项目,DALL·E API都可以成为你的得力助手。

    现在,赶快尝试一下这个令人着迷的技术,看看它如何为你的创意世界带来新的可能性!

  • 使用InstructPix2Pix学习图像编辑指令:创造性地编辑您的图像

    使用InstructPix2Pix学习图像编辑指令:创造性地编辑您的图像

    想象一下,您正在处理一张普通的照片,但您有一些特殊的编辑要求。您想把照片中的一位朋友变成一个机械人,或者将照片中的场景转换成一个未来的科幻世界。通常情况下,您可能需要具备高超的图像编辑技能或使用复杂的图像编辑软件才能实现这些效果。但是,现在有一种神奇的工具,叫做InstructPix2Pix,它可以帮助您通过简单的文字指令来完成这些图像编辑。

    InstructPix2Pix是一种基于指令的图像编辑模型,它可以根据您提供的文字指令来编辑图像。这意味着您只需要写下您想要的编辑指令,然后让InstructPix2Pix来实现它。无需复杂的图像编辑软件,无需专业的技能,只需文字即可完成创造性的图像编辑。

    在本文中,我们将向您介绍如何使用InstructPix2Pix,以及如何配置和运行它。您将学会如何将自己的照片转化为艺术品,以及如何发挥创造力,使您的图像编辑成为现实。

    步骤1:设置环境

    首先,让我们准备好使用InstructPix2Pix的环境。以下是一些步骤:

    1. 安装依赖项:为了运行InstructPix2Pix,您需要创建一个虚拟环境,并安装所需的依赖项。您可以使用conda来管理环境,以下是一些命令:
    conda env create -f environment.yaml
    conda activate ip2p
    1. 下载预训练模型:接下来,您需要下载预训练的InstructPix2Pix模型。运行以下命令:
    bash scripts/download_checkpoints.sh

    步骤2:编辑图像

    现在,您已经设置好了环境并下载了模型,让我们开始编辑您的图像。以下是一个简单的示例,演示如何使用InstructPix2Pix来编辑一张照片:

    python edit_cli.py --input imgs/example.jpg --output imgs/output.jpg --edit "将他变成一个机器人"

    在这个示例中,我们使用了edit_cli.py脚本来编辑一张名为example.jpg的照片。编辑的指令是”将他变成一个机器人”。您可以根据自己的需求更改输入图片和编辑指令。

    步骤3:高级编辑

    如果您想要更进一步的编辑,您可以使用一些高级参数来调整结果。以下是一些示例:

    python edit_cli.py --steps 100 --resolution 512 --seed 1371 --cfg-text 7.5 --cfg-image 1.2 --input imgs/example.jpg --output imgs/output.jpg --edit "将他变成一个机器人"

    在这个示例中,我们指定了编辑的步数(--steps)、分辨率(--resolution)、随机种子(--seed)以及文本和图像的权重(--cfg-text和--cfg-image)。这些参数允许您更精细地控制编辑的效果。

    步骤4:交互式编辑

    除了命令行方式,您还可以启动一个交互式的图像编辑应用程序。运行以下命令:

    python edit_app.py

    这将启动一个交互式的编辑界面,您可以在其中加载图像并编写编辑指令。这是一个更直观和有趣的方式来编辑图像。

    配置和训练InstructPix2Pix

    如果您想深入了解InstructPix2Pix的配置和训练过程,以下是一些步骤:

    1. 下载Stable Diffusion模型:InstructPix2Pix是基于Stable Diffusion模型进行微调的。您需要下载Stable Diffusion模型的检查点。运行以下命令:
    bash scripts/download_pretrained_sd.sh
    1. 配置训练参数:接下来,您需要配置训练参数。如果您要使用我们提供的数据集,可以跳过这一步。否则,您需要编辑配置文件configs/train.yaml,以指定您的数据集路径。

    2. 启动训练:最后,运行以下命令来开始训练:

    python main.py --name default --base configs/train.yaml --train --gpus 0,1,2,3,4,5,6,7

    创建自己的数据集

    如果您希望创建自己的数据集以进行训练,以下是一些步骤:

    1. 生成文本数据集:首先,您需要创建一个包含编辑指令和图像描述的文本数据集。您可以手动编写这些数据,确保它们涵盖了各种不同的编辑情况。

    2. 微调GPT-3:接下来,您需要微调一个大型语言模型,如GPT-3,以生成编辑指令和编辑后的图像描述。这需要访问OpenAI的API,并设置API密钥。

    3. 生成图像数据集:最后,您需要将文本数据集转化为图像数据集。这可以通过使用Stable Diffusion模型来实现。

    结论

    InstructPix2Pix是一个令人兴奋的工具,它使图像编辑变得更加创造性和容易。无论您是想将朋友变成机器人,

    还是创造未来科幻世界的场景,InstructPix2Pix都可以帮助您实现您的创意。不需要复杂的技能,只需一些文字指令和一张照片,您就可以创造出惊人的图像。

    现在,尽情释放您的创造力,让InstructPix2Pix成为您的图像编辑助手吧!

  • 如何设置命令行参数和环境变量来优化stable diffusion webui

    如何设置命令行参数和环境变量来优化stable diffusion webui

    你是否曾经想过如何在使用stable diffusion WebUI 时进行自定义设置以优化性能?或者你可能只是想知道如何在不同的硬件配置下运行它?无论你的需求是什么,这篇文章将为你提供有关如何设置命令行参数和环境变量的详细信息,以使stable diffusion WebUI 在你的系统上运行得更加高效。

    简介

    stable diffusion WebUI 是一个功能强大的工具,用于生成图像和处理图像。然而,在不同的硬件和使用场景下,你可能需要对其进行一些自定义设置,以满足你的需求并提高性能。本文将介绍如何使用命令行参数和环境变量来配置stable diffusion WebUI ,以及一些常见的设置选项。

    命令行参数

    命令行参数是在运行stable diffusion WebUI 时可以指定的选项,它们可以用来配置不同的功能和行为。以下是一些常见的命令行参数以及它们的描述:

    配置文件路径

    • --config CONFIG:指定配置文件的路径,该文件用于构建模型。默认路径是configs/stable-diffusion/v1-inference.yaml。

    检查点路径

    • --ckpt CKPT:指定稳定扩散模型的检查点文件路径。如果提供了此选项,将加载指定的检查点。

    • --ckpt-dir CKPT_DIR:指定稳定扩散检查点文件所在的目录路径。这可以让你在多个检查点之间进行切换。

    硬件配置

    • --use-cpu {all, sd, interrogate, gfpgan, bsrgan, esrgan, scunet, codeformer}:选择在哪些模块中使用CPU作为计算设备。例如,--use-cpu all 将在所有模块中使用CPU。

    • --precision {full,autocast}:设置评估精度,可以选择完全精确或自动转换。自动转换可以提高性能。

    • --no-half:禁用模型切换到16位浮点数。

    性能优化

    • --medvram:启用稳定扩散模型的优化,以牺牲一些性能以获得低VRAM使用。

    • --lowvram:启用稳定扩散模型的优化,以牺牲速度以获得非常低的VRAM使用。

    • --opt-sdp-attention:启用缩放点积交叉注意层优化,需要PyTorch 2.*。

    更多选项

    • --allow-code:允许从WebUI执行自定义脚本,这可以用于自定义图像生成过程。

    • --share:使用此选项以在Gradio上运行WebUI,并通过共享链接访问。这在Colab等在线平台上非常有用。

    • --listen:使服务器监听网络连接,允许局域网上的计算机访问UI。

    这些只是一些常见的命令行参数选项,你可以根据你的需求进一步探索其他选项。

    环境变量

    除了命令行参数,你还可以使用环境变量来配置stable diffusion WebUI 。以下是一些常见的环境变量以及它们的描述:

    • PYTHON:设置自定义Python可执行文件的路径。

    • VENV_DIR:指定虚拟环境的路径。默认是venv。

    • CUDA_VISIBLE_DEVICES:选择在具有多个GPU的系统上要使用的GPU。例如,CUDA_VISIBLE_DEVICES=0将使用第一个GPU。

    • SD_WEBUI_LOG_LEVEL:设置日志的详细程度,支持Python内置日志模块支持的任何有效日志级别。

    • SD_WEBUI_CACHE_FILE:设置缓存文件的路径,用于存储一些临时数据。

    这些环境变量可以在启动stable diffusion WebUI 之前设置,以自定义其行为和性能。

    示例

    以下是一个示例,展示如何在启动stable diffusion WebUI 时使用命令行参数和环境变量来配置硬件和性能选项:

    # 使用CPU进行推理,启用性能优化
    python launch.py --use-cpu all --precision full --medvram
    
    # 使用特定的GPU进行推理
    export CUDA_VISIBLE_DEVICES=1
    python launch.py
    
    # 设置日志级别为DEBUG
    export SD_WEBUI_LOG_LEVEL=DEBUG
    python launch.py

    通过这些示例,你可以根据自己的需求自定义stable diffusion WebUI的配置。

    结论

    通过使用命令行参数和环境变量,你可以轻松地stable diffusion WebUI的配置,以满足你的需求并提高性能。无论你是在本地运行还是在云平台上使用,这些选项都可以帮助你更好地掌握stable diffusion WebUI 的功能。

    希望这篇文章对你有所帮助,让你更好地利用stable diffusion WebUI 的强大功能。

  • 如何优化Stable Diffusion WebUI以提高性能和内存利用率

    如何优化Stable Diffusion WebUI以提高性能和内存利用率

    在使用Stable Diffusion WebUI生成图像时,你可能会遇到性能不佳或内存占用过高的问题。本教程将介绍一些命令行参数和优化选项,以帮助你提高性能,同时降低内存使用。

    优化选项总览

    以下是一些可用的优化选项和它们的说明:

    命令行参数/优化选项 说明
    –opt-sdp-attention 在某些系统上可能提高速度,但需要更多VRAM。
    –opt-sdp-no-mem-attention 与上一个选项类似,但更可靠,性能稍差。
    –xformers 启用xFormers库,显著降低内存消耗和提高速度,仅支持Nvidia GPU。
    –force-enable-xformers 强制启用xFormers,不考虑系统支持情况,潜在不稳定。
    –opt-split-attention 交叉注意力层优化,显著减少内存使用,几乎没有性能损失。
    –disable-opt-split-attention 禁用上述优化。
    –opt-sub-quad-attention 子二次注意力,内存高效的交叉注意力层优化,可显著降低内存使用。
    –opt-split-attention-v1 使用较旧版本的交叉注意力优化,内存占用较低,但对生成较大图像有限制。
    –medvram 减少Stable Diffusion模型的VRAM使用,性能略有下降,适用于节省VRAM。
    –lowvram 更彻底的优化,分割unet模块以降低VRAM占用,性能显著下降,但节省内存。
    –do-not-batch-cond-uncond 禁止批处理正面和负面提示,节省内存,性能下降(仅1.6.0之前版本)。
    –always-batch-cond-uncond 禁用上述优化(仅1.6.0之前版本)。
    –opt-channelslast 更改Stable Diffusion的内存类型,效果未详细研究。
    –upcast-sampling 对通常需要--no-half参数的Nvidia和AMD卡启用,提高生成速度。

    优化性能与内存占用测试

    下表展示了不同优化选项在特定硬件和配置下的性能和内存占用情况。请注意,实际性能可能因硬件和配置而异。

    优化选项 内存占用(批量大小1/2/4/8/16) 初始迭代速度 峰值迭代速度 备注
    None 4.1 / 6.2 / OOM / OOM / OOM 4.2 4.6 性能较慢,容易内存不足
    v1 2.8 / 2.8 / 2.8 / 3.1 / 4.1 4.1 4.7 性能较慢,内存占用最低,不需要xFormers
    InvokeAI 3.1 / 4.2 / 6.3 / 6.6 / 7.0 5.5 6.6 与默认优化器几乎相同
    Doggetx (默认) 3.1 / 4.2 / 6.3 / 6.6 / 7.1 5.4 6.6 默认优化器
    Doggetx (medvram) 2.2 / 2.7 / 3.8 / 5.9 / 6.2 4.1 6.3 使用medvram预设可节省内存但性能尚可
    Doggetx (lowvram) 0.9 / 1.1 / 2.2 / 4.3 / 6.4 1.0 6.3 使用lowvram预设性能极低,但内存节省较多
    xFormers 2.8 / 2.8 / 2.8 / 3.1 / 4.1 6.5 7.5 性能快,内存占用低(需要启用xFormers)
    xFormers (channelslast) 2.9 / 2.9 / 2.9 / 3.6 / 4.1 6.4 7.6 使用cuda_alloc_conf和opt-channelslast

    请注意,性能在批量大小为1时约为峰值性能的70%左右,峰值性能通常在批量大小为8左右。性能在较大批量大小下可能会有所提高,但也可能因内存占用增加而下降。

    额外优化提示(Windows)

    • 禁用硬件GPU调度。
    • 禁用浏览器硬件加速。
    • 在Nvidia控制面板中,将电源配置更改为“最大性能”。

    结论

    通过选择合适的优化选项,你可以在Stable Diffusion WebUI中提高性能并降低内存占用。请根据你的硬件和需求进行测试和优化,以获得最佳结果。

    注意:本教程中的性能数据基于特定硬件和配置,实际结果可能会有所不同。请根据你的系统进行优化和测试。