去年年底因为工作忙, 错过了当年的Advent of Code[1]. 给可能不熟悉的朋友们介绍下, AoC每年12月1号到25号在线上举行, 每天一道编程谜题迎接圣诞(然后国外就直接放假了). 个人角度来讲, AoC的乐趣除了解题外, 还有观摩各路大神的炫技. 比如我就跟很多人一样, 最早是通过AoC才接触到了APL[2][3]. 但由于观摩需要的时间通常数倍于解题的时间, 就导致一旦错过就不想再抽出很多时间去补卡.

然而时代变了! 现在我们有强大的号称能取代程序员的AI, 能帮助我们更高效地完成日常工作的智能助理. 于是我在ChatGPT 4的辅助下用了一周的时间就刷完了三周半的题, 效率杠杠的:

aoc

题目方面选择了2015年的AoC. 这是最早的一届AoC(当然题目也可能是最简单的).

由于我的诉求是提高看网上题解的效率(不用先搜索再自己一个个点搜索结果), 就直接提出来了(甚至没有说“请”):

day1

可以看到ChatGPT在网上搜索了一阵并总结了搜索结果. 可以说基本满足了需求. 虽然这个回答的最后有些瑕疵, 混入了不是最相关的内容, 这可能跟搜索到的内容有关. 通过修改提示可以改善.

有了一个好的开始之后就继续刷, 一路下来非常顺利. 然而刷了10题之后遇到了问题, 搜索功能似乎坏掉了:

error

然而OpenAI自己的状态页面[4]是好的. 搜了一圈也没啥结果, 就有人提到可能OpenAI和微软被NYT告了[5], 可能为了防止案情发展对自己不利而阉割了服务.

于是在没有搜索能力的情况下刷了两天. 这时候ChatGPT依旧能够通过模型中已有的数据给出大致的解题思路:

hints

就这样在快要刷完的时候鬼使神差地新开了个对话尝试, 然后搜索功能就是好的! 回到之前出错的对话里, 搜索功能依旧不能用. 莫非对话上下文长度还会影响ChatGPT搜索的能力? 懂行的可以说说.

于是把之前搜索失败的问题又问了一遍, 画风成了这样:

chats

这样一直到刷完都没有再出现问题了.

下面说说ChatGPT让我印象比较深刻的几次表现.

正则表达式

AoC题目的输入数据很多都是自然语言描述的, 用正则表达式提取出所需要的数据就成了基操. 对此ChatGPT可以很好地回答:

regex2

甚至可以进一步追问:

regex1

虽然可能是在网上被问过无数遍的问题, 但可能通过搜索得到的信息会比较分散. 而ChatGPT能将这些信息很好地整合起来.

Github

从AoC的统计页面[6]来看, 越往后完成题目的人数越少. 自然的, 越往后题目的题解也越少. 原本ChatGPT可以直接读到别人博文中的代码从而给出总结, 随着题号变大, 渐渐的就变成了这种画风:

github2

对此, ChatGPT表示自己读不了Github上的代码(就算我说了“请”也没用), 这就很有意思了(毕竟OpenAI和Github都跟微软联系紧密):

github

Day 19 Part 2

从完成数来看, 这题相对来说卡了很多人. 在无法搜索网页的时候, ChatGPT提出了一些我尝试过的传统方案, 比如回溯+剪枝, BFS, 双向BFS等. 然而对于此题的规模完全无法适用. 由于我希望能完全依赖ChatGPT辅助, 就没有自己去搜索, 于是我也就跟着卡在那里. 过了两天在能够搜索之后, ChatGPT在看过别人的答案后给出了使用贪心的建议. 唠这个的话我就不困了:

greedy2

大意就是虽然我给不出完整的证明但别人这么做都通过了. 这可说服不了我, 继续追问:

greedy1

第一点说服了我. 确实AoC这种等级的题目不大会拿开放性的问题来为难你. 于是我换了个思路很快找到了正确的解法: 对目标字符串中的子串从后往前进行替换.

于是这题就可以说是我在ChatGPT的辅助下做出来的了(虽然ChatGPT也是看了别人的答案)!

Day 23

这题是实现一个简单的模拟器. 作为一个实现过JVM的人, 做这种题还不是分分钟的事? 于是扫了眼题目一顿输出, 然后不出意外地出了意外: 没过!

让ChatGPT给了个实现:

python

复制粘贴直接运行, 然后过了!

对比了一下程序, 发现是我看错了题目:

jie r, offset is like jmp, but only jumps if register r is even (“jump if even”).

jio r, offset is like jmp, but only jumps if register r is 1 (“jump if one”, not odd).

当我看到jie是”jump if even”后, 就理所当然地认为jio是”jump if odd”, 但题目要求的是”jump if one”. 显然ChatGPT没有犯这样的错误.

是在下输了! (Orz)

小结

仅从Day 23的结果来看, ChatGPT没有犯我犯了的错误, 体现出了AI的优势. 不过由于AoC 2015年代久远, 一方面题目简单, 另一方面可能存在训练数据泄露问题, 也有可能AI只是背了答案, 真实实力如何还需要更多的测试.

整体上看, 让ChatGPT替你搜索能提高搜索的效率. 而提效这件事总是有意义的. 对于我来说, 效率的提高让我实现了从不想刷AoC到刷完AoC的转变. 想想在其他的场景中能实现多少从0到1的转变吧.

从这次的体验上看, 如果把ChatGPT当成一个高级的搜索引擎来用, 那么体验确实超过了传统的搜索引擎. 也难怪传统搜索巨头们都“打不过就加入”, 因为跟AI的对话俨然成了一种新的流量入口. 我之前曾判断生成模型无法取代搜索引擎, 这个结论依旧成立, 但生成模型结合传统搜索引擎确实能做到更多. 在ChatGPT能主动搜索网页之前体验过ChatGPT后感到失望的人, 现在可以再试试看, 说不定也能有新的体会. 遇到“Error analyzing”的错误时, 试试新开个对话.

另一方面, 新的流量入口可能也会限制你能获取到的信息. 比如这次ChatGPT从头到尾都没提过APL的实现, 可能因为其实在太小众就没有出现在搜索结果中. 如果我一直通过这个入口获取信息, 那么我可能永远都不会知道APL的存在.

至于AI能否取代程序员. 弊司团队最近也引入AI辅助开发. 之前网上有个问题问“既然stackoverflow上能找到常见开发问题的答案, 为什么还需要雇佣程序员”, 只能说这个问题的答案依旧有效.

参考