我用扣子开发了一个会讲故事的机器人....

286 阅读7分钟

前言

最近突发奇想,前段时间又学习了工作流,于是想用扣子使用工作流做个东西,思考了许久,于是决定做个会“讲故事”的机器人。

设计

在开始做之前,我们先为这个Agent做一些必要的设计。

该机器人(Agent)的目标是服务于儿童,通过与儿童交互,讲述一些经典的故事给用户,或者根据用户的需求创建一个全新的故事进行讲述。

  • 创作目的:让孩子们能够通过故事获取知识,提高素养,让家长们更放心孩子的成长

  • 产品类别:益智型产品、创作型产品

  • 服务人群:0-12岁的儿童

  • 实现方式:工作流

  • 输出方式:图文+语音


如何制作?

先展示最终的效果,该机器人既可以讲述经典故事,也可以创作一个新的故事!

经典故事

image.png

创作故事

image.png


实现流程

image.png

该工作流共包含5个核心节点,按执行顺序如下:


节点1:大模型(关键词拆解)

节点1配置详情

基础信息

  • 节点类型:大语言模型(单次调用)
  • 模型选择:豆包·1.5·Pro·32k
  • 温度值:0.8(平衡创意与稳定性)
  • 输出格式:JSON

输入配置

变量名变量来源说明
input用户原始输入(文本)用户提出的故事主题或名称

系统提示词(System Prompt)

目标:
你根据用户的输入,分析并拆解出用于搜索的关键词,方便用户搜索需要的原文内容,这些内容用于后续为用户创作儿童故事。

分析方法:
1. 如果用户输入是经典故事(如“三只小猪”“狼来了”),直接生成该故事的原文搜索关键词。
   - 示例输入:“龟兔赛跑”
   - 示例输出:["龟兔赛跑 完整故事原文", "龟兔赛跑 安徒生童话版"]

2. 如果用户输入是自由创作主题(如“勇敢的小狐狸”),结合中国历史/文化生成参考关键词:
   - 示例输入:“勇敢的小狐狸”
   - 示例输出:["狐狸 中国民间传说", "勇敢的动物 神话故事", "聊斋志异 狐狸故事"]

任务:
根据用户输入,输出一组精准的搜索关键词(query)。

输出配置

{
  "output": "分析结果的总结文本",
  "intent": "用户意图分类(如:经典故事/自由创作)",
  "querys": [
    "关键词1",
    "关键词2",
    "..."
  ]
}

节点2:循环(并行搜索)

基础信息

  • 节点类型:循环(数组循环)
  • 循环模式:并行执行(自动拆分数组项)
  • 最大循环次数:10(防止无限循环)

循环设置

参数值/来源说明
循环类型使用数组循环遍历querys列表中的每个关键词
循环数组{{querys}}来自节点1的querys输出数组
中间变量current_query(自动生成)每次循环的当前关键词

循环体配置:头条搜索插件

输入参数

变量名值/来源说明
count1每次搜索返回1条最相关结果
cursor0从搜索结果第0位开始(分页预留)
input_query{{current_query}}绑定当前循环的关键词
search_id留空首次搜索无需传入

输出绑定

将插件返回的完整结果绑定到循环输出变量:

{
  "responce_from_model": {
    "cursor": "{{data.cursor}}",
    "doc_results": "{{data.doc_results}}",
    "has_more": "{{data.has_more}}",
    "search_id": "{{data.search_id}}"
  }
}

输出数据结构说明

最终循环输出的responce_from_model为对象数组,每个元素包含:

{
  "cursor": number,          // 下次搜索的偏移量
  "doc_results": [{          // 搜索结果列表
    "sitename": string,      // 网站名称(如"百度百科")
    "summary": string,       // 内容摘要
    "title": string,         // 网页标题
    "url": string            // 链接地址
  }],
  "has_more": boolean,       // 是否还有更多结果
  "search_id": string        // 本次搜索ID(用于分页)
}

节点3:大模型(故事生成)

基础信息

  • 节点类型:大语言模型(单次调用)
  • 模型选择:豆包·1.5·Pro·32k
  • 温度值:0.8(平衡创意与稳定性)
  • 输出格式:JSON

输入配置

变量名变量来源说明
input{{responce_from_model.doc_results}}来自节点2的搜索结果(数组)

用户提示词模板

参考资料:
{{input}}

系统提示词(System Prompt)

系统:
你根据参考资料进行整理,撰写儿童故事草稿。
注意:
1. 内容需符合6-8岁儿童的理解力,语言简单生动。
2. 如果是经典故事(如"三只小猪"),严格忠于原文。
3. 如果是自由创作主题(如"勇敢的小狐狸"),可合理发挥,但需结合中国历史/文化元素。
4. 输出时标明故事类型(经典/创作)和适用年龄。

输出配置

{
  "output": "完整的故事文本,包含标题和内容",
  "metadata": {
    "type": "经典故事/自由创作",
    "age_range": "6-8岁",
    "sources": ["参考链接1", "参考链接2"]
  }
}


节点4 & 5:多模态输出

节点4:语音合成(roumei_nvsheng)

基础信息

  • 插件名称:中文文本转语音(柔美女声)
  • 调用方式:单次调用
  • 输入来源:节点3的output字段

输入配置

变量名值/来源说明
text{{output}}绑定节点3生成的故事全文

输出绑定

{
  "audio_url": "{{data.url}}",  // 音频文件URL
  "log_id": "{{log_id}}"        // 用于错误追踪
}

异常处理

  • 空文本:返回错误提示"故事内容为空,请检查上游节点"
  • 合成失败:自动重试2次,间隔1秒

节点5:插图生成(ImageToolPro)

基础信息

  • 插件名称:ByteArtist(卡通风格)
  • 调用方式:单次调用
  • 输入来源:节点3的output字段

输入配置

变量名值/来源说明
model_type1固定为卡通风格
prompt{{output}}使用故事文本作为生成描述
image_url留空非图生图模式无需传入

输出绑定

{
  "image_url": "{{data.image_url}}",  // 插图URL
  "prompt": "{{data.prompt}}"        // 实际使用的生成提示词
}

异常处理

  • 内容违规:返回默认占位图链接
  • 超时:设置3000ms超时限制


此工作流完整覆盖 需求分析→内容获取→创作→多模态渲染 全链路,适合快速部署到Coze平台或类似AI工作流引擎。


将工作流放到Agent设置中

开发好了工作流之后,咱们将工作流嵌入 我们的机器人产品中,然后输入一段提示词,让其遵循着工作流工作,就最终完成了我们的产品啦!

image.png



思考

在这个案例中,你可以学到:

  • 使用大模型对用户的原始Prompt进行优化,我们的用户都是一些表达能力还不是很强的孩子们,他们说的话如果直接传给后续插件等处理可能会出现一些对识别不清的情况,所以这一步是必不可少的。

  • 对用户的需求进行限定:如果是经典故事,则限定找经典故事原本的内容,比如安徒生童话,伊索寓言,中国神话故事等;如果是创作新故事,则通过LLM的能力创作一个新颖有趣的故事。

  • 本案例使用的是调用网络搜索插件的方式进行故事信息的搜集,其实我们还可以使用知识库对一些故事信息进行存储,从知识库中收集,配合着网络搜索,可以做到更好地效果。

  • 调用语音插件roumei_nvsheng,可以实现文生语音,调用图片插件ImageToolPro,就可以实现文生图

  • 使用循环的节点,可以重复处理数组的内容,比如传入的是querys有四个元素,则循环后输出也会是四个元素!


总结

现在已经发布了正式版本,大家可以访问链接去体验一下,由于题主制作此类智能体的经验较少,所以该项目中可能会出现许多不足的地方,望大家多多包涵,以后题主会提升自己的水平,做出更好的、更实用的Agent

🌇结尾

感谢你看到最后,最后再说两点~
①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。
②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~
我是3Katrina,一个热爱编程的大三学生

(文章内容仅供学习参考,如有侵权,非常抱歉,请立即联系作者删除。)

作者:3Katrina
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。