1.什么是工作流?
工作流,起源于生产组织和办公自动化领域,是指在计算机应用环境下,对业务过程的部分或整体进行自动化处理。它通过将复杂的任务分解成定义良好的任务或角色(节点),并按照一定的规则和过程来执行这些步骤中的任务,从而降低系统复杂度,减少对提示词技术和模型推理能力的依赖,提高 LLM 应用在复杂任务中的性能,提升系统的可解释性、稳定性和容错性。
2.扣子平台的工作流如何构建?
扣子平台的工作流构建,可以通过先登录coze平台之后,选择工作空间,点击资源,选择工作流:
3.构建一个工作流
当前存在一个任务构建一个意图识别的任务,可以完成:1.对文本进行情感分析并回复两个字的分析结果:积极、消极、中性;2.能够生成任意位数的随机数,默认生成8位数的随机数;3.联网搜索相关主题的内容并获取第一个网页的所有content;4.查询当前国内精确到区/县/镇的未来n天的天气情况并让LLM生成出行建议;5.希望有其它需求的时候可以询问大模型获得答案。基于这5个需求来构建扣子的工作流:
1.文本情感分析工作流:
对于文本情感分析工作流需要的节点是:大模型(用来生成情感分析结果),工作流节点流程是:开始节点->大模型节点->输出节点。
其中的节点的输入和输出:
其中的提示词是:
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的分类结果,禁止附加任何的解释和文字描述:
输出是:
测试结果展示:
2.生成随机数节点:
需要添加的节点是:一个大模型组件和两个代码组件;随机数节点流程:开始节点->大模型节点->代码节点->代码节点->输出节点。
大模型节点的作用是用来识别生成的随机数的位数是多少,默认是8位数。
模型的重点在于提示词的编写:
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}
```
这就是告诉大模型来进行用户问题中的随机数位数提取。
代码节点的的作用是:根据大模型节点的位数来随机生成。
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
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
输出是:
测试结果展示:当没有设定位数的时候,默认是生成8位数。
3.必应搜索工作流:
需要添加的节点是:两个插件和一个代码块
两个插件分别是:必应搜索和链接读取
必应搜索工作流流程:开始节点->必应搜索->解析出相关的链接->链接读取-输出节点;
必应搜索节点:输入将query链接上开始节点的输出;
输出的解析:
response of model :根据用户问题搜索返回得到的结果:[5个问题对应的链接和网页内容描述]
代码节点:
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": ""}
根据上面的代码解析出链接。
链接读取节点:
输入是上面解析到的链接,输出就是从链接中得到的网页全文。
结束节点:
输出链接读取到的全文和url。
测试结果展示:
4.天气查询工作流
天气查询工作流的流程是:开始节点->代码块->大模型->插件->大模型->输出节点。
代码块的作用:用来获取当前时间;
from datetime import datetime
async def main(args: dict) -> Output:
current_date :Output= {"date": datetime.now().strftime("%Y-%m-%d")}
return current_date
输出为时间;
大模型用来获取用户的query中所含的信息:
从而大模型的输入主要有两个变量:一个是用户的query、代码块中得到的当前时间。
你现在要完成一个信息提取任务,请根据用户输入提取相关天气参数。
用户输入: {{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}}
输出是:city、province、towns、start_time和end_time。
插件的输入就是大模型的输出,根据输入得到相关地区的天气信息,传入第二个大模型,让大模型给出出行意见。
大模型节点的输入:天气插件得到的data和start_time、end_time。
大模型提示词:
# 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. **健康提示**:
请根据以上信息合理安排出行计划,确保安全与舒适。
输出就是出行的意见。
5.意图识别工作流
意图识别工作流流程:开始节点->意图识别节点->之前的四个工作流->大模型节点->输出节点。
意图识别节点:
输入:用户的query
意图识别的分类:
1.用户想要对输入文本进行情感分析
2.用户想要生成随机数
3.用户想要联网搜索相关资料
4.用户想要查询天气
这四个类别,最后还有关于不属于这四个大类的分类。
代码块:编辑代码节点,获取意图结果。
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
输出节点:{{content}}。
最后发布这几个工作流在coze平台就可以在智能体中使用。