简介
一个什么都知道的聊天机器人令人惊叹,也几乎无法看懂。一个只知道你家狗的名字和你奶奶生日的聊天机器人,这两样都算不上,而这正是它值得动手做的原因。
你的机器人大约三十行 Python,写在本站的编辑器里,什么都不用安装。之后你会把你的机器人能回答的那些问题,原封不动地拿去问一个真正的人工智能助手,并记下各自在哪里翻车。
原理说明
你的机器人是在查表。它保存着一本事实字典,当一个问题和其中任何一条都对不上时,它就拿不出任何东西。大型语言模型做的是完全不同的事:它预测下一段可能出现的文字,这既是它几乎什么都能回答的原因,也是它有时会满怀自信地编造答案的原因。在你本来就知道正确答案的问题上,把这两种行为并排放在一起看,是理解这些工具究竟在做什么的最清楚的方式。
分步说明
- 1
打开本站的 Python 编辑器,把下面的起始程序敲进去,或者直接粘贴。运行它,先问问那只狗。然后问一个它从没听说过的东西,看看它会怎么做。
- 2
把三条事实全部换成你自己家里的真事。每个关键词都要短、要用小写,因为那正是你的机器人在问题里搜索的那个词。
- 3
再加七条事实,凑成十条。每加两三条就运行一次,因为只加了两行的时候,找出漏掉的那个逗号要容易得多。
- 4
试着把它弄坏。不用“狗”这个字去问那只狗。在一句话里问两件事。把每一个本该奏效却没奏效的问题都记下来。
- 5
修好其中一处失败。让两个不同的关键词指向同一个答案是最简单的修法,比如让“狗”和你家狗的真实名字都返回同一条事实。
- 6
现在在大人在场的情况下,把这十个问题原样问给人工智能助手。它根本不可能知道正确答案。不管它说什么,都照样记下来。
- 7
填写对比表。你的机器人不知道的时候就会说自己不知道。记下助手在这种情况下会做什么,然后决定:在你要依赖的东西里,你更愿意要哪一种行为。
起始程序
三十行,每一行都能用手指出来它在干什么。最上面的字典就是你的机器人知道的全部内容;下面全都是读取问题并搜索匹配关键词的循环。
facts = {
"dog": "我们家的狗叫 Pepper,今年4岁。",
"car": "家里的车是一辆蓝色的本田。",
"birthday": "奶奶的生日是3月2日。",
}
print("问我关于我家人的事吧。输入 bye 结束。")
while True:
question = input("> ").lower()
if question == "bye":
print("回头见。")
break
answer = "这个我不知道。"
for keyword in facts:
if keyword in question:
answer = facts[keyword]
print(answer)最重要的一行,是在搜索开始之前先把答案设成“这个我不知道”的那一行。正是这个默认值让你的机器人在没有内容时会承认自己不知道,而这恰恰是语言模型所没有的行为。
你的机器人对阵助手
十个你本来就知道正确答案的问题。每一个都要把四列都填满。
| 问题 | 正确答案 | 你的机器人说了什么 | 助手说了什么 |
|---|---|---|---|
| 行 1, 问题 | 行 1, 正确答案 | 行 1, 你的机器人说了什么 | 行 1, 助手说了什么 |
| 行 2, 问题 | 行 2, 正确答案 | 行 2, 你的机器人说了什么 | 行 2, 助手说了什么 |
| 行 3, 问题 | 行 3, 正确答案 | 行 3, 你的机器人说了什么 | 行 3, 助手说了什么 |
| 行 4, 问题 | 行 4, 正确答案 | 行 4, 你的机器人说了什么 | 行 4, 助手说了什么 |
| 行 5, 问题 | 行 5, 正确答案 | 行 5, 你的机器人说了什么 | 行 5, 助手说了什么 |
| 行 6, 问题 | 行 6, 正确答案 | 行 6, 你的机器人说了什么 | 行 6, 助手说了什么 |
| 行 7, 问题 | 行 7, 正确答案 | 行 7, 你的机器人说了什么 | 行 7, 助手说了什么 |
| 行 8, 问题 | 行 8, 正确答案 | 行 8, 你的机器人说了什么 | 行 8, 助手说了什么 |
| 行 9, 问题 | 行 9, 正确答案 | 行 9, 你的机器人说了什么 | 行 9, 助手说了什么 |
| 行 10, 问题 | 行 10, 正确答案 | 行 10, 你的机器人说了什么 | 行 10, 助手说了什么 |
把助手给出了自信却不属实的答案的每一行都标出来。这种行为有个名字,叫幻觉,而这张表就是你亲手记录下来的证据。
