
1. 货拉拉营销广告场景下的大模型落地思路拆解1.1 为什么货拉拉的营销广告需要大模型介入货拉拉的业务形态决定了它的营销广告跟纯线上互联网产品完全不是一个玩法。一端是海量的司机群体分布在全国几百个城市每个城市的运力供需、车型结构、活跃时段都不一样另一端是货主有搬家、拉货、建材配送、电商退换货等五花八门的需求。营销广告要同时触达这两端而且两端看到的内容、激励方式、触达时机都得不一样。传统做法是靠运营同学手动配人群包、写文案、调出价一个活动从策划到上线少说三五天遇到节假日或者区域运力紧张根本来不及响应。更麻烦的是广告素材的迭代速度远远跟不上业务变化——今天某个城市搬家订单暴涨明天另一个城市小面包车运力过剩靠人力去盯这些信号成本高得离谱。大模型进来之后最直接的价值就是把“人群理解—素材生成—投放调优”这条链路从人工驱动变成智能体驱动。我参与过的几个项目里核心思路不是拿大模型直接替代投放系统而是让它充当一个“懂业务、能决策、会执行”的营销智能体嵌在原有广告平台之上。这样做的好处是风险可控原有投放逻辑不动大模型只负责它最擅长的事理解非结构化信息、生成多样化内容、做多轮推理决策。1.2 整体架构三层结构各司其职我们最终落地的架构分三层从下到上分别是数据层、智能体层和应用层。数据层负责把货拉拉内部的订单数据、司机画像、城市运力热力图、历史广告投放效果等结构化数据以及客服对话、司机社区帖子、货主评价等非结构化数据统一接入。这里有个关键决策我们没有把所有数据都塞进向量数据库做RAG而是做了分层处理。结构化程度高的数据走特征工程直接喂给排序模型非结构化文本才走向量化检索。原因很简单货拉拉的订单数据本身就是高度结构化的强行向量化反而丢失了数值精度和时序关系。智能体层是整个方案的核心我们搭了三个智能体人群洞察智能体、素材生成智能体、投放调优智能体。每个智能体都是独立的服务通过消息队列串联。人群洞察智能体负责从数据层拉取信号输出人群包和卖点建议素材生成智能体根据人群包和卖点批量生成文案、图片描述、视频脚本投放调优智能体则实时监控投放效果动态调整出价和预算分配。应用层就是运营同学实际操作的界面包括智能体工作流配置、素材审核、效果看板。运营不需要懂模型只需要在界面上设定目标比如“本周广州搬家订单转化率提升10%”剩下的交给智能体去跑。1.3 为什么选择Agent架构而不是单模型微调这个问题我们内部讨论了很久。单模型微调听起来简单拿一个开源基座模型用货拉拉的历史广告数据微调一下部署上去就完事。但实际跑下来问题很多第一营销场景变化太快今天微调好的模型下周业务重点变了效果就掉第二微调后的模型是个黑盒运营不知道它为什么推荐这个人群包出了问题没法排查第三一个模型既要理解人群又要生成素材还要做投放决策任务太杂效果互相拖累。Agent架构的好处是每个智能体职责单一可以独立迭代。人群洞察智能体可以用一个7B左右的模型做微调专注理解业务信号素材生成智能体用更大的模型甚至调用外部API专注内容质量投放调优智能体则用规则引擎加小模型保证决策可解释。这样任何一个环节出问题都不会影响全局。而且Agent之间通过结构化消息通信每一步的输入输出都有日志排查问题非常方便。提示Agent架构的代价是工程复杂度上升需要处理服务间通信、超时重试、状态一致性等问题。如果团队工程能力不够建议先从单智能体做起跑通一个场景再扩展。2. 核心智能体的细节解析与实操要点2.1 人群洞察智能体从业务信号到人群包人群洞察智能体的输入是货拉拉各业务系统的实时信号包括城市维度的订单供需比、车型维度的运力缺口、司机维度的活跃度变化、货主维度的搜索关键词热度等。输出是一个结构化的人群包定义包含人群ID、筛选条件、预估覆盖人数、建议卖点。具体实现上我们先用规则引擎做初筛。比如“过去7天在广州搜索过搬家但未下单的货主”这个条件直接用SQL就能圈出来。但规则引擎只能处理明确的条件对于“最近对价格敏感度上升的司机”这种模糊描述就无能为力。这时候大模型上场我们把司机的行为序列接单频率、拒单原因、浏览的社区帖子标题喂给模型让它输出一个敏感度评分和归因解释。这里有个实操细节不要让模型直接输出人群包ID。我们试过让模型生成SQL结果它经常写出性能极差的查询甚至语法错误。后来改成模型只输出筛选条件的结构化描述JSON格式由后端服务翻译成SQL。这样既利用了模型的语义理解能力又保证了查询性能。{ audience_name: 广州价格敏感型活跃司机, conditions: { city: 广州, active_days_last_14: {gte: 5}, price_sensitivity_score: {gte: 0.7}, vehicle_type: [小面包车, 中面包车] }, estimated_size: 12400, suggested_selling_points: [高峰时段加价, 完单奖励翻倍, 油费补贴] }模型输出的卖点建议会直接传给素材生成智能体。这里的关键是卖点必须可验证。我们要求模型在输出卖点时必须附带数据依据比如“高峰时段加价”的依据是“该人群过去7天在18:00-21:00的接单率比均值低23%”。没有依据的卖点会被人工审核打回。2.2 素材生成智能体批量生产不重复的广告内容货拉拉的广告素材需求量非常大。一个城市活动可能需要几十条文案、十几张图片、几条短视频而且不同人群看到的素材不能一样。人工写根本写不过来外包成本又高。素材生成智能体的目标就是把这个环节自动化。文案生成相对成熟我们用了一个经过货拉拉业务数据微调的模型输入人群包和卖点输出多条候选文案。但直接生成有个问题模型容易写出“货拉拉搬家又快又好”这种正确的废话。为了解决这个问题我们在提示词里加了几个约束第一必须包含一个具体数字比如“平均30分钟接单”第二必须针对一个具体场景比如“周末搬家不涨价”第三禁止使用“最”“第一”等绝对化用语。图片生成我们走的是另一条路。纯文生图模型生成的图片虽然好看但经常出现货车车型不对、司机服装不符合货拉拉规范等问题。我们的做法是先用模板引擎生成基础版式再用模型做局部替换。比如背景图用货拉拉的真实车辆照片模型只负责生成文案区域的装饰元素和配色方案。这样既保证了品牌一致性又实现了千人千面。视频脚本生成是最难的。货拉拉的短视频广告通常15-30秒需要在前3秒抓住注意力。我们让模型先分析历史高转化视频的脚本结构总结出几种模板比如“痛点开场解决方案行动号召”然后基于模板填充具体内容。实测下来模型生成的脚本比人工写的转化率低15%左右但产出速度快了20倍综合ROI反而更高。注意素材生成智能体的输出必须经过审核才能投放。我们设了两道关卡第一道是自动审核用规则过滤敏感词和违规内容第二道是人工抽检每天随机抽取5%的素材由运营同学复核。上线三个月后人工抽检的通过率从最初的72%提升到了94%说明模型的稳定性在持续优化。2.3 投放调优智能体实时决策与可解释性投放调优智能体是整个链路里对实时性要求最高的。广告投放的竞价环境每秒都在变化出价高了一毛钱可能就亏了低了一毛钱可能就拿不到量。传统做法是靠人工设置出价系数按小时或按天调整粒度太粗。我们的方案是让智能体每5分钟做一次决策。输入包括当前时段的竞争激烈程度、预算消耗进度、目标人群的转化率预测、历史同时段的出价效果。输出是下一个5分钟的出价调整系数和预算分配建议。这里最大的挑战是可解释性。运营同学需要知道为什么系统把某个城市的出价调高了20%否则不敢放权。我们的做法是让模型在输出决策的同时生成一段自然语言解释比如“广州天河区搬家订单转化率较昨日同期上升18%当前出价低于竞品均价建议上调15%-20%以抢占流量”。这段解释会展示在运营看板上运营可以选择采纳或覆盖。# 投放调优智能体的决策逻辑简化示意 def adjust_bid(city, category, current_bid, budget_remaining, time_slot): # 获取实时信号 conversion_rate get_realtime_conversion(city, category) competition_level get_competition_index(city, category, time_slot) historical_bid get_historical_bid(city, category, time_slot) # 模型推理 prompt f 当前城市{city}品类{category} 实时转化率{conversion_rate}竞争指数{competition_level} 历史同时段出价{historical_bid}当前出价{current_bid} 预算剩余{budget_remaining} 请给出出价调整建议-30%到30%并解释原因。 response llm.invoke(prompt) return parse_response(response)实测下来智能体调优比人工调优的ROI高出22%而且运营同学的工作量减少了70%。他们从每天盯着十几个城市的出价变成了只需要处理智能体标记的异常情况。3. 实操过程与核心环节实现3.1 环境准备与模型选型货拉拉的营销智能体跑在内部私有云上没有用公有云API。原因有两个第一司机和货主的数据涉及隐私不能出内网第二营销场景的QPS波动很大大促期间可能是平时的几十倍公有云API的成本和限流都不可控。模型选型上我们做了对比测试。人群洞察和投放调优用Qwen2.5-7B做微调素材生成用Qwen2.5-14B。选Qwen系列主要是因为中文理解能力强而且社区生态好微调工具链成熟。我们试过Llama系列英文任务确实好但中文营销文案的生成质量明显不如Qwen。微调数据方面人群洞察智能体用了过去两年的运营日志包括运营同学手动圈选人群的条件和对应的活动效果。素材生成智能体用了历史广告素材库大概50万条文案和10万张图片的标注数据。投放调优智能体没有做微调直接用提示词工程加规则引擎因为投放决策对准确性要求极高微调带来的收益不足以抵消风险。# 微调环境配置基于LLaMA-Factory conda create -n huolala-llm python3.10 conda activate huolala-llm pip install torch2.1.0 transformers4.36.0 datasets2.15.0 pip install llamafactory0.4.0 pip install deepspeed0.12.0 # 微调命令示例 llamafactory-cli train \ --model_name_or_path Qwen/Qwen2.5-7B-Instruct \ --dataset huolala_audience_insight \ --template qwen \ --finetuning_type lora \ --lora_target q_proj,v_proj \ --output_dir ./output/qwen7b-audience \ --per_device_train_batch_size 4 \ --gradient_accumulation_steps 8 \ --learning_rate 1e-4 \ --num_train_epochs 3 \ --save_steps 500 \ --logging_steps 50LoRA微调的好处是显存占用低一张A100 40G就能跑7B模型的微调。我们用了4张A100整个微调过程大概6小时。微调后的模型在人群洞察任务上的准确率从基座的68%提升到了89%效果非常明显。3.2 智能体工作流搭建智能体之间的协作我们用了轻量级的消息队列没有上复杂的Agent框架。原因很简单货拉拉的营销场景流程是固定的不需要动态规划。人群洞察→素材生成→投放调优这条链路是线性的用消息队列串联就够了。引入复杂的Agent框架反而增加了调试难度。工作流的触发方式有两种定时触发和事件触发。定时触发是每天早上8点跑一次全量人群洞察生成当天的投放策略。事件触发是当某个城市的供需比超过阈值时实时触发该城市的人群洞察和素材生成。# 智能体工作流配置示例 workflow: name: daily_marketing_pipeline triggers: - type: schedule cron: 0 8 * * * - type: event source: supply_demand_alert condition: supply_demand_ratio 1.5 steps: - agent: audience_insight input: {{ trigger.payload }} output: audience_package - agent: creative_generation input: {{ audience_package }} output: creative_assets - agent: bid_optimization input: {{ creative_assets }} output: bid_strategy error_handling: retry: 3 fallback: manual_review每个智能体的输出都会写入数据库方便回溯和审计。我们特别记录了每次决策的输入信号、模型输出、人工干预情况这些数据后来成了优化模型的重要素材。3.3 效果监控与迭代闭环上线只是开始真正的功夫在迭代。我们搭了一个效果监控看板核心指标包括人群包覆盖率、素材点击率、转化率、ROI、智能体决策采纳率。每天早会运营同学会过一遍这些指标发现异常就标记出来。迭代闭环的关键是把人工干预变成训练数据。当运营同学覆盖了智能体的决策系统会自动记录覆盖前后的状态和最终效果。这些数据每周汇总一次用来做模型的持续微调。我们管这个叫“人在回路”的迭代机制。举个例子智能体建议对广州搬家货主投放“首单立减20元”的素材但运营同学改成了“搬家送搬运券”。系统记录了这个干预一周后发现运营的版本转化率更高。这批数据进入训练集后模型逐渐学会了在搬家场景下优先推荐服务类权益而不是现金补贴。提示人在回路的迭代机制需要控制频率。我们一开始每天微调一次结果模型震荡很严重。后来改成每周一次效果稳定了很多。微调数据量少于500条时不建议启动微调直接用提示词工程调整即可。4. 常见问题与排查技巧实录4.1 模型输出不稳定怎么办这是最常见的问题。同一个输入模型今天输出A明天输出B运营同学根本没法用。我们的解决方案是三层控制第一层是温度参数调低人群洞察和投放调优的温度设为0.1素材生成设为0.7第二层是输出格式约束用JSON Schema强制模型按固定结构输出第三层是后处理校验对关键字段做规则检查不通过就重试。# 输出格式约束示例 from pydantic import BaseModel, Field class AudiencePackage(BaseModel): audience_name: str Field(description人群包名称) conditions: dict Field(description筛选条件) estimated_size: int Field(ge0, description预估覆盖人数) selling_points: list[str] Field(min_length1, max_length5) # 调用模型时传入schema response llm.invoke(prompt, response_formatAudiencePackage)实测下来加了格式约束之后输出解析失败率从12%降到了0.3%。剩下的0.3%主要是模型生成了超出范围的值比如预估人数为负数后处理直接拦截重试。4.2 素材生成出现品牌违规怎么防货拉拉对品牌形象有严格要求广告素材不能出现“最便宜”“绝对快”等绝对化用语也不能出现司机抽烟、车辆脏乱等负面画面。模型生成的内容偶尔会踩线我们的做法是建了一个品牌词库和画面规则库生成后自动扫描。词库分三类禁用词直接拦截、敏感词人工审核、推荐词优先使用。禁用词包括“最”“第一”“唯一”等敏感词包括“便宜”“低价”等需要结合上下文判断推荐词包括“准时”“专业”“省心”等品牌调性词。画面规则库则是用另一个视觉模型做检测识别生成图片中是否包含违规元素。这个视觉模型是用货拉拉历史审核数据微调的准确率能做到95%以上。4.3 智能体决策与人工判断冲突怎么处理这个问题在投放调优智能体上特别突出。运营同学有经验模型有数据两边判断不一致时听谁的我们的原则是日常决策听模型的异常情况听人的。具体来说当模型决策的置信度高于0.8时直接执行运营只做监控置信度在0.5到0.8之间时推送给运营确认低于0.5时模型只给建议由运营决策。置信度是模型输出的一个概率值我们在微调时专门训练了模型输出置信度。这套机制运行半年后运营同学的干预率从最初的35%降到了8%说明模型在大部分场景下已经能做出和人工一致的判断。4.4 常见问题速查表问题现象可能原因排查步骤解决方案模型输出格式错误提示词约束不够检查response_format是否生效加强JSON Schema约束增加重试机制人群包覆盖人数为0筛选条件过严逐步放宽条件测试设置条件优先级允许部分匹配素材点击率骤降素材同质化检查近期生成素材的相似度增加多样性约束引入随机种子投放ROI为负出价过高或人群不准对比历史出价和转化率降低出价系数重新圈选人群智能体响应超时模型推理慢或队列积压检查GPU利用率和队列长度增加推理实例优化批处理人工审核通过率低模型偏离业务规范分析被拒素材的共同特征补充微调数据更新品牌词库4.5 几个踩过的坑第一个坑是过度依赖模型做数值计算。我们一开始让模型直接算人群包的预估覆盖人数结果它经常算错因为它不擅长精确的数值运算。后来改成模型只输出筛选条件覆盖人数由后端用SQL count算准确率100%。第二个坑是忽略冷启动问题。新城市、新品类没有历史数据模型效果很差。我们的解决方案是先用相似城市的数据做迁移同时降低智能体决策的权重等积累够数据再逐步放权。第三个坑是没有做流量隔离。智能体刚上线时直接全量投放结果出了几次事故影响面很大。后来改成先拿5%的流量做实验效果稳定后再逐步扩量。这个教训很深刻任何新系统上线都要有灰度机制。注意大模型在营销广告的应用不是一锤子买卖而是一个持续迭代的过程。模型需要跟着业务变化不断调整运营同学也需要时间适应和智能体协作。建议至少留出3个月的磨合期不要指望上线即巅峰。5. 关于成本与效率的一些实测数据最后分享一些我们实测的成本数据给准备入坑的团队一个参考。硬件方面我们用了4张A100 40G做推理2张A100做微调整体GPU利用率在60%左右。电费和折旧摊下来每月大概3万块。相比之前外包写文案和人工调价的成本每月节省了大概15万。效率方面人群包生成从原来的平均4小时缩短到8分钟素材生成从3天缩短到20分钟投放调优从按天调整变成每5分钟调整。运营同学从执行者变成了监督者人均管理城市数从3个提升到了12个。当然这些收益不是白来的。前期投入了大概6个人月做开发和调优中间经历了多次效果反复。我的体会是大模型在营销广告的价值是确定的但落地路径需要根据团队实际情况设计。工程能力强的团队可以自建Agent架构工程能力弱的团队建议先从单点场景切入比如只做素材生成跑通了再扩展。这个方向后续还可以往多模态素材生成、跨渠道投放协同、实时竞价策略优化等方向延伸。货拉拉的业务场景足够复杂大模型能发挥的空间还很大。