被裁后我用Function Calling搭了个测试工具,差点把自己送走
我叫老周,全栈开发,三十二岁。去年十月被上家公司“优化”,拿了N+1,在天通苑租了个单间,开始接外包。
起因:一个快把我逼疯的外包项目
七月底接了个活儿:智能客服创业团队,后端FastAPI,前端React。核心是用户自然语言提问,系统匹配知识库答案。他们的意图识别模块接了大模型,用Function Calling做工具调用分发。用户说“我订单怎么还没发货”,系统得先识别出“物流查询”意图,再调用对应函数。问题是这玩意儿怎么测?
传统测试工具没法搞。pytest断言JSON结构没问题,但Function Calling返回的工具调用参数对不对、上下文关联准不准,跟大模型“心情”似的,同一句话问三次能给你三个不同结果。客户QA天天在群里@我,说识别率又掉了。
更麻烦的是还牵扯TensorFlow Serving。部分意图分类是本地小模型跑的,每次回归测试我得手动起服务、构造请求、比对结果,一轮至少四十分钟,一天七八轮。
转机:Cline和智谱清言
八月中旬,我在技术群里看到有人提Cline——一个VS Code插件,AI编程助手,能读整个项目上下文,帮你改代码、写测试、跑命令。装完Cline,我接了智谱清言。为什么选智谱?便宜。GLM-4的Function Calling能力在国产模型里算能打的,API成本比海外模型低一截。个人开发者每一分钱都得算着花。
然后我开始干一件异想天开的事:让Cline帮我写一个专门测试Function Calling的工具。
思路如下:
第一,把测试用例写成结构化JSON,包含用户输入、期望意图、期望工具名和关键参数:
{
"test_id": "shipping_001",
"input": "我周三下单的耳机怎么还在揽收",
"expected_intent": "logistics_query",
"expected_tool": "query_shipping_status",
"expected_params": {
"order_keyword": "耳机",
"time_range": "周三"
}
}
第二,写Python脚本批量发送给模型接口。一路走智谱GLM-4的Function Calling,另一路走TensorFlow Serving的本地意图分类模型,两边结果对比。
第三,用Cline迭代脚本。Cline最牛逼的不是写代码快,而是理解上下文。我说“把异步请求改成httpx的AsyncClient,加上超时处理”,它扫一眼项目结构就改好了。
具体的坑,一个比一个深
坑一:Function Calling返回的JSON格式千奇百怪。 智谱返回的tool_call参数有时是字符串,有时是嵌套对象,有时干脆是空数组。我写normalize函数统一格式,结果这函数自己写了快两百行。参数名大小写不一致、数字被转成字符串、布尔值变成字符串"True"。我凌晨两点对着终端骂:这他妈是JSON还是抽奖?
坑二:TensorFlow Serving的请求格式和本地推理不一样。 本地跑模型直接传numpy数组,但通过Serving的gRPC或REST接口得编码成protobuf或JSON。而且Serving对请求体大小有限制,几条长文本直接报413,只能拆小批次发。
坑三:Cline也不是万能的。 有次它帮我重构normalize函数,自信满满改了一版,结果一个正则写错了,把“周三”匹配成了“周”。我盯着diff找了半天。后来学乖了:Cline改完的代码,重要逻辑必须自己过一遍。AI辅助编程,不是AI替你编程。
坑四:判定“通过”和“不通过”是玄学。 大模型输出有随机性,temperature设0.1和0.7结果完全不同。客户要求“识别准确率95%以上”,但工具名对了参数错了算不算?意图对了工具选错了算不算?跟客户掰扯两天,最终定规则:意图和工具名必须全对,参数用模糊匹配,关键参数(订单号、日期)必须精确匹配,其他参数允许部分匹配。
工具成型:跑通的那一刻
花了两个星期,工具终于稳定跑起来了。我给它起名fc-test-runner。流程如下:
- 读取
test_cases/目录下的JSON用例文件 - 并发请求智谱Function Calling接口,获取tool_call结果
- 并发请求TensorFlow Serving意图分类接口
- 合并两边结果,对比预期值
- 生成HTML报告,标注每个用例的通过/失败状态和差异详情
跑完三百个用例,从四十分钟缩短到六分钟。Cline还帮我加了watch模式,改完测试用例自动触发重跑。
最爽的是上周三。客户QA发了个新问题:“用户说‘我昨天买的那个东西怎么取消’,系统识别成了退货意图,应该是取消订单意图。”我打开终端,把句子加进测试用例,跑三轮,发现是本地TensorFlow模型的分类边界问题。调了阈值,重新跑,全绿。整个过程不到十五分钟。我在群里回了句“修好了”,然后出门吃了碗二十块的牛肉面。那碗面吃得特别香。
反思:工具不是目的,解决问题才是
回头看,这个测试工具没什么技术含量,就是写脚本、调API、处理数据。但它的价值在于:把一个不可控、黑盒、随机性强的测试过程,变成了可重复、可量化、可追踪的流程。
被裁后最大的感受:在公司时有很多“看起来在做事情”的工作——开不完的会、写不完的周报。真正解决问题的时刻很少。接外包后每一分钟都是自己的,做的东西有没有用,客户第二天的反馈就是答案。这种反馈很残酷,但也很爽。
Cline和智谱清言本质上在降低“把想法变成代码”的成本。以前想到一个测试方案,一想到要写几百行代码就放弃了。现在花十分钟描述需求,让AI把骨架搭好,我再往里面填肉。这个变化对个人开发者是实打实的效率提升。
但这些工具不会替你思考。测试用例怎么设计、判定规则怎么定、哪些参数关键,还是得靠对业务的理解。AI能帮你写代码,但写不出“这个客户到底想要什么”的答案。
最后说几句
天通苑的房租下个月又要交,3500块。最近秋招季,朋友圈不少人在晒offer,也有人跟我一样漂着。我不觉得被裁是天塌下来的事,也不装什么“裁员让我找到人生新方向”的鸡汤。就是活着,接活,写代码,交房租。
如果你也在做类似的事情,或者被Function Calling、TensorFlow Serving折磨过,欢迎留言聊聊。特别是那种“同一句话问三次模型给你三个不同结果”的痛,我太懂了。
工具会越来越强,但问题永远比工具多。我们能做的,就是别被问题淹死。

评论 0