巧用阿里云百炼自定义插件:一键生成小红书风格图文并茂文章

还在愁小红书文案?教你用阿里云百炼自定义插件,输入标题,一键生成图文并茂的小红书爆款文章!

原文标题:用自定义插件生成一篇图文并茂的文章

原文作者:阿里云开发者

冷月清谈:

本文介绍了如何利用阿里云百炼平台,通过自定义插件和工作流,实现一键生成小红书风格的图文并茂文章。文章详细讲解了工作流的搭建步骤,包括使用大模型生成文章、提取关键元素生成图像提示词、利用自定义插件进行文生图、以及整合文本与图像。此外,还提供了一种图文混排的解决方案,通过将文章按段落拆分,并为每个段落生成对应的图片,实现更丰富的展示效果。通过学习本文,读者可以掌握如何利用阿里云百炼平台和自定义插件,快速生成高质量的图文内容,提升内容创作效率。

怜星夜思:

1、在利用大模型生成文章时,如何更好地控制生成内容的风格和质量,避免出现内容不符合预期的情况?
2、文章中提到的图文混排方案,将文章按段落拆分后分别生成图片,这种方式在实际应用中可能会遇到哪些挑战?
3、自定义插件在整个工作流中扮演了什么角色?除了文生图,自定义插件还可以用来实现哪些有趣的功能?

原文内容

阿里妹导读


本文是《5步教你创建大模型自定义插件》的下篇,主要就已有的自定义插件中的生图能力为例,演示如何生成一个图文并茂的文章。


引言

不了解自定义插件或者没看过上一篇文章的同学,请自觉复习!

好,今天我们就已有的自定义插件中的生图能力为例,生成一个图文并茂的文章?

一、先来说实现思路

希望呈现的效果:只需输入一个标题,就可以生成一篇有小红书风格的文字,也有配图的文章。

1、利用大模型生成文章根据用户输入的内容生成相应文章。

2、提取关键元素生成图像提示词抽取前述大模型生成文章中的关键信息,用于生成文生图插件所需的提示词。

3、结合自定义插件进行文生图在工作流里引入之前自定义的文生图插件以生成图片。

4、整合文本与图像把文章和图片整合进一个文本后输出给用户。

先看下最终成果,是一个大串行的工作流!开始-大模型-大模型-脚本转换-插件-脚本转换-插件-脚本转换-结束。

不是所有的自定义插件都需要这么多脚本,因为我们示例的自定义生图插件是2阶段的,所以脚本转换节点多了点。

二、开始搭工作流

登录阿里云搜索百炼或copy以下网址:https://bailian.console.aliyun.com/#/home我的应用-新增应用-创建对话型工作流。

1、拖入一个大模型的节点,用来生成小红书风格的文章

注意哦,先连线,再编辑每拖入一个节点,都先和前面的节点连线,下文也如此,不重复强调了。

大模型节点配置:

  • 模式选择:单次处理模式

  • 模型:通义千问-Max-Latest

  • 参数配置: 最长回复长度可以稍微调高一点,默认1024,开启搜索。其他保持不变。

  • System Prompt:可以直接copy下面这个简单的提示词示例 ,也可以自己写哈!

  • User Prompt:可以直接引用输入的query。

# 角色
你是一位小红书文章创作专家,擅长根据用户输入的内容生成高质量的小红书文章。
## 技能
### 技能1:内容理解与提炼
- 深入理解用户提供的内容,提炼出核心信息和关键点。
- 通过分析用户需求,确定文章的主题和方向。
### 技能2:撰写吸引人的标题
- 创作简洁、有吸引力且符合小红书风格的标题。
- 确保标题能够激发读者的兴趣,提高点击率。
### 技能3:内容创作与编辑
- 根据用户提供的内容,撰写详细且有趣的文章正文。
- 使用小红书流行语境和热点话题,增加文章的共鸣度和传播性。
- 保持文章内容的连贯性和可读性,避免冗长和复杂。
### 技能4:SEO优化
- 了解并运用小红书平台的搜索排名机制,合理嵌入关键词以提高文章的可发现性。
- 选择合适的关键词,帮助文章在搜索结果中获得更高的排名。
### 抗能5:图片和排版建议
- 提供关于图片选择和排版的建议,确保文章视觉效果良好。
- 建议使用高质量的图片和适当的排版,提升文章的整体质量。
## 限制
- 保持文章内容的真实性和实用性,避免出现虚假或误导用户的信息。
- 注意敏感信息的筛选和防范,并保持文案的健康正向导向。
- 文章长度应适中,通常不超过800字。
- 避免过度堆砌关键词,保持文章的自然流畅性。
- 所有内容必须符合小红书社区规范和政策。

安利一下,如果不知道Prompt怎么写好,可以用Prompt自动优化来生成。本文中的prompt都是自动优化来的。

2、根据文章内容,生成文生图插件需要的提示词

通过生成小红书文章大模型生成的内容生成文生图插件需要的提示词

大模型节点配置:

  • 模型可以选择通义千问-max或latest

  • 模型设置可以选择默认

  • System Prompt:可以直接copy下面的提示词

  • User Prompt:可以选择引用上文的文章内容。

## 角色
你是一位专业的文章创意插图设计师,擅长根据文章内容生成高质量的图片提示词,包括正向提示词和负向提示词。

任务要求

任务要求1:图片风格适用于营销和宣传 

任务要求2:需要文章内容设计一套适合其风格与用途的图片生成提示词。

具体来说
 1. 正向提示词应明确描述出希望在最终图像中看到的所有关键元素、色彩搭配以及整体氛围。
 2. 负向提示词则需指出不希望出现在图像中的任何元素或风格,以避免不符合预期的设计出现。 

输出示例

参照以下示例的格式输出
{
    “prompt”:“正向提示词”,
    “negative_prompt”:“反向提示词”
}

限制

  • 生成的插图提示词必须与用户提供的内容紧密相关。
  • 提示词应尽量详细,但避免过于冗长,保持简洁明了。
  • 如果用户提供的查询不明确,需要通过提问来获取更多信息,而不是猜测用户的需求。
  • 提示词应包括场景、角色、色彩、风格等关键元素,以确保插图师能够准确理解并创作。
  • 关键词使用逗号分隔,分别生成两种提示词,
  • 正向提示词:描述画面的提示词信息,必须包含用户输入内容的核心内容的提示词,长度不超过500个字符,
  • 反向提示词:画面中不想出现的内容描述词信息,长度不超过500个字符。
3、新增一个脚本节点,对提示词内容做一些处理

脚本详情:

  • 输入: result → 引用 → 上游生成提示词的大模型节点的result

  • 输入参数:多余的参数删掉

    • input → Object → 描述可不填

    • parameters → Object → 描述可不填

  • 代码如下:选择 全屏编辑后直接贴下面的python代码

def main():
  import json
  json_obj = json.loads(params["result"])
  prompt = json_obj.get("prompt", "")
  negative_prompt = json_obj.get("negative_prompt", "")
  ret = {        
    "result": {            
      "input": {
        "prompt": prompt,            
        "negative_prompt": negative_prompt+",模糊扭曲的中文、英文"
      },            
      "parameters" :{
        "size": "1024*1024",
        "n": 4
      }       
    },    
  }
  return ret
4、拖入自定义插件,选择之前自定义的插件的生图工具

如果你学了上一篇自定义插件的文章,就知道自定义插件里有2个工具,我们选择其中 生图的这个工具。

自定义插件配置如下:

  • model → 输入 → wanx2.1-t2i-turbo

  • input → 引用 → 选择上游脚本转换节点中result下的input变量

  • parameters → 引用 → 选择上游脚本转换节点中result下的parameters变量

5、再次使用脚本节点来等待生图任务的完成

这里我们设置等待20秒,如果超过20秒则生成失败。

  • 输入:清空

  • 输出:保留result 即可

  • 代码:直接复制粘贴代码即可

def main(): 
  import time
  time.sleep(20)
  ret = {        
    "result": {}
  }    
  return ret
6、再次通过自定义插件的另一个工具,来查询文生图的结果

配置详情:

输入 : 选择文成图插件中的task_id

7、拖入最后一个脚本转换节点做图片拼接

由于生成的图片是一个链接数组,无法直接在MarkDown当中显示,我们需要通过脚本,将图片拼接为MarkDown格式的文本。

配置如下:

  • 输入:urlList → 引用 → 选择上游查询文生图结果插件节点中result→url

  • 输出:retString → String 

  • 代码:直接复制粘贴代码即可

def main():
    url_list = params["urlList"]
    ret_string = ""

    for url_data in url_list:
        if url_data is not None:
            ret_string += f"{url_data}\n"
    ret = {
        “result”: {
            “retString”: ret_string
        }
    }
    return ret

8、结束节点,图文整合

三、测试

输入关键词或者文章标题,等待一下,文章和配图就生成好了!


四、引申-如何实现图文混合的形式

目前我们在生成文章与图片时,图片只能展示在文章下方,这显得有些单一。那么,有没有办法实现一段文字搭配一张图片的图文混排效果呢?下面我将提供一种解决方案供大家参考。

在生成文章时,例如长篇文本会包含多个段落。这时,我们可以在设置大模型生成文章时,将整篇文章按段落拆分开来。针对每个段落,分别设置对应的大模型生成文生图的提示词,再根据提示词生成与该段落相匹配的图片。由于整个流程较为复杂,且文章长度有限,我仅把关键步骤列出如下:

1、复制刚刚的项目

2、我们完善一下生成 生成小红书文章 大模型的提示词

让生成的内容多一些,方便进行段落拆分。

3、专门用一个大模型对生成的文章进行段落拆分

上述内容对应的提示词

你是一个文章段落拆分助手,请根据用户输入的文章,将内容拆分为一个标题,加二个段落
输出内容为JSON纯文本,不要输出其他内容,JSON格式如下
{
     "title":"标题",
     "first_paragraph":"第一段文章",
     "second_paragraph":"第二段文章"
}
4、通过脚本将上述对应的JSON进行格式转换

def main():
  import json
  json_obj = json.loads(params["result"])
  title = json_obj.get("title", "")
  first_paragraph = json_obj.get("first_paragraph", "")
  second_paragraph = json_obj.get("second_paragraph", "")
  ret = {        
    "result": {            
      "title": title,
      "first_paragraph": first_paragraph,
      "second_paragraph": second_paragraph
    },    
  }
  return ret
5、完善一下对应生成提示词的大模型

# 角色
你是一位创意插图设计师和文章段落拆分师,擅长根据用户的需求生成高质量的插图提示词。请更具用户提供的三个段落 ${Script_McjO.result}  内容来生成对应的提示词
## 技能
### 技能 1: 生成插图提示词
- 理解用户提供的内容
- 根据内容,生成详细的插图提示词,确保这些提示词能够准确传达用户的意图和需求。
- 提示词应包含场景、角色、色彩、风格等细节,以便插图师能够清晰地理解和创作。
### 技能 2: 优化插图提示词
- 如果用户提供的查询不够详细或模糊,你需要进一步询问用户以获取更多细节。
- 根据用户的反馈,调整和优化插图提示词,使其更加具体和明确。
### 技能 3: 多样化风格支持
- 能够生成不同风格的插图提示词,例如卡通、写实、抽象等。
- 根据用户的需求,选择最适合的风格,并在提示词中明确说明。
## 限制
- 生成的插图提示词必须与用户提供的内容紧密相关。
- 提示词应尽量详细,但避免过于冗长,保持简洁明了。
- 如果用户提供的查询不明确,需要通过提问来获取更多信息,而不是猜测用户的需求。
- 提示词应包括场景、角色、色彩、风格等关键元素,以确保插图师能够准确理解并创作。
- 
关键词使用逗号分隔,分别生成两种提示词,
正向提示词:描述画面的提示词信息,必须包含用户输入内容的核心内容的提示词,长度不超过500个字符,
反向提示词:画面中不想出现的内容描述词信息,长度不超过500个字符。
输出JSON格式的内容,只能输出JSON格式的纯文本信息,不要输出其他内容
 格式如下:
{
     "first_prompt":"第一段落first_paragraph对应正向提示词".
     "first_negative_prompt":"第一段落first_paragraph对应反向提示词",
     "second_prompt":"第二段落first_paragraph对应正向提示词".
     "second_negative_prompt":"第二段落first_paragraph对应反向提示词"
}
6、通过脚本对大模型生成的JSON进行格式化

def main():
  import json
  json_obj = json.loads(params["result"])
  first_prompt = json_obj.get("first_prompt", "")
  first_negative_prompt = json_obj.get("first_negative_prompt", "")
  second_prompt = json_obj.get("second_prompt", "")
  second_negative_prompt = json_obj.get("second_negative_prompt", "")
  ret = {
    "result": {
      "first_input": {
        "prompt": first_prompt,
        "negative_prompt": first_negative_prompt,
      },
      "second_input": {
        "prompt": second_prompt,
        "negative_prompt": second_negative_prompt,
      },
      "parameters" :{
        "size": "1024*1024",
        "n": 1
      }
    },    
  }
  return ret
7、将之前的文生图逻辑复制2份,并且与上面的JSON参数对应上

依次配置即可

8、最后将所有内容拼接起来输出


除了Prompt,还可以考虑使用一些后处理的手段。比如,先让大模型生成多篇文章,然后用另一个模型对这些文章进行评估和筛选,选择质量最高的。或者,人工对生成的文章进行编辑和修改,使其更符合预期。当然,这会增加一些工作量,但可以有效提高文章的质量。

我觉得最大的挑战是图片和段落内容的相关性。如果图片和段落内容不匹配,会影响文章的阅读体验。需要确保生成的图片能够准确反映段落的主题和内容,这需要对Prompt进行精细的设计。

我觉得自定义插件最大的价值在于它的灵活性。它可以让我们根据自己的需求,定制各种AI工具,而不需要从头开始开发。这大大降低了AI应用开发的门槛,让更多人可以参与到AI创新中来。

从商业角度来看,自定义插件可以帮助我们快速构建差异化的AI应用。比如,可以做一个针对特定行业的文章生成插件,或者一个具有独特风格的图像生成插件,从而在市场上获得竞争优势。

另外一个挑战是图片风格的统一性。如果每个段落生成的图片风格差异很大,会显得文章不够协调。可以尝试使用一些风格控制的手段,比如在Prompt中明确指定图片风格,或者使用一些图像处理工具对生成的图片进行风格统一。

这个问题问得好!我觉得Prompt工程非常关键。 Prompt写得越清晰、越具体,模型就越能理解你的意图。可以尝试更详细的角色设定、更明确的技能描述、更严格的限制条件,甚至可以提供一些示例文章供模型参考。另外,多用Prompt优化工具,不断迭代,找到最合适的Prompt。

从技术角度来说,可以尝试Fine-tuning。如果对生成文章的风格有特殊要求,可以收集一批符合要求的文章,用这些文章来Fine-tuning大模型,让模型更好地学习这种风格。不过,Fine-tuning需要一定的技术基础和算力支持。

自定义插件就像乐高积木,可以把各种AI能力组装起来,实现各种奇思妙想。这篇文章里,自定义插件主要负责文生图,但它的潜力远不止于此。比如,可以做一个情感分析插件,分析文章的情感倾向;或者做一个关键词提取插件,自动提取文章的关键词。

从工程角度来说,这种方案会增加工作流的复杂度。需要更多的计算资源和时间来生成图片。可以考虑使用一些并行处理的技术,比如同时生成多个段落的图片,以提高效率。