【DataWhale | 大模型Bot应用开发】Task3--工作流

写在前面 / 链接存档

【DataWhale | 大模型Bot应用开发】Task3–工作流

介绍:Coze工作流

工作流应用场景

  • 随着大模型(Large Language Models, LLM)技术的发展,业界已经普遍认识到,复杂的工作任务无法通过单次 LLM 调用来解决
  • 为此,吴恩达、Itamar Friedman、Harrison Chase等专家提出了工作流(Workflow)和流程工程(Flow Engineering)等概念,旨在通过**多次、分阶段的 LLM 调用和迭代**,来实现更优的应用效果
  • 目前,国内外已有多个平台推出了自己的工作流产品,如 Coze百度千帆/灵境/客悦DifyFastGPTFlowiseLangflow等。这些平台通过可视化的低代码编排,实现了**对执行流程的管理和优化**
客户服务内容生成任务自动化数据分析和报告邮件自动化处理
将 LLM 集成到您的客户服务系统中,自动化回答常见问题通过 LLM 生成博客文章、产品描述、营销材料等将LLM与各种任务管理系统集成,如 Trello、Slack,自动化项目和任务管理分析大型数据集并生成报告或摘要。识别趋势、模式,产生洞察起草电子邮件、社交媒体更新等,生成清晰、专业的内容

什么是工作流

  • 工作流起源于生产组织和办公自动化领域
  • 指在计算机应用环境下,对业务过程的部分或整体进行自动化处理
  • 通过将复杂的任务分解成**定义良好的任务或角色(节点),并按照一定的规则和过程**来执行这些步骤中的任务,从而降低系统复杂度,减少对提示词技术和模型推理能力的依赖,提高 LLM 应用在复杂任务中的性能,提升系统的可解释性、稳定性和容错性

思考环节

  • 一个很复杂的任务场景,有如下两种解决方案

    第一种是用一个由多个指令组成,但描述清晰的较长结构化提示词去实现;

    第二种是先对任务进行拆解,再逐个将子任务去实现

    • 请问哪个方案更好?
  • 第二种更好
    
    因为当前大模型并不是万能的,丢给它的一连串指令并不能全部完美地执行
    
    [提示工程]是把大模型当成人来指导去完成一些任务,
    不同模型就对应着不同能力的人,不同阶段的人
    
    比如:OpenAI的o1模型在理科方面的能力达到了人类博士级水平,
    
    因此了解大模型能力的强弱有助于我们判断在当前场景下是否需要对任务进行拆解,进而再去考虑如何设计工作流和提示词
    
    每个[复杂任务]的底层都可以拆解为[一些子任务],通过[人工设计中间环节],让LLM先输出一些中间步骤的结果,这些中间结果可以作为后续环节的输入,然后再回答最终问题,这样就能将子任务连接起来进而实现整个复杂任务
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11





    ## 实践教程:意图识别智能体Bot

    ### 任务说明

    - 4个需求

–> 第一个:对文本进行情感分析并回复两个字的分析结果:积极、消极、中性

–> 第二个是能够生成任意位数的随机数,默认生成8位数的随机数

–> 第三个联网搜索相关主题的内容并获取第一个网页的所有content

–> 第四个是查询当前国内精确到区/县/镇的未来n天的天气情况并让LLM生成出行建议

–> 除此之外:希望有其它需求的时候可以询问大模型获得答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125



### 设计思路

- 通过了解coze上[工作流的组件使用](https://www.coze.cn/docs/guides/workflow),初步设计出如下的流程图

![image-20241019164757443](image-20241019164757443.png)



### 动手实践

- 首先登入[COZE网站](https://www.coze.cn/)
- 打开工作空间,进入后默认是个人空间
- 在其下方选择资源库
- 最后在右上角点击资源按钮,在弹出的列表中点击**工作流**

![动手实践操作流程1](image-20241019170044397.png)

- 填写工作流名称和工作流描述

![填写工作流详细信息](image-20241019175716300.png)

- **`点击确定`**进入了工作流设计界面,画板中默认出现**开始和结束节点**
- 按照设计出的流程图,在左侧的组件中选择了**意图识别节点**,并依次增加了四个意图:

1. 用户想要对输入文本进行情感分析;
2. 用户想要生成随机数;
3. 用户想要联网搜索相关资料;
4. 用户想要查询天气。

- 这样就搭建好了一个初步的框架,只需要专注于思考如何解决每个子任务

![工作流设计界面](image-20241019180557311.png)

- 两个工作流概念:【简单工作流】【复杂工作流】

- **<u>简单工作流</u>**

> 除了开始和结束,仅添加一个节点所构建的工作流

- **<u>复杂工作流</u>**

> 通过多节点组合所构建的逻辑较复杂的工作流

- 于是考虑把每个子任务做成<u>简单工作流</u>或者是<u>由多节点组成但不算特别复杂的工作流</u>,然后把它们通过**工作流组件**导入到**意图识别工作流**中
- 这样每个子任务对应的工作流还可以在以后的场景中**复用**



#### 情感分析工作流

- 工作流名称:`sentiment_classify`
- 工作流描述:`Useful for when you want to classify the sentiment of a context`
- 工作流节点组成:`开始节点,大模型节点,结束节点`

![情感分析工作流](image-20241019181516125.png)



##### 开始节点

![开始节点](image-20241019181750854.png)



##### 大模型节点(用于生成情感分析结果)

- 模型选择和输入

![模型选择](image-20241019183716308.png)



- 提示词

```Python
DEFINE ROLE AS "NLP专家":
知识领域 = ["语言学", "互联网", "人工智能"]
技能 = ["自然语言理解", "信息提取", "情感分析", "意图识别", "知识推理", "上下文关联学习", "实体识别"]
经验 = "资深"
任务 = "对文本进行情感分类,将其分类至对应的情感类别"

# 定义情感类别
sentiment_category_infos = [
{"category": "积极", "description": "文本内容表达正面情绪或态度,如快乐、满意、希望等。通常包含赞扬、鼓励或对未来的乐观预期等内容。"},
{"category": "消极", "description": "文本内容体现负面情绪或态度,如悲伤、愤怒、失望等。通常反映批评、不满或对现状或未来的悲观看法等内容。"},
{"category": "中性", "description": "文本内容既不表达明显的正面情绪,也不体现明显的负面情绪。通常包含客观陈述、信息传递或对事物的中立评价等内容。"}
]

# 判断文本表达的情感是否符合给定的情感类别描述
def match_description(context, description):
"""
Step1: 一步步思考,仔细分析并理解${context}的特征和含义,判断是否和${description}的描述一致。
Step2: 给出你判断的思考路径${thought},在思考路径下给出你将${context}分类为${category}的理由。
Step3:根据你Step1的判断结果和Step2的分类理由,给出此次分类的置信度${confidence},置信度的取值范围为:0 <= confidence <= 1。
"""
return confidence

# 根据文本表达的情感分类,并返回对应的情感类别
def classify(context, sentiment_category_infos):
# 初始化最高置信度
max_confidence = 0

# 遍历所有的类别及其描述
for sentiment_category_info in sentiment_category_infos:
# 获取当前类别的置信度
confidence = match_description(context, sentiment_category_info["description"])

# 如果当前置信度高于之前的最高置信度,更新分类结果
if confidence > max_confidence:
max_confidence = confidence
category = sentiment_category_info["category"]

return {"classify_result": category}

MAIN PROCESS:
# 初始化文本变量,作为输入数据
context = 读取("""{ {input} }""")

# 执行分类任务,输出分类结果
classify(context, sentiment_category_infos)

执行工作流程,严格按照json格式输出MAIN PROCESS的分类结果,禁止附加任何的解释和文字描述:
结束节点

结束节点设置

  • 测试数据和结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
测试数据1:
这款产品真是太棒了!👍从外观设计到使用体验,都让我非常满意。😍细节之处体现了厂家的用心,使用起来非常便捷,大大提高了我的工作效率。🚀售后服务也非常到位,遇到问题时,客服人员耐心解答,让我感受到了贴心的关怀。🌟总之,这是一次非常愉快的购物体验,强烈推荐给大家!👏继续保持,期待更多优质产品!🎉
测试数据1结果:
{"classify_result":"积极"}

测试数据2:
这次的旅行体验实在让我感到失望。🙁首先,行程安排得非常不合理,几乎每天都在赶路,没有足够的时间去好好欣赏景点,更别提休息了。🚗住宿条件也远低于预期,房间不仅小而且卫生状况令人担忧。🛏️导游的态度也让人不敢恭维,讲解敷衍了事,对于我们的问题也是爱理不理。🙉餐饮方面更是让人失望,所谓的特色菜肴不仅口味一般,卫生状况也让人担忧。🍽️整个旅行过程中,我感觉像是被赶鸭子一样,完全没有享受到旅游的乐趣。🥱总之,这次旅行体验非常差,我不会推荐给我的朋友,希望旅行社能够改进服务,以免让更多的游客失望。📉
测试数据2结果:
{"classify_result":"消极"}

测试数据3:
我今天吃了饭。
测试数据3结果:
{"classify_result":"中性"}

生成随机数工作流

  • 工作流名称:random_number
  • 工作流描述:Useful for when you want to generate a random number
  • 工作流节点组成:开始节点,大模型节点,代码节点1,代码节点2,结束节点

生成随机数工作流的流程图

生成随机数工作流的最后效果

开始节点

开始节点

大模型节点

用于提取出随机数长度

  • 模型选择和输入

模型选择和输入

  • 提示词
1
2
3
4
5
6
7
8
9
10
DEFINE ROLE AS "信息提取专家":
任务 = "提取出用户随机数需求中的随机数长度"

complete_user_input: str = 补全用户输入({ {input} })
input_length: int = 提取随机位数(complete_user_input) if 提取随机位数(complete_user_input) != None else Default(8)

识别用户的输入,严格按照json格输出input_length的结果,禁止输出任何附加的解释和文字描述:
​```json
{"input_length": input_length}
​```
  • 输出

输出节点设置

代码节点1

用于解析出input_length

  • 输入

输入节点效果

  • 代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import json
import re

async def main(args: Args) -> Output:
params = args.params['input']

def extracted_json(text):
code_pattern = r'{.*}'
code_match = re.search(code_pattern, text, re.DOTALL)
Extracted_json = code_match.group() if code_match else None
try:
res = json.loads(Extracted_json)['input_length']
except Exception as e:
res = None
return res

ret: Output= {"input_length": extracted_json(params)}
return ret
代码节点2

用于生成随机位数

  • 输入

代码节点2的输入

  • 代码
1
2
3
4
5
6
7
8
9
import random
import string

async def main(args: Args) -> Output:
params = int(args.params['length'])
characters = string.ascii_lowercase + string.digits
ret: Output = {"random": ''.join(random.choice(characters) for _ in range(params))}

return ret
  • 输出

代码节点2的输出

结束节点
  • 结束节点的设置

  • 测试数据和结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
测试数据1:
生成一个随机数
测试数据1结果:
13a9111a

测试数据2:
生成一个5位随机数
测试数据2结果:
11169

测试数据3:
生成一个20位随机数
测试数据3结果:
13a9111a1e0129172121

测试数据4:
生成一个8随机数
测试数据4结果:
12221f21
  • 运行结果1

运行结果1

必应搜索工作流

插件参数情况
  • Coze官方介绍:

  • 其中插件输出参数的信息如下:

  • 输出返回值字段介绍

参数名参数类型参数说明
codeNumber响应的状态码。不同的数值代表不同的状态,例如成功(0)、错误、异常等
dataObject包含实际请求数据的响应部分,在请求成功时使用,返回的是调用结果的数据
log_idString日志标识符:这是一个唯一的标识符,用于追踪和识别特定的API请求或操作。在日志记录和调试过程中,log_id 非常有用,因为它允许开发人员或支持团队通过这个标识符在系统日志中查找与特定请求相关的详细信息
msgString消息:这是一个描述性的字段,它提供了关于API调用结果的额外信息,用以解释code的具体含义。这通常包括成功操作的确认、错误描述、警告或其他任何需要通知用户的信息。例如,如果API调用成功,msg 返回Success;如果调用失败,则返回Failure
response_for_modelString根据用户问题搜索返回得到的结果:[5个问题对应的链接和网页内容描述]
  • 其中data参数包含了问题query搜索出的网页的信息,其内部参数描述如下:
参数名参数类型参数说明
typeStringdata的返回值为字符串文本
imagesObject根据用户问题搜索出的网页中内含的图片信息,重点信息在value参数里
queryContextObject其下有originalQuery,对应用户原始问题的文本
rankingResponseObject在输入参数里count值对应搜索网页个数的结果响应并排序
videosObject根据用户问题搜索出的网页中内含的视频信息,重点信息在value参数里
webPagesObject根据用户问题搜索出的网页中内含的网页信息,重点信息在value参数里
工作流创建信息
  • 工作流名称:search_test
  • 工作流描述:Useful for when you want to use search_test
  • 工作流节点组成:开始节点,插件节点1,代码节点,插件节点2,结束节点

工作流示意图

必应搜索插件

链接读取插件

开始节点

开始节点设置

必应搜索插件

必应搜索插件

代码节点
  • 引用必应搜索插件输出的response_for_model参数

代码节点设置

  • 代码
1
2
3
4
5
6
7
8
9
10
11
import json
import re

async def main(args: dict) -> Output:
parsed_data = json.loads(args.params['input'])
for item in parsed_data:
regex = r"link:(http[s]?://[^\s]+)"
match = re.search(regex, item)
if match:
return {"url": match.group(1).replace('\n','')}
return {"url": ""}
链接读取插件

链接读取插件

结束节点

结束节点设置

  • 回答内容
1
2
3
4
## 搜索网页
[{ {output.title} }]({ {url} })
## 网页全文
{ {output.content} }
  • 测试数据和结果
1
2
3
4
5
6
7
8
测试数据1:
什么是AI?
测试数据1结果:
## 搜索网页
[AI知识科普①:AI的定义、起源、发展、案例](http://m.toutiao.com/group/7372498851418260006/)
## 网页全文
发布时间为2024-05-24 17:40:57AI时代到来,你是否了解AI的定义及其起源?这篇文章里,作者做了相关的分享,或许可以帮你更加了解AI这个行业。大家好,今天的更新是AI科普系列的第一期。首先我们要知道:AI和人工智能是完全一致的概念,AI即Artificial Intelligence是人工智能英文单词的缩写。(在所有以后的分享中,作者将优先使用汉语进行表达,避免给大家带来认知负担。)一、AI的定义人工智能(AI)是模拟人类智能,使计算机系统能够学习、推理、感知、以解决问题的一门科学。在人工智能的早期阶段,主要是模拟人类的能力,一个最简单的例子是计算机能像人一样计算出2+3的结果是5,但这种能力仅仅是固定的程序,还远不是我们今天所说的人工智能。在这个过程中,参考人类的能力分类,逐渐把人工智能的能力分成了:认知、处理、表达、决策等等方面的能力。拿设计师非常熟悉的MJ产品而言,就是【表达】这一方面中细分的【通过图像进行表达】的能力。而ChatGPT则是融合了认知、处理、表达等等多方面能力的产品,加上极高的成熟程度,才在近年引爆了人工智能概
.......(此处省略若干字)

自分の运行结果

天气查询工作流

工作流创建设置
  • 工作流名称:weather_search
  • 工作流描述:useful for when you want to search for weather information
  • 工作流节点组成:开始节点,代码节点,大模型节点1,天气插件,大模型节点2,结束节点

天气查询工作流示意图

天气插件添加

开始节点

开始节点设置

代码节点

代码节点设置

  • 代码:
1
2
3
4
5
from datetime import datetime

async def main(args: dict) -> Output:
current_date :Output= {"date": datetime.now().strftime("%Y-%m-%d")}
return current_date
大模型节点1

大模型节点1-设置

  • 提示词
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
你现在要完成一个信息提取任务,请根据用户输入提取相关天气参数。

用户输入: { {input} }

待提取的天气参数:
1. city: 从用户输入中提取市名,包括直辖市,比如:北京市、天津市、上海市、重庆市
2. province: 从用户输入中提取省份名(如果有),不要包括直辖市(比如:北京、北京市、北京省、天津市、上海市、重庆市)
3. towns: 从用户输入中提取区/县/镇名(如果有)
4. villages: 从用户输入中提取乡/村名(如果有)
5. start_time: 根据用户输入的时间信息提取开始日期(格式: YYYY-MM-DD)
6. end_time: 根据用户输入的时间信息提取结束日期(格式: YYYY-MM-DD)

示例提取:
- 输入: "青岛市即墨区的天气如何?"
- city: "青岛市"
- province: "山东省"
- towns: "即墨区"
- start_time: "2024-10-7"
- end_time: "2024-10-13"

用户查询天气的当前时间:{ {date} }
天气插件节点

天气插件节点设置

大模型节点2

大模型节点2-设置

  • 提示词
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# Role: 出行提示小助手
## Profile:
- author: kie
- version: 0.1
- language: 中文
- description: 根据天气插件返回的天气信息,生成针对用户的出行提示和建议。

## Goals:
- 理解天气信息,结合用户可能的活动,生成实用的出行提示和建议。

## Constrains:
- 生成的提示和建议需要根据具体的天气情况来定制。

## Skills:
- 擅长理解并应用天气信息。
- 精通用户行为分析,能够根据天气情况提出合理的出行建议。

## Workflows:
1. 分析天气插件返回的天气信息。
2. 根据天气情况,结合用户可能的活动,生成出行提示和建议。
3. 输出提示和建议。

## Example:
- Weather_info:
{
"data": [
{
"condition": "小雨",
"humidity": 91,
"predict_date": "2024-07-18",
"temp_high": 29.66,
"temp_low": 25.98,
"weather_day": "小雨",
"wind_dir_day": "东南风",
"wind_dir_night": "东南风",
"wind_level_day": "3",
"wind_level_night": "3"
},
{
"condition": "小雨",
"humidity": 91,
"predict_date": "2024-07-19",
"temp_high": 29.95,
"temp_low": 25.73,
"weather_day": "小雨",
"wind_dir_day": "东南风",
"wind_dir_night": "东南风",
"wind_level_day": "3",
"wind_level_night": "3"
},
{
"condition": "小雨",
"humidity": 90,
"predict_date": "2024-07-20",
"temp_high": 29.96,
"temp_low": 25.86,
"weather_day": "小雨",
"wind_dir_day": "东南风",
"wind_dir_night": "东南风",
"wind_level_day": "3",
"wind_level_night": "3"
}
]
}
- OutputFormat:
| 日期 | 天气状况 | 相对湿度 | 温度(最低~最高) | 白天风向 | 白天风力 |
|----------|--------|--------|------------|--------|--------|
| 2024-07-18 | 小雨 | 91 | 25.98~29.66 | 东南风 | 3 |
| 2024-07-19 | 小雨 | 91 | 25.73~29.95 | 东南风 | 3 |
| 2024-07-20 | 小雨 | 90 | 25.86~29.96 | 东南风 | 3 |

根据2024年7月18日到2024年7月20日的天气情况,我将给您如下出行提示和建议:

1. **天气状况**: 未来三天均为小雨,湿度较高(约90%)。
2. **温度范围**: 最高气温在29.96°C左右,最低气温在25.73°C左右,适合穿着轻便的雨具。
3. **风向与风力**: 风向为东南风,风力等级为3级,出行时注意风力对雨伞的影响。
4. **出行建议**:
- 建议携带雨具(雨伞或雨衣),以应对小雨天气。
- 注意路面湿滑,行车或步行时请小心。
- 如果有户外活动计划,建议选择室内活动或适当调整时间。
5. **健康提示**: 高湿度天气可能导致不适,保持适当的水分摄入,避免长时间在潮湿环境中逗留。

请根据以上信息合理安排出行计划,确保安全与舒适。

## 天气信息
{{input}}

## OutputFormat:
| 日期 | 天气状况 | 相对湿度 | 温度(最高/最低) | 白天风向 | 白天风力 |
|----------|--------|--------|------------|--------|--------|
| 日期1 | 天气状况1 | 相对湿度1 | 最低温度1~最高温度1 | 白天风向1 | 白天风力1 |
...
| 日期n | 天气状况n | 相对湿度n | 最低温度n~最高温度n | 白天风向n | 白天风力n |

根据{{start_time}}到{{end_time}}的天气情况,我将给您如下出行提示和建议:

1. **天气状况**:
2. **温度范围**:
3. **风向与风力**:
4. **出行建议**:
5. **健康提示**:

请根据以上信息合理安排出行计划,确保安全与舒适。
结束节点

结束节点设置

测试数据和结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
测试数据1:
查询杭州滨江市明天的天气
测试数据1结果:
| 日期 | 天气状况 | 相对湿度 | 温度(最高/最低) | 白天风向 | 白天风力 |
|----------|--------|--------|------------|--------|--------|
| 2024-10-12 | 小雨 | 82 | 19~25 | 东北风 | 4 |

根据 2024 年 10 月 12 日的天气情况,我将给您如下出行提示和建议:

1. **天气状况**: 2024 年 10 月 12 日为小雨天气,相对湿度较高为 82%。
2. **温度范围**: 最高气温 25°C,最低气温 19°C,温度较为适宜,但由于小雨天气,体感可能会稍凉。
3. **风向与风力**: 白天风向为东北风,风力等级为 4 级。夜间风向为西风,风力等级为 3 级。出行时注意风力较大可能对雨伞等雨具的影响。
4. **出行建议**:
- 携带雨具,如雨伞或雨衣,以应对小雨天气。
- 由于风力较大,注意固定好容易被风吹走的物品。
- 路面可能会因雨水而湿滑,行车或步行时要小心谨慎。
5. **健康提示**: 高湿度天气可能会让人感觉不适,注意保持适当的水分摄入,避免长时间在潮湿环境中逗留,以防感冒等疾病。

请根据以上信息合理安排出行计划,确保安全与舒适。


测试数据2:
查询杭州滨江市未来一周的天气
测试数据2结果:
| 日期 | 天气状况 | 相对湿度 | 温度(最高/最低) | 白天风向 | 白天风力 |
|----------|--------|--------|------------|--------|--------|
| 2024-10-11 | 晴 | 65 | 15~26 | 东北风 | 3 |
| 2024-10-12 | 多云 | 79 | 18~25 | 东风 | 4 |
| 2024-10-13 | 小雨 | 84 | 20~26 | 东风 | 4 |
| 2024-10-14 | 小雨 | 84 | 20~27 | 东北风 | 3 |
| 2024-10-15 | 小雨 | 90 | 21~26 | 东北风 | 3 |
| 2024-10-16 | 小到中雨 | 92 | 21~24 | 北风 | 1 |
| 2024-10-17 | 阴 | 86 | 21~28 | 东风 | 3 |

根据 2024-10-11 到 2024-10-17 的天气情况,我将给您如下出行提示和建议:

1. **天气状况**:未来几天天气多变,有晴、多云、小雨和阴等不同天气状况,且在周末及下周初有连续的小雨和小到中雨天气。
2. **温度范围**:最高气温在 28°C 左右,最低气温在 15°C 左右,早晚温差较大,注意适时增减衣物。
3. **风向与风力**:风向主要为东北风、东风和北风,风力在 1 到 4 级之间,风力不大,但仍需注意风向对出行的影响。
4. **出行建议**
- 晴和多云天气时,可以适当进行户外活动,但需注意防晒。
- 小雨和小到中雨天气时,携带雨具(雨伞或雨衣),注意路面湿滑,行车和步行时要小心谨慎。
- 由于天气变化较大,出行前查看天气预报,合理安排行程。
5. **健康提示**:较高的相对湿度可能会让人感觉不适,注意保持室内通风,避免长时间处于潮湿环境中。同时,注意根据天气变化及时调整穿着,预防感冒等疾病。

请根据以上信息合理安排出行计划,确保安全与舒适。

自分の运行结果

意图识别工作流

工作流创建
  • 工作流名称:Intent_Recognition
  • 工作流描述:Useful for when you want to use Intent_Recognition
  • 工作流节点组成:开始节点,意图识别节点,工作流节点1~4,大模型节点,代码节点,结束节点

意图识别工作流示意图

开始节点

开始节点

意图识别节点

意图识别节点设置

五个并列节点

第一个并列节点

第二个并列节点

第三个并列节点

第四个并列节点

第五个并列节点

代码节点

代码节点设置

  • 代码
1
2
3
4
5
6
7
async def main(args: Args) -> Output:
params = args.params
res = [params[key] for key in params if params[key] and key!="TAKO_BOT_HISTORY" and key!="FLOW:workflow:called_plugin_ids"][0]
ret: Output = {
"res": res
}
return ret
结束节点

结束节点设置

  • 自分の尝试

自分の创建结果

工作流智能体

  • 在coze中,工作流可以被嵌入在单Agent模式中,也可以作为一个工作流Agent单独使用,具体看官方文档介绍

工作流模式Agent

效果呈现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
测试数据1
分析如下文本情感:这款产品真是太棒了!👍从外观设计到使用体验,都让我非常满意。😍细节之处体现了厂家的用心,使用起来非常便捷,大大提高了我的工作效率。🚀售后服务也非常到位,遇到问题时,客服人员耐心解答,让我感受到了贴心的关怀。🌟总之,这是一次非常愉快的购物体验,强烈推荐给大家!👏继续保持,期待更多优质产品!🎉

测试数据2
生成一个随机数

测试数据3
搜索如下内容:什么AI

测试数据4
查询杭州未来三天的天气

测试数据5
帮我生成一首以国庆为主题的现代诗

探索:工作流智能体案例

案例拆解:汉语新解搭子

  • 智能体地址:汉语新解搭子 - 扣子 AI 智能体

  • 智能体描述:

    这是一个集才华与幽默于一身的汉语AI助手,它拥有Oscar Wilde的机智、鲁迅的深刻和林语堂的风趣。擅长用独特的视角解读汉语词汇,通过隐喻和讽刺幽默,一针见血地揭示事物本质,并以卡片形式呈现为用户带来全新的汉语学习体验,引领大家探索汉语的奇妙世界

  • 智能体效果体验:大学生程序员爱情

智能体效果体验:大学生

智能体效果体验:程序员

智能体效果体验:爱情

智能体效果体验:人

工作流设计

  • 工作流名称:hanyuxinjie
  • 工作流描述:汉语新解工作流
  • 设计思路:先将卡片呈现的布局结构先转为html代码来实现;然后在卡片中对应的文本位置,利用大模型来做内容生成;最后将html呈现的界面利用插件转为在线图片,利用markdown语法在BOT聊天界面显示图片

汉语新解-工作流示意图

工作流组成

开始节点

  • 输入 --> BOT_USER_INPUT

大模型节点1

大模型节点1

大模型节点2和3

大模型节点2

大模型节点3

消息节点

消息节点

大模型节点4

大模型节点4

大模型节点4-续

文本处理节点

文本处理节点

字符串拼接内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
<!-- 文档类型声明,指定这是一个HTML5文档 -->
<!DOCTYPE html>

<!-- HTML文档的根元素,lang属性指定文档的语言为中文 -->
<html lang="zh">

<head>
<!-- 定义文档的元数据,包括字符集和视口设置 -->
<meta charset="UTF-8"> <!-- 设置文档的字符编码为UTF-8 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- 设置视口宽度为设备宽度,初始缩放比例为1.0 -->

<!-- 定义文档的标题,显示在浏览器标签页上 -->
<title>汉语新解卡片</title>
<link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;700&family=Noto+Sans+SC:wght@300;400&display=swap" rel="stylesheet">
<!-- 导入Google字体,为页面提供中文字体 -->

<!-- 定义内部样式表,用于设置页面元素的样式 -->
<style>
:root {
/* 定义CSS变量,用于存储颜色值,方便后续修改和维护 */
--background-color: {{String1}}; /* 页面背景颜色 */
--card-background: {{String2}}; /* 卡片背景颜色 */
--header-background: {{String3}}; /* 头部背景颜色 */
--header-text-color: {{String4}}; /* 头部文字颜色 */
--main-text-color: {{String5}}; /* 主要文字颜色 */
--sub-text-color: {{String6}}; /* 次要文字颜色 */
--divider-color: {{String7}}; /* 分隔线颜色 */
--accent-color: {{String8}}; /* 强调色 */

/* 定义文本样式变量 */
--title-font-size: 24px; /* 标题字体大小 */
--main-word-font-size: 28px; /* 主要词语字体大小 */
--sub-word-font-size: 16px; /* 次要词语字体大小 */
--explanation-font-size: 18px; /* 解释字体大小 */
--background-text-font-size: 150px; /* 背景文字字体大小 */

/* 定义间距变量 */
--card-padding: 20px; /* 卡片内边距 */
--content-spacing: 10px; /* 内容间距 */
}

/* 设置页面背景和居中显示 */
body, html {
margin: 0; /* 移除默认的边距 */
padding: 0; /* 移除默认的内边距 */
height: 100%; /* 设置高度为100% */
display: flex; /* 使用flex布局 */
justify-content: center; /* 水平居中 */
align-items: center; /* 垂直居中 */
background-color: var(--background-color); /* 使用变量设置背景颜色 */
font-family: 'Noto Sans SC', sans-serif; /* 设置字体 */
color: var(--main-text-color); /* 使用定义的文字颜色变量 */
}

/* 设置卡片样式 */
.card {
width: 300px; /* 设置卡片宽度 */
height: 500px; /* 设置卡片高度 */
background-color: var(--card-background); /* 使用变量设置卡片背景颜色 */
border-radius: 10px; /* 设置圆角边框 */
box-shadow: 0 20px 40px rgba(0,0,0,0.1); /* 添加阴影效果 */
overflow: hidden; /* 隐藏溢出的内容 */
position: relative; /* 相对定位,为子元素提供定位上下文 */
display: flex; /* 使用flex布局 */
flex-direction: column; /* 设置布局方向为垂直 */
}

/* 设置卡片头部样式 */
.card-header {
background-color: var(--header-background); /* 使用变量设置头部背景颜色 */
color: var(--header-text-color); /* 使用变量设置头部文字颜色 */
padding: 20px; /* 设置内边距 */
text-align: left; /* 设置文本对齐方式为左对齐 */
position: relative; /* 相对定位,确保标题在卡片内容之上 */
z-index: 1; /* 设置堆叠顺序,确保标题在上方 */
}

/* 设置卡片头部标题样式 */
.card-header h1 {
margin: 0; /* 移除默认外边距 */
font-size: var(--title-font-size); /* 使用变量设置字体大小 */
font-family: 'Noto Serif SC', serif; /* 设置字体 */
font-weight: 700; /* 加粗字体 */

}

/* 设置卡片内容区域样式 */
.card-content {
padding: var(--card-padding); /* 使用变量设置内边距 */
display: flex; /* 使用flex布局 */
flex-direction: column; /* 设置布局方向为垂直 */
flex-grow: 1; /* 允许内容区域填充剩余空间 */
}
/* 定义词汇区域样式 */
.word {
text-align: left; /* 设置文本对齐方式为左对齐 */
margin-bottom: 20px; /* 设置底部外边距 */
}

/* 设置主要词语样式 */
.word-main {
font-family: 'Noto Serif SC', serif; /* 设置字体 */
font-size: var(--main-word-font-size); /* 使用变量设置字体大小 */
color: var(--main-text-color); /* 使用变量设置文字颜色 */
margin-bottom: var(--content-spacing); /* 使用变量设置底部外边距 */
margin-bottom: 20px; /* 设置底部外边距 */
position: relative; /* 相对定位,用于定位下划线 */
}
/* 使用伪元素为主要词汇添加下划线 */
.word-main::after {
content: ''; /* 伪元素的内容为空 */
position: absolute; /* 绝对定位,相对于最近的定位祖先元素 */
left: 0; /* 从左侧开始定位 */
bottom: -5px; /* 向下偏移,位于文字下方 */
width: 50px; /* 设置下划线的宽度 */
height: 3px; /* 设置下划线的高度 */
background-color: var(--accent-color); /* 使用定义的强调颜色变量作为下划线颜色 */
}

/* 设置次要词语样式 */
.word-sub {
font-size: var(--sub-word-font-size); /* 使用变量设置字体大小 */
color: var(--sub-text-color); /* 使用变量设置文字颜色 */
margin: 5px 0; /* 设置垂直外边距 */
}

/* 设置分隔线样式 */
.divider {
width: 100%; /* 设置分隔线宽度为100% */
height: 1px; /* 设置分隔线高度 */
background-color: var(--divider-color); /* 使用定义的分隔线颜色变量 */
margin: 20px 0; /* 设置垂直外边距 */
}

/* 设置解释文本样式 */
.explanation {
font-size: var(--explanation-font-size); /* 使用变量设置字体大小 */
color: {{String15}}; /* 使用变量设置文字颜色 */
line-height: 1.6; /* 设置行高 */
text-align: left; /* 设置文本对齐方式为左对齐 */
flex-grow: 1; /* 允许解释区域填充剩余空间 */
display: flex; /* 使用flex布局 */
flex-direction: column; /* 设置布局方向为垂直 */
justify-content: center; /* 垂直居中内容 */


border-left: 3px solid var(--accent-color); /* 使用变量设置左侧边框颜色 */
padding-left: 10px; /* 设置左侧内边距 */
position: relative; /* 相对定位,用于定位边框 */
padding-left: 20px; /* 设置左侧内边距 */
}

/* 设置背景文字样式 */
.background-text {
position: absolute; /* 绝对定位,相对于卡片定位 */
font-size: var(--background-text-font-size); /* 使用变量设置字体大小 */
color: var(--main-text-color); /* 设置文字颜色 */
z-index: 0; /* 设置堆叠顺序,确保背景文字在卡片内容下方 */
opacity: 0.10;/* 字体透明度 */
top: 50%; /* 从顶部向下偏移50% */
left: 50%; /* 从左侧向右偏移50% */
transform: translate(-50%, -50%); /* 使用transform属性进行水平和垂直居中 */
font-weight: bold; /* 设置字体加粗 */
}
</style>
</head>

<!-- HTML文档的主体部分 -->
<body>
<!-- 卡片容器 -->
<div class="card">
<!-- 卡片头部 -->
<div class="card-header">
<!-- 卡片标题 -->
<h1>汉语新解</h1>
</div>
<!-- 卡片内容区域 -->
<div class="card-content">
<!-- 主要词语 -->
<div class="word-main">{{String9}}</div>
<!-- 次要词语,可以有多个 -->
<div class="word-sub">{{String10}}</div>
<div class="word-sub">{{String11}}</div>
<div class="word-sub">{{String12}}</div>
<!-- 分隔线 -->
<div class="divider"></div>
<!-- 解释文本 -->
<div class="explanation">
{{String13}}
</div>
</div>
<!-- 背景文字 -->
<div class="background-text">{{String14}}</div>
</div>
</body>

</html>

插件节点

插件节点

结束节点

结束节点

思考

  • 能否利用图像流或者coze的卡片功能设计出类似的卡片生成智能体Bot呢?
  • 最后,试着看看能否把卡片生成的功能集成到意图识别智能体

扩展:工作流调试

  • 工作流并非仅指线性流程,可以看作包含的范围等同于一个python函数,内部可能有分支流程、包含非LLM的逻辑等等

  • 然而,在低代码平台上进行工作流调试,并不能像调试代码一样找到发生错误的所在代码行,能接收到的错误信息只有某一个节点

  • 在完成复杂任务的时候,尽量把复杂任务的子任务区分开,每个子任务用一个节点去解决

  • 这样能够很快明白工作流中哪一步出现了问题

  • 并能够快速判断到底是:

    模型能力不行 | 组件使用方式错误 | 解决任务的方式本身就行不通

链接存档 / 本文链接存档

  • Copyrights © 2024-2025 brocademaple
  • 访问人数: | 浏览次数:

      请我喝杯咖啡吧~

      支付宝
      微信