实战演练:文件在线转换器
大家有没想过,如果有一个应用,你只需要给它一个网页链接,它就能把网页上的内容转换成你想要的格式,比如 PDF、Word、Excel 等等,而且是格式化好的,你只需要下载下来就可以使用了。
这个应用其实不难实现,使用 Coze 的大模型能力和自带的一些功能,就能很稳定地实现了。这次我们来尝试拆解我在技能商店上架的一个获奖 Bot 的核心功能 - 链接转文档。
演示效果
我们先来看看这个 Bot 的演示效果,上述的这个核心功能为了让用户更快更稳定地进行调用,目前是直接使用了快捷指令的方式进行调用,我们打开这个快捷指令看一下:
这里就可以很一目了然地看到这个功能的详细情况,你只需给它一个网页链接,它就能自动解析出网页上的内容,并转换成图中支持的格式。接下来我们来试试效果。
这里我们就示范拿 Coze 官方文档的其中一篇多 Agent 模式内容来尝试一下转换吧,我们首先打开一下这个网页看看:
好了,我们接下来就尝试一下直接使用这个功能来将这个网页转换成飞书文档吧,过程如下,不到一会,文档就转换好了:
这是最后转换的文档链接,我们来看看转换的效果:
sat2tjmapq6.feishu.cn/docx/KihVdE…
除了图片的链接不能转换,其他内容基本上都能很好地转换出来,包括表格、标题、段落、代码块等。
甚至说,我们还可以基于这个文档链接,将其转换位思维导图的格式,这样看到一些好的文章,我们直接就可以利用它帮我们总结精华了,如下:
是不是看起来还算实用呢?那这个功能是怎么实现的呢?接下来我们就来拆解一下这个功能的核心实现。
功能拆解
其实这个功能的核心实现,主要就是一条较为复杂的工作流来实现的,我们先来看看大体是怎样的:
这个工作流还有不少的子工作流存在,不过其实都是可以再优化的,毕竟有些地方还是有些冗余的。不管怎样,原理是相似的,我们先从图中的序号 1 开始,一个一个来看看它是怎样实现的吧。
1. 开始节点
开始节点其实不难理解,就是再用户调用我这个工作流的时候,要先补充好两个参数,一个是网页链接,另一个是转换格式,这两个参数是必须的,否则工作流就无法继续往下执行了。
而在这里,因为我这个工作流是通过 Bot 的快捷指令来调用的,所以这两个参数是直接通过快捷指令的参数来获取的,如下图:
这个大家应该比较好理解了,这里就不再赘述了。
2. 过渡的信息节点
这里主要是为了提高用户体验,让用户知道工作流正在运行中。
3. 识别链接具体格式的大模型节点
我先把具体的用户提示词列举出来:
假设你是一个文件转换大师,请你先尝试读取以下链接来判别这个链接是需要哪种类型的内容:
{{file_url}}
目前支持的内容类型主要分为以下几种:
1. 文本类型内容,如 docx、pdf、txt、md 等;
2. 表格类型内容,如 xlsx、csv、xls 等;
3. 图片类型内容,如 jpg、png 等;
4. 其他类型内容,如无法访问的链接、普通网页链接、微信公众号文章链接等;
根据识别到的类型内容,这是对应类型的序号一览:
文本类型内容 = 1
表格类型内容 = 2
图片类型内容 = 3
其他类型内容 = 4
请读取对应类型的文件具体格式出来,如果是属于其他类型内容,其文件格式就默认为"md"即可。
#### 样例参考
1. 如果检测到链接属于文本类型内容,并且检测到是 pdf 文件,则只返回 JSON 结果:
{
“file_type”: 1,
"file_format": “pdf”
}
2. 如果检测到链接属于表格类型内容,并且检测到是 xlsx 文件,则只返回 JSON 结果:
{
“file_type”: 2,
"file_format": “xlsx”
}
3. 如果检测到链接属于其他类型内容,则只返回 JSON 结果:
{
“file_type”: 4,
"file_format": “md”
}
以此类推。
#### 具体限制
1. 只返回对应类型内容的 JSON 结果即可,禁止任何描述性文字内容;
2. 无论是否能够成功检测,都直接按照自己理解往 JSON 赋对应的值,只输出 JSON 结果就好,不需要任何描述性语句;这个节点主要是为了识别出用户给定的链接具体是哪种类型的内容,并返回对应的文件格式,这个文件格式是后续工作流中需要用到的。眼尖的小伙伴可以发现,其实这个大模型节点是可以使用最新新推出的意图识别节点来替代的,这里的情况主要是我那时候比赛的时候还没有这个节点,所以就用了大模型节点来实现了,大家有兴趣的可以尝试用意图识别节点来替代。
4. 格式化内容的代码节点
import json
async def main(args: Args) -> Output:
params = args.params
input_text = params['input']
# 尝试直接解析 JSON 字符串
try:
json_obj = json.loads(input_text)
except json.JSONDecodeError:
# 如果解析失败,则尝试提取 markdown 中的 JSON 字符串
parts = input_text.split("```json")
if len(parts) > 1:
json_text = parts[1]
else:
json_text = ""
# 删除 "```" 下方的多余字符串
parts = json_text.split("```")
if len(parts) > 1:
json_text = parts[0]
# 去除字符串首尾的空格和换行符
json_text = json_text.strip()
try:
# 将提取到的 JSON 字符串解析为 Python 对象
json_obj = json.loads(json_text)
except json.JSONDecodeError:
# 如果解析失败,则将 JSON 对象设为空字典
json_obj = {}
ret: Output = {
"file_type": json_obj.get("file_type", ""),
"file_format": json_obj.get("file_format", "")
}
return ret这个节点的初衷其实是为了解决前面大模型生成的结果中,会时不时存在结果开头和结尾存在 markdown 代码块的语法 ** 或者 **markdown 的问题,所以这里就通过代码节点来将这些代码块去掉,只保留中间的内容,从而保证后续转换的稳定性。
5. 对应分支处理文件格式的选择器节点
根据前面大模型节点返回的文件格式,这里就可以选择对应的文件格式进行处理了,我们根据大模型的结果匹配以下不同的数字来选择对应的后续分支处理:
- 文本类型内容 = 1
- 表格类型内容 = 2
- 图片类型内容 = 3
- 其他类型内容 = 4
6-9. 读取对应文件格式内容的工作流
这里的子工作流主要是使用一些插件来具体读取链接对应的完整内容,然后再把内容存放在 Bot 的变量中,以便后续做进一步处理,毕竟上述演示的功能其实只是这个 Bot 其中一个核心功能而已。
其实这几个子工作流的逻辑原理是类似的,我们来选其中一个来看看:
从图中可以看到,其实这个子工作流就是通过链接读取插件读取这个网页链接的内容,然后使用大模型节点来润色一下文章的具体内容为markdown格式,然后再同时调用三个写入变量节点,将文章内容、文章原链接和文件格式分别写入到三个不同的变量中,以便后续做进一步处理。
10. 过渡的信息节点
这里我们继续加一个过渡的信息节点,让用户知道工作流已经读取完网页链接,开始进行下一步的转换了。
11. 判定不同文件格式的选择器
从图中可以看到,这里主要根据转换不同的目标文件格式来跳转到后续不同的子工作流进行处理,这里我们主要分为以下几种目标格式:
- 文本类型:docx、pdf;
- 表格类型:csv;
- 幻灯片类型:pptx;
- 在线文档类型:飞书文档;
- 思维导图类型;
- 如果目标格式不支持,则直接跳转到转换为 md 格式;
12-17. 匹配目标格式并进行转换的子工作流
这里的几个工作流原理是类似的,都是为了将读取到的内容转换成目标格式,在对应的每个子工作流,其实也只是读取 Bot 相关变量现在值,然后针对性使用某些插件来将内容转换成目标格式。
18. 输出最终转换结果
这里其实因为上一子工作流节点已经帮我完成好我的最终转换效果了,所以这里的结束节点更多就变成了一个过渡节点,让用户知道工作流已经运行完毕了。
总结
本文详细介绍了一个基于 Coze 平台开发的文件在线转换器 Bot。这个 Bot 的核心功能是链接转文档,能够将网页内容转换成多种格式,如 PDF、Word、Excel 等。以下是主要内容的总结:
-
功能演示:
- 通过快捷指令调用,用户只需提供网页链接和目标格式。
- 能够将网页内容转换为多种格式,包括飞书文档和思维导图。
-
核心实现:
- 使用复杂的工作流实现,包含多个子工作流。
- 主要步骤包括:开始节点、链接格式识别、内容读取、格式转换和结果输出。
-
关键组件:
- 大模型节点:用于识别链接类型和润色内容。
- 插件:用于读取链接内容和转换格式。
- 变量:存储中间处理结果。
- 选择器:根据目标格式选择不同的转换路径。
-
支持的格式:
- 输入:文本、表格、图片和其他网页类型。
- 输出:文本(docx、pdf)、表格(csv)、幻灯片(pptx)、在线文档(飞书文档)和思维导图。
-
优点:
- 功能强大,支持多种格式转换。
- 用户友好,操作简单。
- 可扩展性强,可以根据需求添加新的转换格式。