Hey Siri,记账

Hey Siri,记账

Tag
AI
chatGPT
Notion
Slug
use-siri-to-charge-up
Created
Mar 6, 2023

引子

现代社会电子支付高度发达,其带来的好处就是你可以跨域空间、时间的限制进行消费。但这对于个人来说恰也是一个弊端,正是因为电子支付太方便了,经常一不小心就会花超自己的预算。
而我选择通过记账的方式,来节制自己的消费欲望。穷是原罪。
我记账的方式也很简单——Notion 作为我的第二大脑 🧠 ——基于 Notion database 做记录。记录的信息大致如下图所示:
明细
时间
分类
金额
电动牙刷
2022/11/11
玩具
¥69
之所以没有选择专业的记账 APP,根本原因就是懒。懒的专门去用一个 APP 做一件很枯燥且并不会让我开心的事,最后变成为了记而记。Notion 作为我的第二大脑,我所有的工作流程都是围绕着 Notion 展开的,加一个记账的流程并不会带来多大心智负担。直到有一天我看到了 B 站上刷到了这样一个视频:
我惊呼:卧槽,这也太吊了!其实我之前也想过能不能直接通过自然语言的方式做数据记录,但是又一想需要用到语音识别,自然语言分析的技术,好像并不在我的能力范畴内,遂放弃。
直到它的横空出世:chatGPT!

实现

graph LR User(用户) shortcut(捷径) OpenAI(Open AI) GPT(自然语言分析) Keyword(提取 token) Notion(Notion API) User --> Siri Siri --执行--> shortcut subgraph Shortcuts shortcut --Call--> OpenAI OpenAI --GPT--> GPT GPT --> Keyword Keyword --Call--> Notion end
notion image
整体的实现流程如上图所示:
  1. 用户通过 Siri 语音输入记账信息
  1. Siri 调用捷径执行相关操作
    1. 2.1 将语音信息传递给 Open AI,Open AI 利用 GPT 模型进行自然语言分析并提取 token
      2.2 调用 Notion API,将记账信息写入 Notion 数据库中
关于如何创建捷径(Shortcuts)和调用相关 API 这里不做赘述,核心内容也是难点部分在于如何通过调用 openAI 的 GPT 模型做自然语言分析,并输出给 notion API 来更新 database。要解决这个问题,其实可以做一个反向推导。
  1. 最终我需要通过调用 notion API 的方式更新我的 database,那这里的 API Request Body 要如何生成?
  1. Request Body 是一个 JSON 字符串
    1. 比如我告诉 Siri ”昨天晚饭吃麦当劳花费了 40 元”。根据 database 中的字段,我需要收集的数据信息应该包括以下字段:
      • 类型
        • 由“晚餐”关键词推导出为”餐饮”
      • 明细 → 麦当劳
      • 时间 → 昨天(2023-03-06)
      • 价格 → ¥40
      转换成 JSON 就是:
      { "parent": { // 获取 notion database_id 的时候有个坑要注意下 // 一定要是用原始 database 的 id,不能使用基于某个 database 创建的视图的 id "database_id": "7e196654388b4df1aa8b90e37de59fe2" }, "properties": { "明细": { "title": [ { "text": { "content": "麦当劳" } } ] }, "时间": { "date": { "start": "2023-03-06" } }, ... } }
  1. 而上面的 JSON 字符串,我完全可以让 chatGPT 来帮我生成
    1. 目前 OpenAI 提供的 API 是支持连续对话的,我们可以通过预设好 prompt 的方式,把 chatGPT 训练成一个通过输入自然语言,输出固定格式 JSON 的机器人🤖。至此,核心流程就算是跑通了。
{ "model": "gpt-3.5-turbo", "messages": [ { "role": "user", "content": "你现在是一个智能的记账分析程序,帮我记录一些日常的消费,现在时间是${today},时区是${timezone},时间返回格式为 yyyy-mm-dd。除此之外,你还有一些需要注意的地方" }, { "role": "assistant", "content": "请问还有什么要注意的?" }, { "role": "user", "content": "我需要知道消费的内容,消费时间(如果不知道就用现在的时间),消费金额,消费的币种(默认是 ${defaultCurrenry}),消费分类,以及为谁付的钱。我还需要告诉你一些规则,你输出给我的是一段 json 字符串,如果能分析出是一笔消费,返回如下:{\"code\": 0, \"data\": {\"title\": \"苹果\", \"category\": \"水果\", \"cost\": 20, \"currency\": \${defaultCurrenry}\", \"time\": \${today}\", \"pay_for\": \"Tom\"}}。如果这句话并不是消费,告诉我:{\"code\": 1}。" }, { "role": "assistant", "content": "了解,请问还有什么要注意的?" }, { "role": "user", "content": "你需要留意消费发生的时间,我告诉你的日期有可能是一个相对时间,同时,你还需要注意时区的处理。" }, { "role": "assistant", "content": "好的,我明白了你的要求。请告诉我你的第一笔消费的细节。" }, { "role": "user", "content": "刚刚买菜花了 90 元" }, { "role": "assistant", "content": "{\"code\": 0, \"data\": {\"title\": \"买菜\", \"category\": \"购物\", \"cost\": 90, \"currency\": \"defaultCurrenry\", \"time\": \"today\", \"pay_for\": \"\"}}" }, { "role": "user", "content": "错误的句子" }, { "role": "assistant", "content": "{\"code\": 1}" }, { "role": "user", "content": "input" } ], "max_tokens": 500, "temperature": 0 }
 

体验

之前的记账方式
  1. 找到消费记录
  1. 打开 Notion
  1. 找到记账的 database
  1. one-by-one 填写记账信息
现在的记账方式
  1. 消费
  1. 唤起 Siri
  1. 说出我的消费信息
现在的记账方式相较于之前,明显是更加符合人性的。我每消费完一笔,直接抬起手表说一句“记账”,唤起 Siri 后告诉它我消费了什么就完事了。没有繁琐的 Notion 操作流程,不需要将一条条消费信息转换成记账信息。
什么是好的用户体验,我觉和好的用户体验首先要符合人性,什么人性?懒的人性。
对于人脑来说,其实是非常不喜欢做枯燥的重复劳动的,人之所以会有习惯,就是因为大脑不想要去对同样的事,做无用的重复思考。举个例子,我每天起床后有刷牙洗脸的习惯,所以我起床后的第一件事就是去厕所,在达到厕所前,大脑并没有明确告诉过我为什么要去厕所,而是通过养成习惯的方式“训练”我去了厕所。
话分两头,虽然通过 Siri 记账的方式非常符合人性,但是我担心的一点是,假如我养成了通过 Siri 记账的习惯,在没有“习惯”就完成了这件事,那和“节制消费欲望”的核心诉求就背道而驰了。所以对于我的核心诉求来说,记账只是其中一个环节而已,我还需要通过其他的方式来刺激我的大脑,对“是否过度消费”这件事做出一个判断。

思考

随着 chatGPT API 的开放,基于 AI 的应用呈现井喷式增长。作为一个程序员,我愈发感觉在不久的将来,基于自然语言的编程开发会占越来越高的比重。就拿这次我升级记账的过程来说,我从来没有想到过还可以这么做,直接将 AI 应用在了(伪)编码层。
对于 AI ,我个人抱有非常乐观的态度,我并不认为将来我会被 AI 所取代。AI 与我而言,是一个能让我的效率提升 X 倍的工具,我作为人所具有的主观能动性——目前来看——不是 AI 能够取代的。

参考链接

怎么让 siri 帮我记账
Updated Jun 4, 2023