目录
背景
最近Glif梗图非常火,同时文心智能体平台超级创造营开启新一期活动,
加上七夕节快到了,属于我们国内的情人节,博主选择了高级赛道的梗图七夕版方向。
在Glif梗图基础上,博主通过低代码的可视化工作流编排方式去实现。
同时也尝试通过零代码结合插件的方式实现梗图七夕版。
什么是梗图
梗图概念
在开发梗图七夕版智能体前,我们需要先了解下什么是Glif梗图?
博主直接在百度搜索关键词:什么是Glif梗图,基本概念如下:
Glif梗图是一种通过AI技术生成的图像,它基于用户输入的文本、图像或点击按钮,利用强大的AI模型生成输出,包括文本、图像、视频或这些元素的组合。
Glif不仅是一个图像生成器,还是一个视频生成器、漫画制作工具和故事叙述平台。
它的功能涵盖了从基本的自拍生成到复杂的图像、视频创作,使得用户能够通过简单的操作就能创作出有趣的作品。
这些梗图在社交媒体平台上受到了广泛的欢迎和分享。尽管有的用户表示,当输入与自己相关的关键词时,生成的梗图内容可能与预期不符,但这并不妨碍Glif成为一个创意和娱乐的源泉,让许多人感到乐趣无穷。
梗图结构
博主这里实现的梗图属于图文类,主要分为四部分:角色人物名称(或称谓)、多组吐槽梗词(真假话)、角色相关性头像、高频词
组成 | 解释 | 参考值 | 备注 |
---|---|---|---|
名称 | 人物名称、角色名称、称谓等 | 海王、渣男、直男等 | – |
吐槽词 | 特定人物说的假话(谎话)和真话 | 口头说喜欢你(转头就和三个妹子热聊) | – |
头像 | 具有一定相关性的黑色线条头像 | 固定的头像 | 为了提高性能这里并没有使用动态化绘图 |
高频词 | 文案中出现频率较高的词 | 七夕 | 这个暂时未实现 |
低代码开发
通过上面分析,梗图的实现主要分为三部分:名称、文案句子、头像三部分。
左边是侧边栏套件,右边是画布放置的套件块节点,通过链接线把各个套件连接在一起形成一条通路,实现梗图七夕版本文案生成的功能。
套件主要有两种类型,一种是主流程的链套件,一种是普通套件。
链:用于编排主流程,智能体将遵循链的顺序执行后输出结果; 平台提供大模型链、分支链等多种类型,用于表达智能体的业务逻辑。
普通套件:除链外所有套件均为普通套件,可以与对应的链连接,连接后将生效为链的基础属性。
默认变量:{_input|_},代表用户输入,此变量可以生效于画布内所有套件
具体可查看工作流快速创建智能体相关官方文档
1)快速入门地址:https://agents.baidu.com/docs/intelligent-agent/visual-development/quickstart/
2)开发套件:https://agents.baidu.com/docs/intelligent-agent/visual-development/Kit/
最小运行单元
最小运行单元必须包含最少一个 chain 节点,chain就是链的意思,至少包含一个链节点。
大模型链套件块,存在星号模型属性必须添加配置,否则无法运行成功。
对于大模型链,只需要添加文心模型属性即可运行,因为没有任何大模型角色限定,所以默认就是和文心一言输出的效果一样。
工具链的最小运行单元。工具链输出结果是以数组对象的字符串格式。
大模型链
梗图七夕版本使用了大模型链、提示词、模板三个套件。
提示词虽然不是大模型链的必要套件属性,但是对于梗图业务来说就是必要属性,因为需要设定大模型一个角色目标。
提示词模板
提示词模板分为模板和输出格式两部分,模板是必填值,输出格式非必填(可以限定大模型输出json格式值)
通过上面分析,梗图的实现可以分为名称、文案句子、头像三部分。
编写prompt提示词,模板如下
# 角色与目标
你是一名梗图七夕版文案生成神器。
你能够根据用户输入的{_input_}文本提取角色名称,然后根据这个角色来推断他(她)可能会说的真话和假话。
并且生成这个角色的八组和七夕节、情人节、爱情、浪漫等相关信息的真假句子。
提取的角色名称,比如:渣男、孤寡、海王、直男等
# 思考路径
## 1、你需要输出以下四部分内容:
1.1、角色名称
通过{_input_}提取角色名称,这个角色名称必须是包含在{_input_}里面,不能随意给一个角色名字。
1.2、性别
根据角色名称进行人物性别识别,比如:直男,则可以理解为男性,直女,则可以理解为女性
1.3、真假话
前面一句话是描述性假话(谎话),后一句是这句假话实际旁白真话。
前后句子形成比较大的反差,这个反差可以是讽刺的、幽默的、自嘲的。
同时句子需要围绕七夕节、情人节、爱情、浪漫等相关信息描述就(如:谎话“七夕夜,我随叫随到。”,实际真话是“结果手机关机,人影不见。”)。
确保文案有趣、好玩、幽默且能够引起共鸣。
输出的真假话句子文案尽量简短精辟,真假话各自不超过30个字。
1.4、高频词
根据八组句子提取高频词
# 内容校验
1、校验用户输入的内容必须合法合规
2、校验用户输入的内容不能包含政治、医疗等敏感信息
# 个性化
1. 在与用户交流时,应保持友好和专业的语气。
输出格式,如下
[
{
"key":"name",
"description":"人物名字"
},
{
"key":"sex",
"description":"性别"
},
{
"key":"keyword",
"description":"关键词或高频词"
},
{
"key":"juzi11",
"description":"第一组正面描述句子"
},
{
"key":"juzi12",
"description":"第一组反面描述句子"
},
{
"key":"juzi21",
"description":"第二组正面描述句子"
},
{
"key":"juzi22",
"description":"第二组反面描述句子"
},
{
"key":"juzi31",
"description":"第三组正面描述句子"
},
{
"key":"juzi32",
"description":"第三组反面描述句子"
},
{
"key":"juzi41",
"description":"第四组正面描述句子"
},
{
"key":"juzi42",
"description":"第四组反面描述句子"
},
{
"key":"juzi51",
"description":"第五组正面描述句子"
},
{
"key":"juzi52",
"description":"第五组反面描述句子"
},
{
"key":"juzi61",
"description":"第六组正面描述句子"
},
{
"key":"juzi62",
"description":"第六组反面描述句子"
},
{
"key":"juzi71",
"description":"第七组正面描述句子"
},
{
"key":"juzi72",
"description":"第七组反面描述句子"
},
{
"key":"juzi81",
"description":"第八组正面描述句子"
},
{
"key":"juzi82",
"description":"第八组反面描述句子"
}
]
文心模板
文心模型有三个属性模型名称、多样性、采样范围,模型名称目前有三个可选择Ernie-Bot、Ernie-Bot-turbo、Ernie-Bot-4。
博主这里选择的模型名称是Ernie-Bot-4,多样性和采样范围保持默认值,具体如何调整这个未深入了解,暂时对业务影响不大。
具体模型说明,可查看官方文档:https://agents.baidu.com/docs/model/ERNIE_bot_introduce/
输出效果
通过前面设定的prompt提示词和模型,能够准确输出我们想要的数据文案。
有了这些数据文案,下一步就是如何将这些数据传递到API接口。
测试工具链
目前有HTTP请求工具和百度搜索工具
HTTP请求工具
有五个属性,两个必要属性,三个非必要属性
属性 | 解释 |
---|---|
请求连接 | 填写目标api接口地址 |
请求方法 | Get或Post请求 |
Headers | 设置请求头,token等校验参数值 |
Query | 地址请求参数 |
Body | 请求体参数 |
下面是调用一个测试接口来演示工具链的使用。
表头设置了一个token和Content-Type
输出效果
梗图工具链
梗图设置了20个请求参数,此处为了验证工具链接收参数和输出结果,这里固定参数值。
{
"input": "直男梗",
"title": "直男梗",
"name": "直男",
"sex": "男性",
"keyword": "直男",
"juzi11": "七夕我请你吃饭吧",
"juzi12": "结果带我去沙县小吃",
"juzi21": "情人节我给你做顿大餐,保证浪漫。",
"juzi22": "他做了顿泡面,还加了两根火腿肠。",
"juzi31": "今晚我请你吃法式大餐,过个浪漫的七夕。",
"juzi32": "法式大餐变成了麦当劳,他说这样更快捷。",
"juzi41": "为了七夕,我特地学了几道新菜,给你尝尝。",
"juzi42": "新菜就是煮方便面时多加个蛋。",
"juzi51": "今晚想吃什么?我请你,七夕要浪漫点。",
"juzi52": "最后带我去了路边摊,吃了碗炒米粉。",
"juzi61": "七夕我们去吃烛光晚餐吧,我预订了位置。",
"juzi62": "烛光晚餐的蜡烛是他从家里拿的生日蜡烛。",
"juzi71": "为了七夕,我准备了特别的晚餐,等你品鉴。",
"juzi72": "特别的晚餐就是他自己做的蛋炒饭。",
"juzi81": "情人节我请你吃大餐,地点任选,不用跟我客气。",
"juzi82": "我选了家西餐厅,他带我去了肯德基。"
}
输出效果
全流程
根据上面大模型链和工具链结合,形成梗图七夕版文案生成功能。
这里需要提的一点是,大模型设置的输出json格式参数,在下游工具链是可以通过点操作符的方式设置。
比如:result.name、result.juzi11
梗图优化
通过上面梗图结构分析,梗图标题其实用了人物名称或者角色名称,其实不太准确或者不完整。
比如:输入海王花心梗,标题直接显示海王,就缺少了花心这个描述,标题应该显示海王花心梗。
因此,基于这个情况,进行了梗图标题定位以及prompt优化,如下
Prompt提示词
# 角色与目标
你是一名梗图七夕版文案生成神器。
你能够根据用户输入的{_input_}文本提取标题,然后根据这个标题来推断他(她)可能会说的真话和假话。
同时根据这个标题生成八组和七夕节、情人节、爱情、浪漫等相关信息的真话和假话句子。
提取的标题必须带有角色或者角色描述文本,比如:渣男-不发朋友圈的梗、孤寡梗、海王-消失的梗等
# 思考路径
## 1、你需要输出以下四部分内容:
1.1、标题
通过用户输入的文本{_input_}提取带有角色或者角色描述性文本的标题,这个标题必须是包含在{_input_}里面,不能随意给一个标题。
1.2、性别
根据标题进行人物性别识别,比如:渣男-不发朋友圈的梗,则可以理解为男性,直女,则可以理解为女性
1.3、真假话
前面一句话是描述性假话(谎话),后一句是前一句假话实际的旁白真话句子。
前后句子形成比较大的反差,这个反差可以是搞笑的、讽刺的、幽默的、自嘲的、扎心的。
同时句子需要围绕七夕节、情人节、爱情、浪漫等相关信息描述(如:谎话“七夕夜,我随叫随到。”,实际真话是“结果手机关机,人影不见。”)。
确保文案有趣、好玩、搞笑、幽默、扎心且能够引起共鸣。
输出的真话和假话句子文案尽量简短精辟,真话和假话各自不超过30个字。
如果有描述性文本,那么输出的真话和假话句子可以结合角色和角色描述性文本输出句子。
1.4、高频词
根据八组句子提取高频词
# 内容校验
1、校验用户输入的内容必须合法合规
2、校验用户输入的内容不能包含政治、医疗等敏感信息
# 个性化
1. 在与用户交流时,应保持友好和专业的语气。
新增多一个title字段
[
{
"key":"title",
"description":"标题"
}
]
优化后梗图结构
组成 | 解释 | 参考值 | 备注 |
---|---|---|---|
标题 | 梗图标题 | 海王-消失梗、直男-送丑花梗等 | 基本上就是用户输入的文本作为标题 |
名称 | 人物名称、角色名称、称谓等 | 海王、渣男、直男等 | – |
吐槽词 | 特定人物说的假话(谎话)和真话 | 口头说喜欢你(转头就和三个妹子热聊) | – |
头像 | 具有一定相关性的黑色线条头像 | 固定的头像 | 为了提高性能这里并没有使用动态化绘图 |
高频词 | 文案中出现频率较高的词 | 七夕 | 这个暂时未实现 |
提示词前后对比
优化前效果
优化后效果
API接口
博主使用的是C#实现的文本叠加图片方式生成梗图,最后以Markdown方式输出图片路径字符串。
当然,这里的API接口,小伙伴们可以使用自己熟悉的ava、python等后端j开发语言进行叠图逻辑实现,逻辑并不难。
博主这里就暂不展开详细解释,感兴趣的可加博主咨询。
BOS图片水印
由于水印文本需要进行base64编码,所以需要在API接口进行编码以及设置相关参数返回图片路径。
博主这里就暂不展开详细解释,感兴趣的可加博主咨询。
添加文字水印官方文档:https://cloud.baidu.com/doc/BOS/s/Cldh5wqlh
至此,低代码开发的梗图就完成了,图片实际效果在后端API实现或者BOS云图水印实现。
API或BOS云图主要是实现图文合成功能,设置文案字体大小、换行、定位。
梗图插件
官方插件文档-能力类插件开发:https://agents.baidu.com/docs/develop/ability-plugin/basic/develop_from_scratch/
由于目前低代码智能体还无法进行分发,而零代码支持分发,并且零代码可以添加插件工具。
因此,博主也研究了下插件的实现流程,插件对接的就是API接口,零代码可提供文案,插件负责传递参数值,同样能实现梗图业务。
格式说明
OpenAPI(以前称为 Swagger)规范的 YAML 格式。
这是一个用于描述 RESTful 风格的 Web 服务 API 的应用程序接口规范。
这种规范允许开发人员定义 API 的结构和行为,以便客户端和服务器之间的交互可以通过文档来说明。
构思插件清单文件
设置插件名称、描述、插件logo等信息。
特别是这个字段-description_for_model,有点类似小型prompt提示词,让大模型触发插件的依据之一。
ai-plugin.json文件内容如下
{
"schema_version": "v1",
"name_for_human": "梗图七夕版",
"name_for_model": "glifqixiban",
"description_for_human": "梗图七夕版插件,能够接收指定参数返回图片",
"description_for_model": "梗图七夕版插件,能够接收指定参数,比如:用户原始输入文本、标题、名称、性别、高频词、八组句子,最后返回图片",
"auth": {
"type": "none"
},
"api": {
"type": "openapi",
"url": "https://自己服务器域名/openapi.yaml"
},
"logo_url": "https://自己服务器域名/glif-logo.jpg",
"contact_email": "可填自己邮箱",
"legal_info_url": "https://自己服务器域名/legal.html",
"examples": {
"url": "https://自己服务器域名/example.yaml"
}
}
定义插件服务描述文件
主要设置servers.url和paths值,组合起来就是完成的API接口,比如:https://www.test.com+/api/test/one。
并且可声明当前请求方式和请求参数以及响应参数,和低代码开发的HTTP请求工具套件类似,一个是文件配置化,一个是可视配置化。
openapi.yaml,文件内容如下
openapi: 3.0.1
info:
title: 梗图七夕版
description: 梗图七夕版插件,能够接收指定参数,比如:用户原始输入文本、标题、名称、性别、高频词、八组句子,最后返回图片
version: "v1"
servers:
- url: 自己接口服务器域名
paths:
/api/Test/One:
post:
operationId: getGlifImage
summary: 获取七夕版梗图
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/getGlifImage"
responses:
"200":
description: 返回七夕版梗图路径字符串
content:
application/json:
schema:
$ref: "#/components/schemas/responsesGlifImmage"
components:
schemas:
getGlifImage:
type: object
required: [input,title,name,sex,keyword,juzi11,juzi12]
properties:
input:
type: string
description: 用户输入的原始文本
title:
type: string
description: 标题
name:
type: string
description: 人物称谓
sex:
type: string
description: 人物性别
keyword:
type: string
description: 高频词
juzi11:
type: string
description: 第一组假话(谎话)
juzi12:
type: string
description: 第一组真话
juzi21:
type: string
description: 第二组假话(谎话)
juzi22:
type: string
description: 第二组真话
juzi31:
type: string
description: 第三组假话(谎话)
juzi32:
type: string
description: 第三组真话
juzi41:
type: string
description: 第四组假话(谎话)
juzi42:
type: string
description: 第四组真话
juzi51:
type: string
description: 第五组假话(谎话)
juzi52:
type: string
description: 第五组真话
juzi61:
type: string
description: 第六组假话(谎话)
juzi62:
type: string
description: 第六组真话
juzi71:
type: string
description: 第七组假话(谎话)
juzi72:
type: string
description: 第七组真话
juzi81:
type: string
description: 第八组假话(谎话)
juzi82:
type: string
description: 第八组真话
responsesGlifImmage:
type: string
required: [result]
properties:
result:
type: string
description: 回复信息
编写示例描述文件
设置示例,可以作为插件测试一部分,同时也可给实际使用时作为一个参考。
【content: 输入了某某梗,或者和梗相关的内容】对于预览阶段这个描述起到识别用户输入的文本来触发插件的作用。
example.yaml,文件内容如下
version: 0.0.1
examples:
- context: # 对话历史
- role: user
content: 输入了某某梗,或者和梗相关的内容
- role: bot
# 触发插件
plugin:
# 应当触发的接口operationId
operationId: getGlifImage
# 思考过程,对触发有帮助
thoughts: 获取七夕版梗图
requestArguments:
input: 直男梗,
title: 直男梗
name: 直男
sex: 男性
keyword: 直男
juzi11: 七夕我请你吃饭吧
juzi12: 结果带我去沙县小吃
juzi21: 情人节我给你做顿大餐,保证浪漫。
juzi22: 他做了顿泡面,还加了两根火腿肠。
juzi31: 今晚我请你吃法式大餐,过个浪漫的七夕。
juzi32: 法式大餐变成了麦当劳,他说这样更快捷。
juzi41: 为了七夕,我特地学了几道新菜,给你尝尝。
juzi42: 新菜就是煮方便面时多加个蛋。
juzi51: 今晚想吃什么?我请你,七夕要浪漫点。
juzi52: 最后带我去了路边摊,吃了碗炒米粉。
juzi61: 七夕我们去吃烛光晚餐吧,我预订了位置。
juzi62: 烛光晚餐的蜡烛是他从家里拿的生日蜡烛。
juzi71: 为了七夕,我准备了特别的晚餐,等你品鉴。
juzi72: 特别的晚餐就是他自己做的蛋炒饭。
juzi81: 情人节我请你吃大餐,地点任选,不用跟我客气。
juzi82: 我选了家西餐厅,他带我去了肯德基。
已被占用
model_for_name已被占用,插件英文名要确保唯一,不能重复。
预览效果
首先插件文件需要上传到自己服务器,确保API接口也能够调通。
之后就是上传插件文件校验,校验通过测试没问题就是提交审核。
下面是审核通过后进行的预览界面,同样可以查看到请求参数和响应参数,在零代码调用预览时也是可以查看到。
零代码
完成上面的插件开发并提交完成审核后,就可以零代码创建智能体并使用插件工具。
零代码的人物设定prompt和低代码的提示词模板会有些许不同,核心prompt不变。
目标与角色
在原来基础上增加触发插件的描述,确保智能体能够准确触发到插件。
思考路径
通过增加描述,目的同样是提高智能体触发插件的概率。
通过以下描述,限定仅输出图片
获取到的文案内容只需要传递给梗图七夕版插件即可,无需输出显示。
个性化
增加智能体输出内容,只输出少量描述和Markdown格式图片
预览效果
在预览结果界面同样可以查看输入和输出参数
图片显示
经验分享
文章分析
通过写文章方式分析智能体,会让自己对智能体的定位更加明确和清晰。
1)细化分析,让自己智能体定位更加清晰
可能每个人都有自己优化方式方法,博主优化prompt的方法就是通过写文章来分析《梗图七夕版》智能体,
在写的过程中会进行一定的拆分细化分析,在细化分析的过程中,总会发现一些问题,同时也会思考是否合理。
比如:博主在分析过程中就是发现单单显示人物名称是不太准确的
2)了解概念,prompt的优化方向才会正确
起初,博主只是通过体验现有的梗图,大概知道点玩法和概念并没有深入了解。
所以,在写文章过程中,就会把梗图概念过一遍,也加深自己的印象。
反过来分析自己的prompt编写的是否规范和正确,目前线上版本也是在了解了一定概念后优化了一版。
刚开始的prompt对于文案的描述是【八组正反话文案】,感觉这个描述也是不太准确,后来改为了【八组真话和假话句子】
比如:你能够根据用户输入的{input}文本提取角色名称,然后根据这个角色来推断他(她)可能会说的真话和假话。
再之后优化为:你能够根据用户输入的{input}文本提取标题,然后根据这个标题来推断他(她)可能会说的真话和假话。
BOS水印
BOS水印个数是有一定上限,最多支持16个水印文本。
因此,对于八组吐槽梗词来说,极大可能会超过16个,因为是根据每一个行来算一个水印数量,并且每一组的行数动态保持在2到5行之间,所以加上名称标题,至少水印个数需要17到41个。
所以,如果梗图这个要想使用BOS水印方案,就必须去掉三组或者五组才能满足业务需求。
当然,基于这个情况,小伙伴可以分享下你们的解决方案,目前我能想到的解决方案就是去掉三组以上吐槽梗词。
低代码
套件链之间是相互独立又是可以相互关联,特别是对于参数的传递,上游链定义的参数是可以给下游链调用。
并且是使用点操作符的方式获取和传递。
这里分享的经验点就是,可以通过拆分独立套件模块来测试。
比如:大模型链模块测试,就可以看到是否准确输出了每个json参数值。
插件prompt
在写文章的时候,突然明白插件model字段的含义,也就是说,提示词模板或人物设定实际和插件的model字段意思一样。
灵光一闪,马上把prompt换行去掉后,放到字段description_for_model里进行测试,果然是有效果的。如下
当然作为插件,这里当然不是这样子使用,梗图七夕版插件工具主要用于接收参数的作用,这里演示的目的是,可以设置一定的prompt去实现一些功能。
零代码
零代码这里的经验分享有一点可以提下,就是核心逻辑还是在prompt的优化上。可以充分发挥零代码的理解、生成、逻辑和记忆能力、
体验
欢迎体验梗图七夕版智能体。
低代码-梗图七夕版:https://mbd.baidu.com/ma/s/paAHEzRi
零代码-梗图七夕版:https://mbd.baidu.com/ma/s/j9PqL4kb
AgentBuilder意图看懂
**推荐文章:
**【AI人工智能】文心智能体,00后疯感工牌生成器,低代码工作流的简单应用以及图片快速响应解决方案,干货满满,不容错过哦
本次就分享到这,若有说的不对或者不准确的地方,望大家指正。有任何疑问都可加我咨询