前言
从2022年末,openai ChatGPT引爆AI热潮已经接近4年。4年来,AI的爆款如雨后春笋般火出圈,chatgpt-4、chatgpt-4o、deepseek、豆包、seedance、claude-code、codex、claw、workbuddy等等等等。
互联网大厂们不甘落后,每个热点都不肯放过,这四年来,大概都经历了这些过程:
- 基模期:22年底,互联网大厂老板纷纷拍大腿------------原来堆算力真的能大力出奇迹!一边纳闷自家研究那么久也没出成果,怎么人家一个创业公司就这么敢想敢干?一边召集自家的lab、实验室按照人家的方法,也快速搞出自己的第一版模型。
- 群魔乱舞期:在经过了半年的沉淀,大厂内的中层们坐不住了(这里主要是那些非大模型业务的)------------王侯将相宁有种乎,谁说不做模型就不能搞AI了。于是一场轰轰烈烈的内部创新潮开始了,公司的所有非AI业务都拆了一个新的方向:B平台搞了个"New B平台",C产品搞了个"Next C产品"。这个阶段,只要能用个langchain调用LLM那就是合格的创新者;懂得RAG调优的,已经是佼佼者。
- 探索整合期:经过了1年的探索,New B平台、Next C都已经把简单收益拿到手了,老板们决定收网验一验大家卷了1年的成果。所以这个阶段,会把公司的AI项目收敛一下,同一个类目的项目派到做的最好的团队。而公司层面,也在探索AI除了对话助手还能做什么。这期间各个C端对话助手类产品烧钱不停。
- 降本增效期:在大厂还在琢磨ChatGpt的作业怎么不香了时,Anthropic先发制人,甩出王炸claude-code。虽然每个大厂的AI-coding都有布局,但是还远没有达到人家那种丝滑感。上个月大家遛弯还在焦虑啥时候被裁,结果立马就成为了现实,原来写代码才是最容易被替代的。与此同时,大厂内的研效提升达到了空前的热潮,所有人都在搞Skill、MCP。随之而来的还有Claw、Harness,正式宣告了大Agent时代到来。
对于个人而言,在25年之前,AI更多是一些探索项目;但26年开始,Agent开发已经是很明确的方向了。遗憾的是,当前市场上Agent开发岗位都要求有经验,这个筛选精准的筛掉了普通绩效的员工:有经验的Agent开发,大多是23年群魔乱舞期,被派去做"New B"、"Next C"的,这些人都是原本岗位的高绩效,普通绩效的负责维护"Old B","Before C"只能越来越边缘,强者恒强在这一刻具现化。
Agent开发入门
贩卖完焦虑,进入正题,如何学习Agent?博主的建议是分三步:
- 用一用市面的各种AI产品,比如豆包、千问、claude-code、Cozi等,了解Agent有哪些能力。
- 学习一个Agent开发工具,博主推荐Langgraph Python SDK,一方面SDK使用简单,一方面教程里有现成的demo便于实操
- 自己写个demo:比如实现一个能够帮你输出报告的聊天助手,能够把教程里的状态转换、打断、子图等应用上。至于Token,可以先薅一下各个平台的免费额度比如百炼等。
Agent开发
博主不是大牛,这里记录一下博主的踩坑过程,希望对大家有一些帮助:
关于structure output
- 使用trustcall.create_extractor方式获取格式化输出,有可能有的模型不支持,所以慎用
- structure定义里的字段,如果Field里不带default就会被设置为必须,那么大模型返回的json如果没有这个字段,就会报错;并且即使Field里写了详细的字段定义及例子,模型可能仍然无法正确输出,需要在调用模型的prompt里写字段含义
关于图之间参数透传
- 子图之间的state可以不一样,但是透传的字段必须都包含
关于tool_call
- 使用bind_tools方式调用模型,返回的是tool_call,需要手动解析来手动调用,所以用create_react_agent可以省去手动写tool调用的代码
- 要在tool的注释里明确写明每个字段的含义,要什么,不要什么
关于plan-execute模式
- execute时,模型喜欢自言自语完成了哪些任务,实际上可能并没有做
- 实际上是tool没有执行成功,但是这个tool_call被记录到了历史消息里,导致模型下次执行在历史里发现了它所以导致出现了幻觉,应该每次执行后把tool的调用和执行结果都记录下来
- executor会去执行的步骤可能有很多,如果我想优化某一步的效果,可能需要在executor的prompt里增加对应的约束,但是这样会使executor的prompt越来越臃肿
- 还是要看职责,如果是执行相关的,放到executor里;如果是某个专有功能相关的,可以考虑新增一个专有节点来处理这个
关于模型输出的坑
- 模型输出的内容不可控,需要有各种校验、约束(比如要求模型输出的为【发送邮件】,它可能输出【1.发送邮件】)
关于Token节约
- 读项目代码/文章前先在内存存一份目录图谱结构
- 每次获取相关代码内容,都是一次本地目录的检索行为,并且做成分页检索,每次只读一个子目录,直到读完所有相关内容,再进行summary整理,给到模型进行分析
- 读文件也要分页,每次只读相关代码附近XXX行内容