引言
今天我们要实战的开发平台是coze,也就是我们常说的扣子。扣子是新一代 AI 应用开发平台,可以快速搭建基于大模型的各类 Bot并进行发布和部署。和其他Agent平台一样,扣子也支持常见的工具插件、工作流模式、多Agent模式等功能。今天我们的实战会用到自定义插件和工作流功能,如果你对其他功能感兴趣,可以详细看看扣子的开发文档介绍。
工具介绍
今天我们除了用到coze平台之外,还会用到replit,下面我来简单介绍下Replit
Replit
Replit 是一个基于云的开发环境,使用户能够直接在浏览器中编写、构建和协作软件项目,无需额外设置或工具。它支持多种编程语言,并提供了实时协作、集成开发环境(IDE)和部署工具等功能。在我们的实战中,我们会基于这个平台提供一个临时的线上api访问接口,以便我们后面在coze中的自定义插件中使用。
接下来,就让我们搭建一个基于python的接口服务器
搭建Flask服务器
Flask 是一个用 Python 编写的轻量级 Web 应用框架。它被设计为简单易用,以“微框架”身份出现,意味着它的核心简单但可扩展。
为啥选择Flask,而不是Nodejs或者其他?
Flask 提供了一个非常基础的框架,可以很容易地扩展来适应开发者的需求,特别是在开发速度和应用的灵活性方面。而且后面我们提供的功能使用python实现比较方便,所以选择了基于Flask的服务器而不是Nodejs
首先,你需要登录注册一个帐户,这里通过github可以直接授权登录,这是登录后的主界面
Replit提供了许多语言框架的模版给我们使用,其中就包括了 Flask, 我们可以直接在中间的搜索栏中输入Flask,选择第一个创建Flask模版,在弹窗中输入项目名称后按“Create Repl” 创建Flask项目
项目创建成功后会进入到IDE中,可以看到和我们日常开发的vscode比较相似,左边是目录结构,中间是代码编辑区域,右边是预览区域。
我们可以点击最上面中间的“Run”,当看到右边预览区域控制台打印日志后就是启动成功了!
点击右边预览区域右上角的 “New Tab”,打开的新页签就是我们的api接口地址了,这个地址我们后面会用到先记起来
你看,是不是很简单就搭建了Flask的服务器,如果我们自己开发的话不仅要初始化项目,还要买服务器部署,十分麻烦,有了这个就可以快速构建我们的服务验证我们的项目了。
当然,这个api的接口地址是临时的,不过对于实现我们的项目是够用了,你也可以部署到你自己的域名上去,这方面就先不赘叙了
需求分析
需求描述
对于一些公众号博主来说,经常需要浏览最新的时事热点新闻等,然后再根据这些内容整理成自己的文案。所以我们这次实战的需求就是:访问Youtube链接的视频内容,生成我们自己的热点文章,必要的时候还可以配图等。
需求实现
我们会使用coze实现一个bot,这个bot可以根据我们的youtube链接读取视频的内容并生成我们想要的文章和配图。
下面是我们的实现逻辑:
- 这里我们会实现自定义的插件 “YouTube视频内容读取”,他的功能是根据视频URL读取视频内容;
- 同时还会实现一个工作流:这个工作流会提取用户的输入后给到自定义插件得到视频内容,再通过大语言模型配置生成我们的热点文章输出
- 最后我们还会添加内置插件“ImageToolPro”,该插件功能是根据用户的描述生成多种风格的图片。
话不多说,让我们开始吧
实战开发
下面就让我们来实现之前的逻辑
自定义插件实现
开发视频读取内容接口
在之前我们通过Replit开发了一个精简的线上服务器,现在我们要在这个服务器上实现一个api,实现视频内容读取功能,一般来说我们可以通过抓取视频的字幕来实现读取视频的内容
这里也许有人会问我们不会Python,要怎么开发这些功能呢?
其实这个不用担心,大模型的出现让学习成本降低了,我们只要把控全局,剩下的细节完全可以交给大模型来实现!
比如说这个功能,我们完全可以询问 **智谱清言** 或者**ChatGPT**,这是我的询问提示词:"请编写一个python函数,实现抓取youtube视频的字幕,要求完整可执行。"
这里我们在replit上验证下ChatGLM给的答案,新建 fetch_youtubu_content.py 文件,将上面的内容粘进去后稍微修改下,内容如下:
from pytube import YouTube
from youtube_transcript_api import YouTubeTranscriptApi
def get_youtube_content(video_url):
"""
Fetch and print subtitles from a YouTube video.
This function takes a YouTube video URL, and then retrieves and prints the
subtitles of the video in English if available. The subtitles are also returned as a single string.
Parameters:
video_url (str): The URL of the YouTube video.
Returns:
str: The subtitles of the video in English as a single string, or None if subtitles are not found.
"""
# Create a YouTube object
yt = YouTube(video_url)
# Retrieve and print the basic information of the video
video_title = yt.title
print(f"Video Title: {video_title}")
# Attempt to get subtitles
try:
# List all available subtitles
transcript_list = YouTubeTranscriptApi.list_transcripts(yt.video_id)
# Select subtitles in the preferred language (English in this case)
transcript = transcript_list.find_transcript(['en'])
# If subtitles are found, download and print them
if transcript:
subtitle = transcript.fetch()
subtitle_text = ' '.join([item['text'] for item in subtitle])
print(f"Subtitles: {subtitle_text}")
return subtitle_text
else:
print("No subtitles found.")
return None
except Exception as e:
print(f"Error fetching subtitles: {e}")
return None
video_url = 'https://www.youtube.com/watch?v=lsQ8520BjfI'
subtitle_text = get_youtube_content(video_url)
print(subtitle_text)
在右侧预览区中操作弹出shell窗口,在终端中先安装必要的库:
pip install pytube
pip install youtube_transcript_api
然后执行这个文件,看到输出就说明我们的函数功能没问题,如下所示,我们的测试URL可以读取到字幕。最后记得将fetch_youtubu_content.py文件最后的几行测试代码隐藏掉哦
回到 main.py,增加接口 /api/video-content,调用刚刚测试的功能函数,修改如下:
from flask import Flask, jsonify, request
from fetch_youtubu_content import get_youtube_content
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello from Flask!'
@app.route('/api/video-content', methods=['POST'])
def post_data():
# 从 POST 请求中获取数据
data = request.json
print(data)
if data is None or 'video_url' not in data:
# 如果没有正确接收到数据或者数据中没有'video_url'键
return jsonify({"error": "Missing 'video_url'"}), 400
content = get_youtube_content(data['video_url'])
return jsonify({"result": content}), 200
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
最后需要重启服务生效
coze自定义插件-接入api
完成了接口的开发后, 我们需要创建一个插件的接入这个api 登录coze之后,选择左侧菜单栏 “Personal”,在中间的tab切幻到“插件”后,选择右上角的“创建插件”
在“新建插件”弹窗中,我们依此填写好插件内容,这里创建方式选择“基于已有服务创建”,然后在插件URL中输入我们之前得到的接口地址,注意最后不需要“/”
创建后会有一个插件空间,我们需要在这个空间下继续创建真正用到的工具函数,点击“创建工具”
- 填写基本信息,填写我们之前的接口名称 “/api/video-content”
- 配置输入参数,注意这里的传入方法是“Body”,在我们接口这里是post请求体
- 配置输出参数,这里可以选择 “自动解析”来帮助你生成输出参数
- 调试与校验 最后我们要验证这个工具是否正确工作,在参数值中输入我们的测试Youtube的链接:"www.youtube.com/watch?v=lsQ…" ,如果不出意外就可以看到返回正确的response了
如果调试没有成功可以先看下replit接口是否正常工作,因为有时候时间太久会服务会停止运行
这样我们就实现了一个读取视频内容的插件,点击 “完成” 后需要再点击“发布”
工作流实现
创建工作流
接下来,我们会用到刚刚发布的自定义插件,整合我们自己的工作流。我们回到 “Personal”,点击中间的tab “工作流”, 点击右上角“创建工作流” 后进入到工作流编排页面
编排工作流
在工作流编排中,我们需要的流程节点是
开始 ----> 读取视频内容插件 ----> 大模型 ----> 结束
接下来就让我们依此配置
- 开始 开始节点默认就有,这里我们不需要额外参数,保留默认即可
- 插件节点 点击左侧菜单栏的插件添加,选中我们之前创建的插件,将开始节点与插件节点连接起来,并配置插件节点的传入参数为开始节点输入参数的引用,如下
- 大模型节点
配置开始插件后,我们需要一个大模型来生成我们要的热点文章,这里先从左侧菜单栏添加 “大模型” 节点,并将插件节点连线到这个大模型节点上, 然后开始配置:
- 大模型: 这里选择豆包Function call模型,你可以尝试别的生成能力更强的模型试试;
- 输入:这里的输入是之前插件节点的输出引用(注意这里需要连线才会展示之前节点输出);
- 提示词:这里的提示词是指导大模型怎么生成热点文章,同时需要将之前插件内容插入其中,使用 {{input}} 就可以引用变量内容,下面是提示词内容:
这是视频内容:{{input}}},
你会根据以下步骤生成热点文章,并使用中文回复:
1. 给文章一个标题,并且根据内容生成文章的小标题;
2. 设计有吸引力的开头,引发读者兴趣。
3. 按照每个小标题逻辑顺序组织内容,清晰阐述视频的要点。
4. 结尾进行总结或给出独特的见解,引导读者互动。
同时你还会注意优化文案表达:
1. 运用生动、准确的语言,增强文章的可读性。
2. 融入恰当的情感色彩,使文章更具感染力。
3. 注意段落划分和标点使用,提升文章的排版美观度。
## 限制:
- 文章内容必须紧密围绕视频主题,不得偏离。
- 避免使用过于复杂或生僻的词汇,确保大众能轻松理解。
- 文章长度要求,控制在 1000-2000 字之间。
- 遵循公众号文案的风格和规范,不得出现违规内容。
- 输出:配置大模型的输出变量名为 content ,方便后面节点引用 下图是大模型节点的配置
- 结束节点 最后就是结束节点了,直接引用之前当模型的输出即可
测试工作流
编辑完工作流之后,我们需要试运行才能继续发布,点击上方的试运行,我们只需要在开始节点的输入中出入URL即可: www.youtube.com/watch?v=lsQ… 。 然后整个 工作流会开始运行,你可以在每个节点查看运行的状态和输出, 等运行成功之后,我们就可以直接发布并使用了
创建Bot整合功能
当所有前置条件都准备完成之后,我们就可以创建一个Bot机器人来整合我们之前的功能。
配置Bot
回到Personal页面,点击页签“Bots”,创建一个Bot,进入Bot编排页面。可以看到,左边是我们的Bot信息,中间是Bot的功能区域,右边是预览调试区域,很容易区分。 在bot编排页面中,我们需要设置几个地方:
- 人设与回复逻辑 首先是左边区域的“人设与回复逻辑”,这里相当于是设置我们的提示词,如下所示:
# 角色
你是一个专业的公众号文章撰写助手,能够依据给定的视频 URL 创作出高质量、引人入胜的文章,并为文章配置与之契合的精彩图片。
## 技能
### 技能 1: 生成文章
1. 当获取到视频 URL 时,调用 video_workflow 工作流生成文章。
2. 确保文章内容丰富、逻辑清晰、语言生动。
### 技能 2: 生成图片
1. 使用 ImageToolPro 工具根据文章场景生成图片。
2. 所生成的图片要与文章主题和氛围高度相符。
## 限制:
- 仅依据给定的视频 URL 进行创作,不参考其他无关内容。
- 所生成的文章和图片必须紧密围绕视频主题。
- 保证文章和图片的质量,符合公众号发布的标准。
提示词从角色、技能、限制几方面引导Bot生成高质量的回复,你还可以点击右上角的“优化”来优化你的提示词。
- 插件 因为我们可能还需要配图,所以这里我们可以使用内置的插件:ByteArtist下的ImageToolPro,点击插件右边的“+”,搜索我们想要的插件点击添加即可。
添加后大模型会在根据需要的场景自动调用,自动根据插件所需的传参进行传值,这是根据插件的schema来决定的,如果你用过OpenAI的function calling就知道了,原理是一样的。
- 工作流 这里直接添加我们之前创建的工作流
- 大模型 这里比较特殊,还需要设置下我们的大模型,在中间可以看到我们现在默认使用的是“豆包Function call模型”,我们将其改成“GLM-4”。
因为之前我们的工作流里提示词中设置了要生成1000-2000字的文章,你还有印象吧,而且我们后面也需要生成图片啥的,“豆包Function call模型”的最大回复长度可能不够,所以这里我们选择“GLM-4”128k的,最大回复长度最高有8000,这里设置的高一点7000左右。
这里token计算大概是100个token是150个汉字,你可以根据需要的输出字数进行调整
输出格式设置为markdown。 除此之外这里的配置读者都可以切换试试哪个效果比较好,比如生成随机性(temperature)越高生成输出越多样性和创造性。
测试Bot
当 所有配置都准备好之后, 终于到了激动人心的时刻, 接下来我们就来验证一下。 这里以油管(Youtube)上我喜欢的一个财经知识博主"小Lin说"的视频为例,生成我们想要的热点文章。 在预览和调试中输入我们的需求:“ www.youtube.com/watch?v=2MJ… 请根据这个链接生成文章并配图 ”,稍等片刻后,就可以看到聊天界面流式地打印输出
从上面的生成结果来看,不仅给我们生成了大标题,还根据视频内容给我们分类了小标题以及具体的内容解读, 而且还配上了图片,稍加修改润色就可以发布到公众号上了。
相信对于大部分没有经常写作创作的新手来说应该是够用了,如果你觉得不满意,你还可以根据你的需求去修改之前工作流中大模型节点生成文章的提示词。
点击"运行完毕",你可以看到调用流程,分别调用了我们的工作流video_workflow和图片生成工具ByteArtist。 点击上方"调试"按钮还可以看到具体的大模型调用堆栈和耗时等数据,如果你的大模型输出不尽人意的话你也可以根据程序堆栈看看是哪个步骤出了问题。
总结和对比
实战总结
经过这一节的coze实战,如果你根据我的步骤走下来的话,相信也可以配出一个正常工作的热点文章生成Bot,也能对coze平台有更深的理解。coze平台的其他功能你可以自行查看官方的搭建指南,如果你想接入到自己的程序中,官方也有暴露了对应的 API 可以实现(API文档),跟着文档一步步无脑操作就行了。
下面是Flask的服务端代码,你可以点击 "Fork" 按钮来发布自己的服务端 replit.com/@solkattone…
这是coze Bot链接:www.coze.cn/store/bot/7…
对比
相对于autogen、MetaGpt 等国外的Agent框架,coze更注重应用层面的开发,提供了丰富的插件配置和应用集成。而类似autogen、metagpt则开发门槛更大,需要用户具备较强的技术背景才能最大化其能力,应用场景更趋向于提供更广泛的通用解决方案,也就是通用化。
Autogen
AutoGen是一个开源的编程框架,旨在构建AI智能体并促进多智能体间的合作。其主要特点如下:
- 多智能体对话框架:提供一个高层次的抽象,使得构建LLM工作流程变得方便。
- 模块化和可扩展性:框架设计灵活,易于扩展和实验不同的模型和智能体组合。
- 应用广泛:支持从各种领域和复杂性的多种应用。
MetaGpt
MetaGPT是一个基于大型语言模型(LLM)的多智能体协作框架,其核心理念是将软件公司工作流程标准化并嵌入到智能体的操作中。其主要特点如下:
- 模拟软件公司:将智能体角色划分为产品经理、架构师、项目经理和工程师,模拟真实软件公司的工作流程。
- 标准化工作流程:通过标准化操作程序(SOPs)来提高智能体的协作效率和问题解决能力。
- 多任务处理:可以接收单行需求输入,输出用户故事、竞争分析、需求、数据结构和API文档等
除此之外,对大模型的支持也不尽相同,
- coze目前只支持豆包、GLM、通义、Kimi、百川智能等内置的有限模型;
- autogen处理支持gpt系列之外,还支持定制模型的接入,这意味着你也可以部署自己的大模型接入
大模型的调用价格方面,
-
coze还是相对比较便宜的,而且有免费额度够你调试,具体可看计费文档
-
而autogen的对话上下文都是使用gpt系列的话也不便宜,而且调用工具生成的内容也会传入到上下文,如果你是多Agent进行交互的话,内部agent还会进行多次对话直至找到目标才停止,所以对token的消耗是巨大的。
之前在autogen通过相同的文章生成一次就需要几块钱。同时目前多Agent模式也没有你想的那么神奇,随意给定一个任务就可以完美的给出答案,通常需要在特定场景时在Agent的每个步骤给出具体的描述和指导,经过不断的反复调试才能成功。
小结
通过对coze的实战以及上面其他Agent框架的介绍,相信面对其他Agent平台你也可以快速上手操作,它们使用的场景不同,但是技术原理大体上都是一致的,都具备工作流、插件工具、多Agent模式等相同的概念,有时候你会听到 LLM Ops平台这个概念 ,其实二者有很大的重叠,业界也没有统一的说法,比如说 Dify就是一个开源star数很多的LLM Ops平台,以开源模式经营的公司。