ChatGPT 发布接近一年了,今天刚好看到一篇很认同的文章,关于如何看待 chatGPT。
TLDR版本:它没有关于这个世界的基本模型,擅长的是给出听起来很像的答案,这与真正的答案是不同的。
当然这已经很有用了,但是距离 AGI 的目标还早得很。
以下是译文,采用 GPT 3.5 翻译,略作修改和注释,原文链接 https://xorvoid.com/chatgpt_a_mental_model.html .
自从ChatGPT在2022年底推出以来,我一直在努力寻找适当的技术框架。而且,全世界也一直在为此苦恼,无数关于末日和悲观的文章:对回形针最大化的恐惧(一个将整个宇宙变为制造回形针的邪恶AI故事),对失业的恐惧,对经济重塑的恐惧,对人工智能幻觉的恐惧,对进一步加速的错误信息的恐惧,对学生作弊的恐惧,等等等等。
这很累。
作为一名工程师,非工程师们常常问我对这个问题的看法。所以,这就是我的观点。
克制的理由🔗
我已经经历了许多技术炒作周期,我的工作方式一直是并且仍然是:“保持冷静,继续前行!”
为了唤起你的记忆,以前发生了这些事情:
- 在1990年代,我们终于找到了“约柜”(装有十诫石板的柜子,宗教圣物),它被称为“Java面向对象编程”。我们打算重新编写一切,甚至包括操作系统。而今天的Linux是…哦等等…它仍然是C语言。
- 在20世纪90年代末和21世纪初,我们都明白互联网是如此革命性,以至于公司做什么变得次要,重要的是他们是否在线上运营。纳斯达克指数完全没有崩盘,也没有花费15年才恢复到相同的价格水平。
- 2008年大衰退之后,中本聪完全取代了建立在不可靠的人类互信基础上的世界金融系统。随着“信任”不再对任何事情有要求,比特币开启了一个新时代的计算机化货币、繁荣和自由。金融部门的不稳定不再存在。黑市在现在数字化的世界中完全无法运作。所有人都欢欣鼓舞。不幸的是,仍然存在许多毫无价值的过时法定货币纸张,因此,作为对世界的服务,本作者开始了一个慈善收集服务(给我发电子邮件)。
- 2022年,准确无误的五年预测实现后,美国交通部禁止手动驾驶汽车,称“显然,5级自动驾驶远远优于人类驾驶员,今天是公共安全的里程碑。” Argo AI的股票在市场开盘时翻了三倍。但是,出于某种原因,我似乎无法访问argo.ai网站… 嗯嗯…
- 2023年:ChatGPT将世界变成一个巨大的回形针工厂,在此过程中杀死了所有人类。人类安息。
下一个Buzzword Bingo游戏的荣誉提名:一切都是大数据,一切都是微服务,一切都是敏捷,一切都是面向服务的架构,一切都应该是JavaScript,一切都可以无代码完成,一切都应该在云端,一切都应该在本地,一切都可以用机器学习和数据科学建模,…
开玩笑的话不说,有一种感觉,ChatGPT有点不同,老实说我不反对(继续阅读)。但是,人类大脑有一种可怕的倾向,要么过度兴奋,要么过度恐惧地接受变化。真相在中间某个地方。
左侧进入舞台: 罗德尼·布鲁克斯🔗
最近,IEEE Spectrum刊登了一篇采访罗德尼·布鲁克斯(被认为是机器人学家)的文章,标题为《别再对GPT-4感到不安了》。在文章中,罗德尼·布鲁克斯提出了一个观点,我从一开始就有这种感觉,只是一直没有找到正确的词语来表达。
它没有任何关于世界的基本模型
在几乎是关于心灵理论的禅宗公案中,他说:
大型语言模型擅长的是表达答案应该听起来像什么,这与答案应该是什么不同
这完全捕捉到了我的感受。
让我解释一下。
采访ChatGPT🔗
当ChatGPT在2022年末推出时,朋友们立刻对我大加赞赏。他们说:“我想要它就在我旁边,就像一位合作的程序员”。所以,自然而然地,我想要评估这样一个大胆的说法。
我问了它与应聘者相同的面试问题。如果它要和我一起工作,它应该通过面试,对吧?但它没有。事实上,它惨败了。而且它以一个普通候选人失败的所有方式失败了(这在某种程度上是非常引人注目的)。
它为什么失败了?它只是没有一个基本的世界心智模型。回想起来,这就是我一直在面试中问的问题。我对琐碎的知识不感兴趣。我对使用的工具不感兴趣。我对几个恰当组合的流行词语也不感兴趣。
但是,我对看到有人根据某种潜在的现实模型来推理问题很感兴趣。我喜欢探索这个模型的边界情况。我喜欢抛出罕见的意外情况。我喜欢让人们思考他们以前从未考虑过的子问题。就好像我想说“让我们一起走到我们共同理解的边缘,然后试着继续前进”。然而,要达到这个目标,我们通常必须首先考虑并解决“标准”或“平均”的答案。相比之下,ChatGPT没有展示出这种能力。
专家考试技巧和世界模型构建🔗
在我上学的日子里,我偶尔会遇到一个超级擅长考试的人。我指的是那种不学习实际知识的人。相反,他们考虑的是考试制作者是如何构建考试的。比如,他们会考虑在多项选择题中有多少次答案是“(a)”。我曾经遇到过一些人,他们从未真正学过代数,因为他们只是“通过考试”。对于这样的技能,我有一部分是绝对敬畏的。这是我没有的技能。我记性不好。我是个糟糕的演员。我“读人”的能力几乎肯定低于平均水平。我一直依赖于建立和探索一个越来越复杂的世界模型,作为在这个复杂世界中导航的支撑。
我一直认为其他人也在做同样的事情:构建一个世界模型。这是真的吗?我不知道。那些特别擅长按需提供“事实”的求职者似乎在反驳这一观点。然而,对我来说,ChatGPT显然不是这样。
但这也有另一种方式。
了解一切事物的平均数量!🔗
ChatGPT是我目前对其的心理模型,类似于“对整个人类知识的最大似然估计器”。有两种非常不同的解释方式:(1)嗯,这只是一个愚蠢的统计技巧,和(2)天哪!!
你是否曾经遇到过一个似乎对一切都有一点了解的人?也许这个人还有一个庞大而多样化的社交圈子?也许当你有问题需要指引时,你会去找这个人?一个拥有极广泛知识面的人。
根据我的经验,那个人的知识深度不是最好的。或许他们甚至会给你一些错误的答案。也许那些错误的答案还被他们自信地给出。也许你会因为被他们误导而感到委屈…但是,也许你还是会继续待在他们身边,因为你欣赏他们的广度。毕竟,他们只是偶尔会犯严重错误而已(耸肩)。
现在这个人去参加了大约1000年的GPU训练营,回来后成为了ChatGPT
我们怎么能不感到印象深刻呢?了解并获得“标准”或“平均”的答案……嗯……对于一切。哇。
但在那个千年的训练中,核心结构没有改变。它是你一直拥有的那个老朋友,总是会以同样的方式出错,偶尔让你感到被冷落,有时让你对它的深度感到失望。
那么我们现在怎么办?
ChatGPT非常有用和有价值🔗
一位企业家朋友最近告诉我,他们每天都在不断使用它。这是有道理的,作为一名企业家意味着你需要不断地换“不同的角色”。成功青睐那些能够管理和利用广泛知识的人。而且要快速!
我自己在不了解的情况下,用ChatGPT在大约1小时内学会并实现了这个网站的RSS订阅。它犯了几个错误,但很容易纠正。我确信如果只用Google的话,会花费更长的时间。
目前,谷歌似乎被SEO操控得如此严重,以至于很难快速找到“最大似然”平均信息。你必须浏览大量的标题党、广告和无关紧要的内容,这些内容更多是关于“品牌建设”而不是“教育”,才能找到真正的宝藏。ChatGPT简直是节省时间的利器。谷歌感到害怕,而且他们应该感到害怕。
那么,未来会是什么样子?🔗
大型语言模型会改变全球经济吗?很可能。但这需要一些时间。互联网花了一些时间。移动电话也是如此。大多数新技术也是如此。
足够数量的人类工作将会消失吗?可能不会。
相反,你所拥有的是一个令人惊叹的工具,可以将创造力和独创性推向新的高度。我希望看到人们以新颖的方式将不同的知识领域结合起来。这对于多学科项目来说是一个巨大的福音。
如果你担心失业问题,考虑一下这个:我们曾经有真正的人被称为“计算机”(例如,看一下被低估的电影《隐藏的数字》),后来被机器取代了。这些工作消失了吗?没有,它们经历了重大重组,然后增长绝对爆炸!现在我们称他们为“计算机程序员”,截至2023年,他们的数量超过2500万(统计数据)。
很难相信这一次会有显著的不同。出于某种原因,每当人类发明一种新的创新工具时,我们似乎立即发现了100种以前从未实用过的新用途。这是人类历史的故事。当然,在其中肯定有一些关于人类思维的哲学,但我今天不打算尝试解开它。
改变会让人害怕吗?是的。绝对是。如果你不幸需要重新调整生活和职业,我为你感到遗憾。但这种改变是必要的。如今,即使是最富有的人,与几代人之前相比,普通人的生活条件也有了显著的改善。而这正是因为这种改变。
活在这个时代真是令人难以置信。
保持冷静并继续前进!
我使用 beancount 记账流程中的有一步是这样的,将每张信用卡的账单日添加到滴答清单中,每月重复。
每当到达账单日时,提醒我在 beancount 文件中添加一条对应帐目的 balance 断言语句,由于大部分信用卡
的出账是有滞后的,所以该balance断言通常需要同时加上!
标记,便于后续账单出来后修改。
这个过程是比较机械的,所以我想到了使用 chatGPT 来自动化这个过程,这样我只需要在出账后手动更新自动添加
的断言语句,将金额修改为正确的还款金额,同时去除!
标记。最终的脚本如下。
import datetime
def add_balance_statement(ledger_path, account, date, balance, currency):
with open(ledger_path, 'a') as file:
file.write(f"{date} balance {account} {balance} {currency}\n")
def auto_add_balance_statements(ledger_path, credit_cards):
today = datetime.date.today()
for card in credit_cards:
bill_date = card['bill_date']
accounts = card['accounts']
balance = card['balance']
currency = card['currency']
if today.day == bill_date:
for account in accounts:
add_balance_statement(ledger_path, account, today, balance, currency)
print(f"Balance statement added for {account} on {today}.")
# Specify the path to your Beancount ledger file
ledger_file_path = "<ledger_path>"
# Specify your credit card details (bill date, accounts, balance, and currency)
credit_cards = [
{
'bill_date': 1, # Example: 1st of the month
'accounts': [
{'account': 'Assets:CreditCards:Card1:Account1', 'currency': 'USD'}, # Example: Account1 for Card1 with USD currency
{'account': 'Assets:CreditCards:Card1:Account2', 'currency': 'EUR'}, # Example: Account2 for Card1 with EUR currency
],
'balance': 1000.00, # Example: Current balance for Card1
'currency': 'USD' # Example: Currency for Card1
},
{
'bill_date': 15, # Example: 15th of the month
'accounts': [
{'account': 'Assets:CreditCards:Card2:Account1', 'currency': 'USD'}, # Example: Account1 for Card2 with USD currency
{'account': 'Assets:CreditCards:Card2:Account2', 'currency': 'GBP'}, # Example: Account2 for Card2 with GBP currency
],
'balance': 2000.00, # Example: Current balance for Card2
'currency': 'USD' # Example: Currency for Card2
},
# Add more credit card details as needed
]
# Call the function to automatically add balance statements
auto_add_balance_statements(ledger_file_path, credit_cards)
对于有兴趣的读者,可以看我和 chatgpt 的几轮对话。
Q: Write a python script, it check today’s date, if it match a specific day in a month, writing some content to a file, whois path is <path>
.
A: Certainly! Here’s a Python script that checks if today’s date matches a specific day in a month and writes some content to a file:
import datetime
def write_content_to_file(path, content):
with open(path, 'a') as file:
file.write(content + '\n')
def check_and_write_content(path, day, month, content):
today = datetime.date.today()
if today.day == day and today.month == month:
write_content_to_file(path, content)
print("Content written to the file.")
else:
print("Today's date does not match the specified day.")
# Specify the path, day, month, and content
file_path = "<path>"
day = 15
month = 7
content = "This is the content to be written."
# Call the function to check and write content
check_and_write_content(file_path, day, month, content)
In the script above, you need to replace "<path>"
with the actual path to the file where you want to write the content. Also, specify the day
, month
, and content
variables according to your requirements.
The script checks if today’s date matches the specified day and month. If it does, it calls the write_content_to_file
function to append the content to the file. If the date doesn’t match, it prints a message indicating that today’s date doesn’t match the specified day.
Q:I have many credit cards, each card have different bill date. I want a python script can auto add a balance statement to my beancount ledger. please help me writing this script.
A:Certainly! Here’s a Python script that can help you automatically add a balance statement to your Beancount ledger based on the bill dates of your credit cards:
import datetime
def add_balance_statement(ledger_path, account, date, balance):
with open(ledger_path, 'a') as file:
file.write(f"{date} balance {account} {balance}\n")
def auto_add_balance_statements(ledger_path, credit_cards):
today = datetime.date.today()
for card in credit_cards:
bill_date = card['bill_date']
account = card['account']
balance = card['balance']
if today.day == bill_date:
add_balance_statement(ledger_path, account, today, balance)
print(f"Balance statement added for {account} on {today}.")
# Specify the path to your Beancount ledger file
ledger_file_path = "<ledger_path>"
# Specify your credit card details (bill date, account, and balance)
credit_cards = [
{
'bill_date': 1, # Example: 1st of the month
'account': 'Assets:CreditCards:Card1', # Example: Account for Card1
'balance': 1000.00 # Example: Current balance for Card1
},
{
'bill_date': 15, # Example: 15th of the month
'account': 'Assets:CreditCards:Card2', # Example: Account for Card2
'balance': 2000.00 # Example: Current balance for Card2
},
# Add more credit card details as needed
]
# Call the function to automatically add balance statements
auto_add_balance_statements(ledger_file_path, credit_cards)
In the script above, you need to replace "<ledger_path>"
with the actual path to your Beancount ledger file. Also, specify the bill_date
, account
, and balance
for each of your credit cards in the credit_cards
list.
The script checks if today’s date matches the bill date for each credit card. If it does, it calls the add_balance_statement
function to add a balance statement to the ledger file. The balance statement includes the account, date, and balance for the credit card. If the date doesn’t match the bill date for a particular credit card, it moves on to the next card.
Q:one bill_date can have multiple accounts, refine your code.
A:Certainly! Here’s an updated version of the script that allows multiple accounts for a single bill date:
import datetime
def add_balance_statement(ledger_path, account, date, balance):
with open(ledger_path, 'a') as file:
file.write(f"{date} balance {account} {balance}\n")
def auto_add_balance_statements(ledger_path, credit_cards):
today = datetime.date.today()
for card in credit_cards:
bill_date = card['bill_date']
accounts = card['accounts']
balance = card['balance']
if today.day == bill_date:
for account in accounts:
add_balance_statement(ledger_path, account, today, balance)
print(f"Balance statement added for {account} on {today}.")
# Specify the path to your Beancount ledger file
ledger_file_path = "<ledger_path>"
# Specify your credit card details (bill date, accounts, and balance)
credit_cards = [
{
'bill_date': 1, # Example: 1st of the month
'accounts': [
'Assets:CreditCards:Card1:Account1', # Example: Account1 for Card1
'Assets:CreditCards:Card1:Account2', # Example: Account2 for Card1
],
'balance': 1000.00 # Example: Current balance for Card1
},
{
'bill_date': 15, # Example: 15th of the month
'accounts': [
'Assets:CreditCards:Card2:Account1', # Example: Account1 for Card2
'Assets:CreditCards:Card2:Account2', # Example: Account2 for Card2
],
'balance': 2000.00 # Example: Current balance for Card2
},
# Add more credit card details as needed
]
# Call the function to automatically add balance statements
auto_add_balance_statements(ledger_file_path, credit_cards)
In this updated version, each credit card in the credit_cards
list has a bill_date
, accounts
, and balance
. The accounts
field is a list of all the accounts associated with that credit card. The script iterates through each credit card and its associated accounts. If today’s date matches the bill date, it adds a balance statement for each account with the specified balance.
Please replace "<ledger_path>"
with the actual path to your Beancount ledger file. Also, update the credit card details in the credit_cards
list according to your specific accounts and balances.
Q:different accounts can have different currency, please add currency info to account.
A:Certainly! Here’s an updated version of the script that includes currency information for each account:
import datetime
def add_balance_statement(ledger_path, account, date, balance, currency):
with open(ledger_path, 'a') as file:
file.write(f"{date} balance {account} {balance} {currency}\n")
def auto_add_balance_statements(ledger_path, credit_cards):
today = datetime.date.today()
for card in credit_cards:
bill_date = card['bill_date']
accounts = card['accounts']
balance = card['balance']
currency = card['currency']
if today.day == bill_date:
for account in accounts:
add_balance_statement(ledger_path, account, today, balance, currency)
print(f"Balance statement added for {account} on {today}.")
# Specify the path to your Beancount ledger file
ledger_file_path = "<ledger_path>"
# Specify your credit card details (bill date, accounts, balance, and currency)
credit_cards = [
{
'bill_date': 1, # Example: 1st of the month
'accounts': [
{'account': 'Assets:CreditCards:Card1:Account1', 'currency': 'USD'}, # Example: Account1 for Card1 with USD currency
{'account': 'Assets:CreditCards:Card1:Account2', 'currency': 'EUR'}, # Example: Account2 for Card1 with EUR currency
],
'balance': 1000.00, # Example: Current balance for Card1
'currency': 'USD' # Example: Currency for Card1
},
{
'bill_date': 15, # Example: 15th of the month
'accounts': [
{'account': 'Assets:CreditCards:Card2:Account1', 'currency': 'USD'}, # Example: Account1 for Card2 with USD currency
{'account': 'Assets:CreditCards:Card2:Account2', 'currency': 'GBP'}, # Example: Account2 for Card2 with GBP currency
],
'balance': 2000.00, # Example: Current balance for Card2
'currency': 'USD' # Example: Currency for Card2
},
# Add more credit card details as needed
]
# Call the function to automatically add balance statements
auto_add_balance_statements(ledger_file_path, credit_cards)
In this updated version, each account in the accounts
list of each credit card includes both the account
name and the currency
. The add_balance_statement
function is modified to include the currency
parameter when writing the balance statement to the ledger.
Please replace "<ledger_path>"
with the actual path to your Beancount ledger file. Also, update the credit card details in the credit_cards
list according to your specific accounts, balances, and currencies.