文章目录
- 前言
- 1 先聊聊啥是Harness
- 1.1 说白了就是给大模型套缰绳
- 2 整个框架的底子:一个通用调用函数
- 2.1 所有请求都走这一扇门
- 3 第一步:一口气生成好几个候选答案
- 3.1 别赌运气,我全都要
- 3.2 并发请求的正确打开方式
- 4 第二步:让大模型自己当评委打分
- 4.1 自己生的自己评,闭环了属于是
- 4.2 为啥打分要串行,不一起上?
- 5 第三步:挑个最好的输出
- 5.1 排序取第一,简单粗暴
- 6 把整个流程串起来
- 6.1 一条流水线跑完全程
- 7 最后聊聊这背后的工程思路
- 7.1 拆解开,每个环节都能换
P.S. 无意间发现了一个巨牛的人工智能教程,非常通俗易懂,对AI感兴趣的朋友强烈推荐去看看, 传送门https://blog.csdn.net/HHX_01
前言
不知道你们用大模型写代码有没有这种体验——同一个问题,复制粘贴问三遍,能给你整出三个完全不同的答案。
第一次写的还能用,第二次直接给你整个最优解,第三次好家伙,连不存在的API都敢编出来,美其名曰“创造性输出”,说白了就是幻觉又犯了。
很多人说靠prompt工程能治,我试过,没用。你把prompt写得再细、规矩列得再多,它该抽风还是抽风,就像你跟外卖员反复说三遍“不要香菜”,他该放还是放,全看当天顺手不顺手。
那咋整?靠人一遍遍改?效率太低。今天就给你们唠一套工程化的法子,直接把大模型的随机性给管得明明白白。
1 先聊聊啥是Harness
1.1 说白了就是给大模型套缰绳
Harness本来是马具的意思,就是用来驾驭烈马的。
现在的大模型就像没拴绳的野马,跑起来能直接给你窜到姥姥家,你永远猜不到它下一句能扯到哪去。这个框架的作用,就是给它套上流程缰绳,让它按规矩办事。
核心逻辑特别简单,就三步:先生成好几个候选答案,再挨个给这些答案打分,最后挑分数最高的输出。
说通俗点,就跟公司招人类似——先海投收一堆简历,HR挨个筛选打分,最后选最匹配的发offer。一套流程走下来,靠谱程度直接往上跳一个档次。
2 整个框架的底子:一个通用调用函数
2.1 所有请求都走这一扇门
整个框架最底层,就一个核心函数,专门负责跟大模型对话。
别管你是让它写代码,还是让它当评委打分,所有请求都从这一个函数走。为啥要单独抽出来?总不能生成的时候写一遍调用代码,打分的时候再复制粘贴一遍吧?
以后要加个失败重试、加个请求日志、甚至换个模型用,改这一处就全搞定了。这就像小区的快递柜,所有快递都往这放,取件寄件都找它,不用挨个跟不同的快递员对接。
而且它还兼容所有符合OpenAI接口协议的模型,不管是千问、DeepSeek还是别的,只要接口对上就能插进去用,跟万能充电头似的,走哪都能用。
3 第一步:一口气生成好几个候选答案
3.1 别赌运气,我全都要
大模型每次生成本质上就是概率抽卡,你永远不知道下一次出来的是神级答案还是人工智障。
有人说我把temperature调成0总行了吧?别天真了,就算调成0,它也不敢保证每次输出都一模一样。就像你每天走同一条路上班,总能遇到不一样的红绿灯,没地方说理去。
那咋办?简单粗暴,别赌运气,多抽几次。默认生成3个就刚好——太少了覆盖不到随机性,太多了费token还费时间,3个是成本和效果的经验平衡点。
就跟你和同事拼单买奶茶似的,怕踩雷就点三款不同的,总能喝到一杯合口味的。
3.2 并发请求的正确打开方式
要生成3个答案,总不能一个一个等着生成吧?那效率也太低了。
直接并行发起请求,三个请求一起发出去,省时间。这里就得提Array.from这个神器了。
别瞎写Array(3).map(),那玩意儿创建的是空位数组,map会直接跳过空位,等于白写。就像你点了三份外卖,结果商家只给你装了三个空盒子,纯纯无效操作。
用Array.from就不一样了,一步到位,创建数组的同时就把请求发出去,三个Promise齐刷刷开始跑,能多快就多快。
当然这里也有个小坑——要是其中一个请求挂了,整批都会跟着失败。真上生产环境得做容错处理,咱们先把核心逻辑跑通,这些都是后话。
4 第二步:让大模型自己当评委打分
4.1 自己生的自己评,闭环了属于是
生成完一堆候选答案,总不能人挨个看吧?那也太费劲了,还叫啥自动化。
直接让大模型自己当评委,给每个答案打个0到10的分数,要求就一个:只给数字,别扯别的。
有人说这能靠谱吗?哎你还别说,只要把评分规则写清楚,它评得比很多摸鱼的同事认真多了。你跟它说“当严格的评审”,它就真敢给低分;你跟它说“友好鼓励为主”,它能给你全打9分以上。
所以说,这个评委的prompt本身也是个玄学参数,得慢慢调。还有个小细节,万一它没按要求输出数字,咱也有兜底,直接按0分算,不能让它把整个流程搞崩。
4.2 为啥打分要串行,不一起上?
肯定有人纳闷:生成的时候都并行跑了,打分为啥要一个一个来?一起上不是更快?
这就是实打实的工程经验了。生成的时候并发没问题,但你一下子怼一堆打分请求过去,很容易触发平台的限流,直接给你返回429错误——啥意思?请求太多,给你拒了。
就像你去食堂打饭,三个人一起挤窗口,阿姨直接给你白眼,让你后面排队去。
该快的地方咱们绝不磨蹭,该稳的地方咱们绝不冒进。生成要效率,所以并行;打分求稳妥,所以串行。干活就得这样,不能瞎堆并发装样子。
5 第三步:挑个最好的输出
5.1 排序取第一,简单粗暴
所有候选都打完分了,咋选最好的?
按分数从高到低排个序,取第一个就完事了。
肯定有较真的朋友说,找最大值遍历一遍是O(n),排序是O(n log n),效率低。嗨,一共就三五个结果,排序那点算力开销可以忽略不计。
写个排序,一眼就能看明白啥意思,比写个循环找最大值直观多了。代码首先是写给人看的,顺便能在机器上跑就行,这点小事没必要抠算法复杂度。
6 把整个流程串起来
6.1 一条流水线跑完全程
把上面三步拼起来,就是完整的流水线了。
进来一个需求,先生成3个候选结果,再挨个给它们打分,最后挑分数最高的返回。中间每一步都可以加日志,干了啥、结果是啥,清清楚楚,出了问题也好排查。
就跟工厂的流水线似的,原料从一头进去,经过好几道工序,最后从另一头出来成品。大模型不再是瞎输出的黑盒子,每一步都在你的掌控之中。
7 最后聊聊这背后的工程思路
7.1 拆解开,每个环节都能换
整个框架最妙的地方,就是每个部分各司其职,互不干扰。
想提升输出质量?把生成数量从3改成5就行。想让评测更准确?换个更强的模型当评委。想换择优规则?改成多数投票制也没问题。想加监控加告警?往每个阶段后面插代码就完了。
这就是单一职责的好处,改哪动哪,不会牵一发而动全身。
很多人觉得那些市面上的重型AI框架特别神秘,其实核心逻辑都差不多,都是生成、评测、择优这一套。无非是功能更多、封装更厚,但骨架都是一模一样的。
说白了,对付大模型的幻觉和随机性,别总想着一劳永逸把它根治。就像养哈士奇,你别指望它自己变乖,你给它拴好绳、关好笼,它照样能当听话的乖狗狗。用工程手段把它管起来,比啥都强。
P.S. 无意间发现了一个巨牛的人工智能教程,非常通俗易懂,对AI感兴趣的朋友强烈推荐去看看,传送门https://blog.csdn.net/HHX_01