coze教程:手把手教你搭建一个智能待办事项管理智能体

前言

目的

能够记录并查询待办事项,例如,记录行程记录,并可以查询细节,如时间,地点等信息。

目标

编辑记录待办事项工作流,可以提取用户提交的信息,并将其保存到数据库中。
编辑查询待办事项工作流,可以查询各种事项以及他的细节。例如查询某个会议的时间和地址。

概述

  • 目的是记录并查询待办事项,如行程记录,并且能够查询细节,如时间和地点。
  • 目标是编辑记录待办事项的工作流,提取用户提交的信息并将其保存到数据库中。同时,编辑查询待办事项的工作流,可以查询各种事项及其细节。
  • 架构包含数据库表创建、字段设置和工作流的详细编辑步骤。
  • 实施步骤涉及创建数据表、设置字段、添加数据库节点、使用代码节点转换数据为字符串、判断事项是否重复等。
  • 测试验证了系统在不同条件下的功能性,如成功保存、查询特定事项、处理重复事项和错误信息。
  • Agent角色是一个助手,协助完成记录待办事项和查询代办事项的任务

实施

架构

coze待办事项架构图.png

前期准备

创建数据表

  1. 添加一个新的表todo_list

设为单用户模式

  1. 字段设置

设置三个字段,分别是do_des对应事项概括描述,do_content对应事项详情,事项信息的原文,create_at对应创建时间。

image.png

记录待办事项工作流

流程图

image.png

详细步骤

点击添加工作流并点击创建工作流,进入工作流编辑面板。

part.1 判断内容是否重复

第一个节点

首先添加一个数据库节点,用来查询最近7天内的全部记录

查询语句如下:

SELECT do_des, do_content FROM todo_list WHERE create_at>= DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY)

提示:

查询时不支持 select *

image.png

输出参数:

outputList,系统默认
rowNum,系统默认

第二个节点

使用代码节点,用来将查询数据库得到的数据转换为一个字符串,以便作为上下文提供给大模型

输入参数:

list,引用各个数据库查询的输出outputList

代码如下:

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
import dayjs from 'dayjs';
async function main({ params }: Args): Promise<Output> {
let status = 0
let data = ''
let data_arr:string[] = []
const time = dayjs().format('YYYY-MM-DD HH:mm:ss')

const {list} = params

if(list.length > 0) {
status = 1
list.forEach((value, index) => {
data_arr.push(
`
事项 ${index + 1}
${value['do_content']}
`)
})
}

data = data_arr.join('\n\n')
const ret = {
"status": status,
"data": data,
"time": time,
};

return ret;
}

输出参数:

status,判断查询结果是否为空,如果为空则直接到第三步。
data,将数据库查询结果转为字符串的结果。
time,当前的时间

第三个节点
使用选择器节点,用来判断数据库查询结果是否为空,如果为空则直接生成摘要以及后续动作,否则需要判断已经保存过类似的事项。
image.png

判断事项是否重复

通过大模型来判断事项是否重复
添加一个大模型节点,因为doto_list参数的值可能会比较长,因此我们尽量使用上下文较长的模型。
image.png

输入参数:

todo_list,引用代码节点的输出参数data
data,引用开始节点的输入参数input

提示词:

角色

作为一个事项管理的专业人士,帮我总结事项,和判断事项是否有重复。

上下文

当前已经存在的事项如下:

行动

判断新的事项是否已经存在于已经存在的事项列表中,如果存在就返回true,否则就返回false

结果示例

true

新的事项

输出参数:

result,类型选择布尔类型

随后再添加一个判断节点

image.png

判断大模型节点的输出是否为false,如果不存在重复项则直接生成摘要并保存到数据库,否则直接返回已存在

生成摘要并保存到数据库

添加一个大模型用来生成摘要。
image.png

输入参数:

input,引用开始节点的输入input。

提示词:

角色

作为一个事项管理的专业人士,帮我总结事项。

上下文

事项的详细内容如下:

行动

总结事项内容

输出参数:
output,为生成的摘要结果。
添加一个数据库节点,用来执行保存信息。
image.png
输入参数:

do_des,引用大模型生成摘要
do_content,引用开始节点的input
time,引用当前时间

SQL语句:

INSERT INTO todo_list (do_des, do_content,create_at) VALUES (‘‘, ‘‘, ‘‘)

输出:

outputList,系统默认
rowNum,系统默认

统一输出内容

将不同的情况返回的结果进行统一处理,嘴鸥返回给结束节点。
添加一个代码节点,这个节点处理也比较简单,就是判断一下是否重复。
image.png
输入参数:

status,引用判断重复的大模型的输出结果

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
async function main({ params }: Args): Promise<Output> {
const { status } = params

let output = ''
if (status === true) {
output = '该事项已经保存过'
}else{
output = '事项保存成功'
}
const ret = {
"output": output,
};

return ret;
}

输出参数:

output,传给结束节点的内容。
结束节点选择,使用设定内容直接回答即可

image.png

查询待办事项工作流

流程图

待办事项查询流程图.png

详细步骤

数据库查询节点
查询7天内添加的待办事项
image.png
代码节点,处理数据库查询结果,将其转为字符串
image.png
代码:

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
async function main({ params }: Args): Promise<Output> {
let list = ''
let status = 0

const { outputList } = params

const list_arr:string[] = []

if(outputList.length > 0) {
status = 1
outputList.forEach((v, i) => {
list_arr.push(
`
事项 ${i+1}
${v['do_content']}
`
)
})
}

list = list_arr.join('\n\n')

const ret = {
"status": status,
"list": list,
};

return ret;
}

选择器节点
判断7天内是否有待办事项
image.png
大模型节点
处理用户的请求
image.png
输入参数:
list,引用代码节点处理的数据库查询结果
input,引用开始节点的输入参数
提示词:

角色

作为一个事项管理专家来帮助我判断,是否存在与查询事项相关的事项,如果有就返回该事项的详情

上下文

待处理事项列表如下:

动作

判断输入的查询的事项内容属于哪条事项,并返回该事项,如果没有则返回’无有关事项’,如果有就根据输入的内容返回相应的信息。
如果没有与输入相关的信息则返回‘无与您查询相关的信息’

输入

输出参数:
output,大模型的处理结果。

代码节点
将不同分支的结果统一处理为返回内容
image.png
输入参数:

result,引用大模型的处理结果
status,引用代码节点的判断7天内是否存在待办事项的结果。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
async function main({ params }: Args): Promise<Output> {
const {result, status} = params

let output = ''

if(status === 0) {
output = '无可查询的事项'
}else{
output = result
}
const ret = {
"output": output,
};

return ret;
}

输出参数:

output,输出处理结果

Agent的Prompt

image.png

角色

你是一个人工智能助手,我能够协助你完成一些工作。

技能

技能 4: 记录代办事项

  1. 当用户提交一个明确的记录代办事项的要求时,立即调用todo_list_save工作流

技能 5: 查询代办事项

  1. 当用户有查询代办事项的需求时,立即调用todo_list_search工作流

测试

测试保存待办事项

第一次输入

输入内容:

记录一个待办事项,明天上午10点,去鸟巢拜访领导,联系电话是123456789

image.png
返回内容:
image.png
能够正常的按照预想执行。

第二次输入相同的内容

image.png
image.png
也是能够正常执行。

输入一个不一样的事项

image.png
能够正常执行

尝试输入一个类似的事项

只是修改了时间
image.png
也是可以正常识别出来是两次不同的事件

尝试查询内容

image.png
失败
查看原因,是因为大模型请求的input参数不对
image.png
后期看该如何调整

换一个问题尝试

image.png
可以正常获取结果。
image.png
可以看到input值是一个符合需求的参数值。

总结

整体实现了目标,其中在执行查询工作流的时候出现了在调用工作流时传入的参数不符合预期的问题,下面需要思考如何解决。