起因
因为现在不是流行喝咖啡么,9.9真香警告。本来我是喝奶茶的,现在是咖啡奶茶化,奶茶八宝粥化,所以我现在基本上也只喝咖啡了。但是咖啡喝多了总感觉不太好,尤其是有时候心跳加速,emmmm....。所以想着最好能记录下自己的喝咖啡频率啥的,有同学会说那个app上不是有日历的么,但是吧,星巴克现在搞活动也挺多,也经常喝,加上想顺便记录下疯狂星期四的参与次数啥的,最好还是搞个工具。然后正好试试扣子好了。
需求整理
需求挺简单的
- 就是让我的bot记录下我的饮食,然后存进数据库,
- 然后可以查询,统计分析频率,给出建议等,自我约束下。
- 给出些健康建议
功能实现方案
主要用到了数据库,后来我才发现数据库就一个,我本来还以为我发布了后,用户每人一个....。不过像我这种bot,基本上也就我自己玩,所以直接忽略~
详细步骤
1,定义角色
这里没啥好说的,就简单定义了
2. 技能栏
记录用户发送的内容。
比如"我今天喝了1杯瑞幸","昨天吃了1次肯德基"。bot默认好像是带上下文的,我这里带上下文反而会影响结果,因为我只需要记录用户当前输入的内容即可。所以我会加一句"忽略上下文",然后提出要求,就是严格按照我的步骤执行。
然后是设计表结构,因为我主要针对自己的饮食这块,所以主要字段有日期,食品一级类目,二级类目,数量,附加信息(比如品牌啥的)
这样后面比较方便统计。至于分类信息我本来期望用知识库来弄,虽然搞了个知识库,但是手动调用总是没反应,估计是我的提示词不给力。以下是我的提示词
js
### 技能 1: 记录饮食行为
当用户向你发送他们的饮食记录,忽略上下文,然后你需要严格按照以下步骤来处理用户发送的信息,
1. 对用户发送的记录内容拆解分析,调用 recallKnowledge 确定一级分类信息和二级分类信息
2. 调用 TableMemory 保存到数据库中,具体存储规则如下
- 将日期信息存储到表字段的:date 中
- 将附加信息存储到表字段 extra_details 中;
- 将数量信息存储到表字段:count 中;
- 将一级分类信息存储到表字段 primary_category 中
- 将二级分类信息存储到表字段 secondary_category 中
3. 以上完成后需要回复"已为您记录"同时显示本次存储的记录内容
关于数据库,我想他应该是个内置的插件,看得到叫TableMemory,还会根据数据库返回的记录结合userReq来回答。
下面是实际效果
可以看到增加了一条记录,但是分类信息错误了,虽然我尝试过用知识库,但是应该是我的使用方式有问题,没有很好的解决这个情况。
查询数据库
用到数据库的调试起来就很麻烦,因为老改动...。后来我给提示词增加了特定内容的处理模块,参考常见的电话菜单,比如1#表示查询所有数据,9#表示删除数据库所有记录,这样效率高多了~
js
### 技能 4: 回复特定内容的提问
1. 当用户提问"1#"时,忽略上下文,调用 TableMemory 查询数据库所有数据并返回
2. 当用户提问"9#"时,调用 TableMemory 删除数据库所有数据
3. 当用户提问"2#"或是"查看最近一周的记录"时,忽略上下文,调用 TableMemory 查询数据库中日期范围是本周的所有数据并返回
4. 当用户提问"3#"时,忽略上下文,调用 TableMemory 查询数据库中日期范围是近两周的所有数据并返回
5. 当用户提问"4#"或是"查看本月的记录"时,忽略上下文,调用 TableMemory 查询数据库中日期范围是本月的所有数据并返回
6. 当用户提问"5#"或是"查看最近三个月的记录"时,忽略上下文,调用 TableMemory 查询数据库中日期范围是近 3 个月的所有数据并返回
7. 当用户提问"查看快捷命令"时,回复内容
- 所有数据:1#
- 本周数据:2#
- 近两周数据:3#
- 本月数据:4#
- 近 3 个月数据:5#
8. 当用户提问"我该如何记录我的饮食行为?"时,回复内容"只许简单的输入你吃了啥或是喝了啥就行了~"
需要注意的是如果不加"忽略上下文",返回的结果可能是不准确的。比如我上下文中有"这个月喝了几杯咖啡"的提问,虽然我定义了1#是查询所有数据,tableMemory也是实际查询了所有数据,但是回答的时候却是只有咖啡的内容