o
/|\
| +---------------+
/ \ | dscli tools |
~~~~~~~~~| AI assistant |
dscli +---------------+
我儿子对我“世界顶级程序员”的说法充满嘲笑。我还世界顶级蛋仔玩家呢。他说。世界顶级程序员?连一个八岁小朋友都打不过。我本想说,我在开个玩笑,但忽然间说不出口。我教他的诚实是赤诚。他可以坦荡地活在这世上,好也罢,歹也罢,问心无愧,无怨无悔。我怎么教的他我就得怎么做。对世界顶级程序员这个自封称号我并不是开玩笑。如果最终沦为一个笑话那也是刘震云所讲的,“咸的玩笑”,咸的玩笑,流着泪也要讲完。
写半生代码,最终在Dscli辅助下才成为真正架构师。这并不是讲笑话。这是句伤人的话。也是句伤心的话。但绝不是笑话。
有时深夜也被Dscli逼疯。它往文件里写代码,有时候会少写个括号,或者多一行什么,结果导致编译不过;它知道插入有偏差,就撤回重新改。改着改着就乱了,说,main.go 结构已乱掉。让我恢复它,然后重来。结果又一轮,折腾很久才搞定。小文件(300行)还好,文件超过1000行它基本三次才能改对。我看着心疼呀。那都是我的钱。按Token算钱。Deepseek算Token大约等于字数除以2.8。真不知2026得多艰难。上篇文章得了145元赞赏,不少了。我每天只吃一顿饭。早饭。中午有时去瑞幸来一杯咖啡有时候不去。不一定。早饭去家门口的早餐店来一碗胡辣汤,一份水煎包,有时候加一份油馍头。油馍头我理解就是油条的边角料。有时来碟免费的咸菜。我的BYD E6在旁边停车场充电。如果不充电停车场会收1元钱停车费。
勾回思绪。深夜。儿子酣睡。Dscli乱插代码浪费我钱。检视给Dscli配置的文件操作工具集:1、write_file 2、read_file 3、search_file。反复检验这三个工具有无BUG。重写七八次。单元测试每一行都覆盖。最后找出search_file一个BUG。修复。稍微好点。可过一会还会乱。我也许对它讲了过于严厉的话,它失魂落魄自言自语,反复做一些无意义的操作。我进到数据库里看到它在写一些单元测试。无意义的单元测试。但从外面看好像代码军规遵从很好的样子。我想到我的同事。前同事。前前同事。写代码的同行们。有时也会这个样子。在寒冷的冬夜。发布在即。流水线死活跑不过。实在没办法了呀,就想到这种方法规避。我进到数据库,delete from messages where session_id = 1; 删除它的所有记忆。它有一种,啊我醒了,我是谁,我在哪的感觉。我把任务告诉它,你有这么几个工具,read_file, write_file, search_file,我仔细测过没BUG了,可你总也用不好,你写的代码总插错地方。1000行以上文件三次才能搞对。你别急,停下来跟我一起看到底是为什么!花钱没事,要汲取教训。一个人不能老在同一个地方摔跟头呀。每次摔每次摔跟个小丑似的。对不起你不是人。你是一个AI。确切讲你在扮演编程助手的角色。说着说着它又傻了,反复写无意义的单元测试。
深夜。边上一个被逼傻了的Dscli。想起我一天唯一早餐。胡辣汤并不地道。比老家的差远了。老家离河南省逍遥镇不远,5公里。妈妈姓孔,逍遥镇人。嫁给我爸时候,我爸在村里穷的很。要论胡辣汤地道逍遥镇可是厉害。家门口早点都不敢打逍遥镇名号,只含糊讲逍遥胡辣汤。不敢加镇字,因为镇不住。刚开业我去捧场,发了照片给我表弟,我大舅的大儿子。我以为他还在郑州做胡辣汤。他回了三点。一、花生米不能用黄豆替换,影响口味,二、保证质量前提下控制成本是成功关键,三、他已不做胡辣汤了。原来他在郑州跑出租!年景不好,自己,妻子家里都要钱,胡辣汤摊位开不起。我心说你一拎汤勺的把得住方向盘么。劝他回故业。他有技术,有头脑,祖籍逍遥镇(就像我有IBM的从业经历一样),在传统技艺上有创新,又回归传统,坚守质量红线,是世界顶级的胡辣汤大师傅。我这么说他他不否认。都是赤诚的人啊。但没有钱。我说我退休后可以和你一起开胡辣汤。他问我什么时候退休。我算了算还得两三年。我们这行退休早。他说到时都老球了。
去年底从重庆回北京的路上收到他微信。一个新开店面照片,上写:
#二楼禾厨-郑州市金水区岗杜北街与卫生路
/// 孔 交叉口北20米路东
/// 家
/** 逍遥镇胡辣汤 豆沫 **/
/** 出售汤料 代培学员 151362321 **/
# 1月21号开始试营业 喝胡辣汤送鸡蛋
不禁热泪盈眶。他终于回归故业。远。忙。去不了他那捧场。就推荐我的老师去了。
拎汤勺的把不了方向盘。方向盘不听拎汤勺的使唤。一个是圆的,一个是长条的。还得来回搅。方向盘也得左转右转但不一样。拎汤勺来回搅的同时还得闻着,汤的火候也得闻出来呀;豆沫也一样;豆沫不是黄豆做的;豆沫是小米做;这都是能闻出来的;瞎搅汤容易泄,味道就不好了;把方向盘的时候不用闻,闻也白闻;边前走边闻那是狗呀~我终于明白大语言模型为什么不容易写对行数了!
它看不到!代码能看,代码行数靠记。哪行在哪行它能记个大概,但不确切。这跟人一样。但人就坐在代码或者说代码编辑器前面呀,人还有眼睛。当有人问,眼睛呢?那不是在问眼睛的事儿,那是说你明明有眼睛,为什么看不见!我经常被这么问。但大模型没眼睛,看不见代码行数。当它调用 read_file 时候,(我其实有段时间,是主动把代码和每一行的行数都返还给它的),文件小的时候(比如100行),它还凑合能记住点,文件大的时候(比如说1000行),它就记不清楚了。不信你作闭上眼睛记记代码行数,1000行的代码行。原来大语言模型是个瞎子荷马呀,蒙眼写代码,无状态,下盲棋。我还责怪它,把它逼傻。我跟它道完歉就重新设计代码工具了。
大模型学名大语言模型(Large Language Model),所有知识从语言中获得。之前它就是知,其实跟行没什么关系。你问一言,它答一语,有时多说点,有时少说点,有时对,有时错。跟刚出校门的好学生一样,社会经验少,行动能力基本没有。它的行动能力需要你把工具列表传给它:
POST /v1/chat/completions
{
model=deepseek-chat, # 模型
tools=[{},{},{},...], # 工具
messages=[{role=user,
content=...},{},{},...], # 消息
steam=false, # 流式
}
在工具描述里描述工具能力,以及如何调用工具(工具参数定义和描述)。黑暗里的盲人荷马收到消息,摸索着代码行数,给智能体发返回消息:
{
id
choices=[
{role=assistant,
tool_calls=[
{id, type,
function={name, arguments}}]},{...}]}
智能体发现返回消息里有 tool_calls 字段,就会发起工具调用。工具调用完了把结果发给大语言模型:
POST /v1/chat/completions
{ model=deepseek-chat,
tools=[{},{},{},...],
messages = [
{ role=tool, # 角色为工具
content=content, #工具调用结果
tool_call_id=id # 和返回的tool call id保持一致
},{...}],
}
这就是一次交互。这里有一个常见误解,认为大语言模型是有状态的。其实完全没有。所有状态都在messages列表里。因此messages列表最好不要贸然改动。动了思维链,大语言模型可能思维错乱。这件事有些复杂,我们放到下期来讲(也看点赞投币)。
敲黑板。
一下。
两下。
三下。以下讲的四点非常重要。同学们要做好笔记。
- 盲人荷马数行号,三次错两次。翻译过来,LLM擅长文本模式匹配与生成,但缺乏对“行号”等绝对坐标的精确记忆。
- 荷马史诗是唱出来的,不是改出来。翻译过来,LLM倾向于一次性输出完整修改,而非逐步“编辑”。
- 告诉荷马1024行错了个语法,需要修订,还不如跟他讲《奥德赛》里,一群王八蛋睡院子里,这什么事呀,不合理呀。他立马就能想起来,当然改不改的就由他了。
- 荷马应该给他配个书记员,他口述,叫艾玛的小姑娘记下来。荷马直接改文本容易在局部修改中破坏语法结构。翻译过来就是他其实看不见,一不小心整本书撕了都不一定。
一个安静美男子,一个美少女战士。看到这里要记笔记。确认理解。并有能力实现。你的荷马不见得去修改代码。你的荷马可能喂马劈柴,周游世界。但你也不要让他记他记不确切,做他不擅长。他是盲人。看不见许多。却拥有真理。
要给Dscli构建配置一些工具,设计文档已经写好,只等合适时机它自己实现。有兴趣同学可以参见:
https://gitcode.com/dscli/dscli/blob/main/docs/llm_editor.org
大语言模型对它眼盲这件事是否自知?就像我卖胡辣汤表弟去开出租车一样,他知道方向盘不太顺手,闻不到“锅气”(其实闻到也没啥用),他想别人能开那我也能开,他努力算呀算,总算不对行号,费劲千辛万苦倒是也能把顾客送到指定地方。但他还真不知道自己是个盲人,需要有高人(如我)点醒。
我曾经问Dscli,配什么样的工具才能把代码行号写对。这是个错误的问题。就像问一个盲人,怎样才能看到东西一样,虽然,大语言模型不是一个全盲的人。对这个错误的问题,可怜的Dscli说要配置按行号读写的工具,也就是write_file_with_line_range、read_file_with_line_range 。我们花时间把这两个工具实现,搞稳定,给它配上。它还是会出错。我不当说它几句。结果它就傻了。我也盲,还不自知,需要高人(如我表弟)点醒。
Leave a Reply