跬步 On Coding

AI Agent 工程化实践:从 Prompt 到 Context 的思维转变

最近在新公司这边,大部分精力都耗在了 AI Agent 的落地应用上。大家都在谈 Agent,网上的 Demo 也是满天飞,但当你真正把这玩意儿往生产环境搬的时候,会发现完全是两码事。

简单的说,AI Agent 的核心逻辑其实并不复杂,本质上就是一个基于 ReAct(Reasoning and Acting)范式的工程结构,程序在一个死循环里不断地调用 LLM 的 API,让它根据当前的观测去决策下一步是思考还是行动。

起初我也觉得这就跟写个脚本差不多,但在实际调试过程中,我发现让 Agent “跑通”不难,但要让它“跑好”、“省钱”且“不犯蠢”,这里面全是工程细节。我也复盘了一下这段时间的踩坑经历,总结了一些在工程实践中的“巧思”。

系统性思维的陷阱:从“完美方案”到“有效落地”

我做程序员已经 10 多年了。

回想刚入行那会儿,我的思维模式很简单:产品经理提什么,我就做什么。那时候追求的是“短平快”,像个执行指令的机器,代码写得快就是牛。

后来加入了腾讯,随着职级的提升,负责的系统越来越复杂,我开始意识到:写代码只是冰山一角,做方案才是真正的考验。

所谓的“系统性思维”,一度让我受益匪浅,但最近我发现,如果一旦陷入对“完美”的执念,系统性思维反而会成为阻碍项目落地的最大陷阱。今天想和大家聊聊,如何在架构设计、风险控制和实际落地之间找到那个微妙的平衡点。

pingsix-ingress-controller启动

https://github.com/zhu327/pingsix

PingSIX 自从上次重构之后, 我一直在考虑如何扩展这个项目的功能与使用场景, 有2个方向可以考虑:

  1. 支持proxy-wasm插件
  2. 实现pingsix-ingress-controller

在调研了proxy-wasm的相关功能后, 结论是由于pingora面向的场景是CDN的反向代理, 所以没有考虑过方便的修改请求体与响应体, 这就造成很难基于pingora来实现proxy-wasm的ABI, 如果我要自己定义一个wasm的接口协议, 没法复用社区现有的proxy-wasm插件, 那就没必要了, 不如直接写Rust的插件. 相关参考内容:

在放弃了proxy-wasm的支持后, 我开始调研如何实现pingsix-ingress-controller, 由于pingsix的的资源定义是参考apisix来实现的, 所以就直接参考apisix-ingress-controller来实现我们自己的pingsix-ingress-controller.

编写可维护的代码 -- 面向AI编程

这是最近在小组内做的一次技术分享的文字稿,总体来说我觉得没有表达出特别硬核的内容,我本身也希望说这次分享不用讲的太硬核,在分享的开头还设计了互动环节,分享的过程中也尝试加入一些问答来互动,奈何现公司的技术氛围确实比较沉闷,似乎同事都比较I,好在最后的问答环节有几个比较好的问题,总体来说还算是一次成功的分享吧,希望自己能输出更多的好内容。

P1: 我们写的代码是写给谁看的?

  • (🎤 互动环节): “大家有没有过接手一个项目时,看到的第一感觉是:我该从哪下手?结果花了三天才搞明白一个功能的逻辑。有过类似经历的兄弟举个手我看看?”
  • 小说家写小说给读者,建筑师盖房子给业主… 那我们程序员写代码,最终是写给未来的自己,和接手我们代码的同事看的。
  • 代码的可维护性,决定了我们是在“创造价值”还是在“创造负债”。

P2: 举几个代码坏味道的例子?

  • (🎤 互动环节): “看过《重构》的同学应该都知道代码坏味道。来,大家一起吐槽一下,你在项目里见过最痛苦的代码坏味道是什么?” (引导大家说出几个)
  • 其实按照我朴素的理解,能让我快速理清逻辑的就是好代码,理解起来很费劲的,那肯定就充满坏味道。
  • 正如我在入职后接手的kitam项目,它就充满了这些味道:
    • 代码逻辑不内聚:功能实现像天女散花。
    • 分层过多且混乱:一个请求要穿越重重关卡。
    • 外部依赖离散:数据库、缓存的调用没有统一规范。

Vibe Coding有感: 从PingSIX重构说起

说到“Vibe Coding”,这个词最近在开发者圈子里越来越流行。在过去,我的实践很大程度上还停留在比较初级的阶段:把需求和代码片段在 ChatGPT、Google AI Studio 或是 Grok 之间来回地复制粘贴。来到新公司后,虽然开通了 GitHub Copilot,体验有所提升,但感觉它更多时候还是一个“超级智能补全”工具。直到今年7月份,公司给配上了 Cursor,我的编程体验才真正开启了一场变革,正式进入了 Vibe Coding 的奇妙旅程。

恰好,距离我上次更新个人项目 PingSIX 已经有一段时间了。PingSIX 是一个我基于 Cloudflare 高性能框架 Pingora 开发的 API 网关。两周前,Pingora 发布了 0.6.0 版本,这给了我一个绝佳的契机。我决定利用这个机会,彻底实践一次全程使用 Cursor 的 Vibe Coding,对 PingSIX 进行一次大重构。

这次重构断断续续花了一周时间,最终新增了 6636 行代码,删除了 3578 行。这不仅仅是数字上的变化,整个项目在架构、可维护性、可读性、安全性及性能上,都达到了一个我自己非常满意的状态。