task_03扣子工作流

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平台就可以在智能体中使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值