🐦 第7章 扣子数据库实战
📄 一句话概括

一条链:开始 → 大模型抽字段 → 代码补齐 → 插入表 → 查询回显 → 结束。 难点不在写库,在从一句人话里抽字段。演示里六句话全抽到了值,但有一格填错了。 「字段有值」和「值是对的」是两个指标。前者看着漂亮,后者才决定这张表能不能用。

📝 本章和前面几章的关系

前五节讲表和操作,这一节组装成一个东西。 这个案例在书里是「AI 登记助手」:用户说一句「明天下午三点,晨光文具的张经理来谈供货」, 它把这句拆成五个字段,写进表里。 它是第 7.3 节那四种操作的合体,也是第 8 到 16 章所有案例里唯一一个「写数据」的。 其余的案例都是读数据或者生成内容。

一、设计思路:先想清楚三件事

一、抽什么字段。 不是「能抽什么就抽什么」,是「以后要查什么」。 要按单位统计来访次数,单位就必须单独一列。 二、抽不出来怎么办。 这是设计里最要紧的一条。留空?填「未知」?还是让用户补一句? 三、谁来核。 抽完直接入库,还是先标「待确认」等人过一遍?

三件事里第二件最容易被跳过,也是这个案例成败的地方。AI 抽不全很正常,关键是别让它悄悄空着。

二、创建智能体:入口在哪

这个案例有两种做法:做成智能体,或者做成工作流挂给智能体。 做成工作流:用户说一句话,工作流依次抽字段、写库、回显。确定,看得见每一步。 做成智能体:用户可能聊两句才说要登记,智能体自己判断什么时候调工作流。灵活,但调不调由它定。

书里走的是智能体那条路。实操上建议先做工作流——能看清每步的中间值,好调。 调通之后再挂给智能体,加一段说明:「用户要登记来访信息时调用」。 这段说明就是它判断的依据,写抽象了等于没挂(第 3.1 节那个坑)。

三、智能体配置:几个关键项

人设:写「你是前台登记助手」,不用长。 工作流:挂上刚才那个,说明写清触发条件。 数据库权限:给它这张表的读写权限。注意平台没有字段级权限,给了写权限就是全字段可写。

开场白:给一句示例,比如「您可以这样说:明天下午三点,某某公司的张经理来谈供货」。 用户照着说,抽取成功率立刻高很多。 最后那一项最实用。用户不会按你的字段顺序说话,但看到示例会学着说。

四、抽取这一步:能抽到,不等于抽对

演示里六句话全抽到了五个字段的值,六行全是 5 / 5。 但最后一行有问题:「下午三点半,审计组来查账」——这句话根本没说哪一天, 规则把「下午」填进了「哪天」那一格。 字段有值 ≠ 值是对的。 这两个指标要分开看,不然登记表看着满,实际没法用。

真平台上这一步由大模型做,抽得比这个规则好,但同样的错法也会出现——把时段当日期、把职称当姓名、 把公司简称当全称。 所以设计时要把「抽成什么样才算对」写清楚:日期必须是几月几号,姓名必须是具体的人, 单位必须从已有列表里选。写清楚了,它才知道该怎么填。

五、抽不出来怎么办:三个选项

选项一,留空。 最简单,但空着的行以后查不出来——按单位统计时全被漏掉。 选项二,填「未知」。 至少能查到,也一眼能看出哪些没抽到。 选项三,标「待确认」并反问用户。 体验最好,但要多一轮对话。

演示里用的是第三种:六条记录的状态全是「待确认」,因为总有字段要人核。 这个字段的价值在于:它把「谁负责」变成了一条查询。 查「待确认」就知道还有多少没核。

六、这条链还能往哪长

往左长:加一个「查重」节点,同样的人同一天来两次时提示一下。 往右长:加一个「发通知」节点,登记完给接待人发一条消息。 往中间长:加一个「补录」分支,缺字段时反问用户一句再入库。

三条都不改骨架。这条链只有五个节点,但它是本书唯一一条「写」的链——其余案例都是读或者生成。 写数据比读数据危险得多。读错了只是答错,写错了表里就多一行脏数据,而且没有回滚。

七、动手 Demo:AI 登记助手:一句话到一行记录

六句用户原话,逐句抽五个字段:来访人、单位、事由、哪天、几点。 抽完写进表里,再看哪几格其实是空的、哪一格填错了。

def parse(s):
    u'''抽取替身:靠词表和正则。真平台这一步由大模型做。'''
    day = u''
    for w in (u'今天', u'明天', u'后天', u'周五'):
        if w in s:
            day = w
            break
    m = Q.re.search(u'(上午|下午)?\\s*([0-9]{1,2}|[一两三四五六七八九])点(半)?', s)
    hour = u'%02d:%02d' % (CN_NUM(m.group(2)) + (12 if m.group(1) == u'下午' else 0),
                            30 if m.group(3) else 0)
    return guest, company, purpose, day, hour

for s, gold in SENTS:
    Q.q(con, u'INSERT INTO visit (guest, company, purpose, day, hour, state)'
             u' VALUES (?,?,?,?,?,\'待确认\')', parse(s))

实跑输出:

--------------------------------------------------------------------
AI 登记助手:一句话到一行记录
--------------------------------------------------------------------


  ① 六句话,逐个抽
  --------------------------------------------------------------------

| 用户怎么说 | 五个字段有几个有值 |
|---|---:|
| 明天下午三点,晨光文具的张经理来谈供货 | 5 / 5 |
| 今天上午十点王工过来调试设备 | 5 / 5 |
| 后天下午两点远达物流送样品,李师傅 | 5 / 5 |
| 周五下午四点,周涛来面试 | 5 / 5 |
| 明天上午九点半,新来的实习生报到 | 5 / 5 |
| 下午三点半,审计组来查账 | 5 / 5 |


  ② 抽出来的记录
  --------------------------------------------------------------------

| vid | 来访人 | 单位 | 事由 | 哪天 | 几点 | 状态 |
|---:|---|---|---|---|---|---|
| 1 | 张经理 | 晨光文具 | 谈供货 | 明天 | 15:00 | 待确认 |
| 2 | 王工 |  | 调试设备 | 今天 | 10:00 | 待确认 |
| 3 | 李师傅 | 远达物流 | 送样品 | 后天 | 14:00 | 待确认 |
| 4 | 周涛 |  | 面试 | 周五 | 16:00 | 待确认 |
| 5 | 实习生 |  | 报到 | 明天 | 09:30 | 待确认 |
| 6 | 审计组 |  | 查账 | 下午 | 15:30 | 待确认 |


  ③ 抽全了不等于抽对了
  --------------------------------------------------------------------
  上一张表六行全是 5 / 5,看着漂亮。但那是「五个字段都有值」,不是「五个值都对」。
  「单位」这一列有 4 行是空的——那四句里本来就没提公司名,规则也编不出来,只能留空。
  更隐蔽的是最后一行:「下午三点半,审计组来查账」。「下午」被填进了「哪天」那一格。
  这句话根本没说哪一天,规则把时段当日期填了。
  字段有值 ≠ 值是对的。 这两个指标得分开看,不然登记表看着满,实际没法用。

  ④ 缺字段为什么不能空着
  --------------------------------------------------------------------
  六行里有 4 行的单位是空的——那四句本来就没说公司名。
  空着的问题不是难看,是后面查不出来。想按单位统计来访次数,这 4 行全被漏掉。
  所以登记助手要有一个「补录」环节:抽不出的字段标红,让人点一下补。
  AI 抽不全很正常,关键是别让它悄悄空着。

  ⑤ 状态字段的作用
  --------------------------------------------------------------------

| 状态 | 条数 |
|---|---:|
| 待确认 | 6 |

  六条全是「待确认」——因为抽出来的字段总有空的,得有人核一遍。
  核完改成「已确认」,没核的留着。这个字段让「谁负责」变成一条查询。
  ! 这一步是本课替身用得最明显的一处:真平台上「从一句话里抽字段」由大模型做,
  提示词里给几个例子就能抽得比我这个规则好。但抽完之后要不要人核,跟用什么抽没关系——这是流程问题。

①第一张表六行全是 5 / 5。看着漂亮,但这一列叫「五个字段有几个有值」,不叫「有几个对」。 ②第二段是关键:「单位」那一列有四行是空的——那四句里本来就没提公司名。 ③第三段更隐蔽:最后一句「下午三点半」,「下午」被填进了「哪天」。 这句话没说哪一天,规则把时段当日期填了。 ④所以两个指标要分开:字段有值率、字段正确率。第一个容易刷,第二个才是质量。 ⑤第五段那个状态字段的价值:六条全是「待确认」,查一下就知道还有多少没核。 它把「谁负责」变成了一条查询。

30 秒实验

  1. 自己说十句同样意思的话,看抽取结果有几句是对的。同一句话换三种说法各试一次。
  2. 给智能体加一句开场示例,再试一次,看抽取成功率有没有变。
  3. 给你这张表加一个「状态」字段,默认「待确认」。加完查一次还有多少条没核。

常见误区

  1. 「抽到值就入库。」有值不等于对。日期抽成「下午」这种错,入库之后就查不出来了。
  2. 「抽不出来就留空。」空着的行以后按字段统计时会被漏掉。填「未知」或者标「待确认」都比空着好。
  3. 「做成智能体最省事。」先做工作流,能看清每步中间值。调通了再挂给智能体。
自测三问(点开对答案) 1. 设计登记助手要先想清哪三件事? —— 抽什么字段、抽不出来怎么办、谁来核。第二件最容易被跳过,也最决定成败。 2. 「字段有值」和「值是对的」差在哪? —— 前者只看有没有填,后者看填得对不对。演示里六行都是 5 / 5,但「哪天」那格填错了。 3. 为什么写数据比读数据危险? —— 读错了只是答错,写错了表里就多一行脏数据,而且平台没有回滚。

数据库这条线走完了。 下一章开始进案例:第一个是图文混合的推文生成器,它把前七章的东西全用上——插件、提示词、工作流、 图像生成。

相关笔记