前几年大家聊 AI,聊的都是“它能不能替我干活”;今年风向变了,大家都在问“它能不能替我做决定”。AI 代理(Agent)就是这股新浪潮的主角:你不只让它查资料、写摘要,而是让它自己去比价、去谈判、去跟乙方周旋,最后带着一份像样的合同回来。听起来很科幻,但真正上手做过一轮之后,你会发现一个特别反直觉的事实:AI代理能不能替你谈成交易,瓶颈根本不在模型推理能力,而在它是否知道你真正想要什么。
我最近用开源多代理框架配合本地模型,尝试搭了一套“采购谈判代理”,顺手还接入了 ROS 仿真环境做沙盒演练。整个过程踩了不少坑,也把“目标定义”这个最容易被忽略的环节翻来覆去改了好几版。今天把思路、实现和坑都整理出来,讲清楚一件事:在把你的交易交给代理前,你手里最值钱的不是那份提示词,而是你对自己需求的结构化描述。
1. 项目整体设计与思路拆解
1.1 为什么 AI 代理谈判的第一步不是写提示词,而是做需求建模
我最初犯的错很典型:一上来就让大模型扮演“金牌采购”,给它一堆谈判话术,让它去跟供应商聊。结果显示很“聪明”,话术铿锵有力,但聊到关键条款时总是抓不住重点——它会在交货周期上死磕,却对付款方式的让步风险毫无感知;它会努力压单价,却忘了订单总价里还藏着运费和安装费。
后来我换了个思路:先把“我到底想从这笔交易里得到什么”写成结构化目标,再让代理在这个目标框架内自由发挥。效果一下子不一样了,它知道什么能让、什么不能放,知道每个让步的“成本”是多少,甚至在对方抛出模糊承诺时能识别出这是“无效条款”。
这个转变的关键在于:聊天式交互对完成“一次问答”很有效,但交易谈判是一个多轮决策过程。决策的前提是目标,目标是可度量的指标,而不是自然语言里的模糊愿望。你把“我要便宜点”塞给代理,它只能猜你的底线;你把“总成本占比低于预算 15%,交货 SLA 不低于 99.5%,付款周期不短于 60 天”告诉它,它才能在谈判桌上精确计算每一步的得失。
所以在这个项目里,我把整体设计分成了三层:
- 目标层:负责解析我的需求,把模糊表述转化为可量化的目标清单,并标记优先级和互斥关系。
- 策略层:基于目标清单生成谈判策略,包括初始报价、让步空间、底线条件和谈判风格。
- 执行层:由多个子代理分别负责信息收集、对手建模、条款评估和对话生成,通过协调机制联动。
这个分层最大的好处是:每一层都能单独测试和替换。目标层写错了,改目标层就行,不用推翻整个提示词体系;执行层换了更强的模型,目标和策略层依然稳定。这对后续迭代维护来说,价值比一时的高准确率重要得多。
1.2 多代理架构与本地模型的选型理由
这套系统我没有用单一的大模型“一肩挑”,而是拆成了多个子代理。原因很实际:单一代理既做信息检索又做谈判决策又做条款合法性检查,会严重超出它的注意力承载范围,结果就是上下文被无关信息灌满,关键信息反而丢失。拆成信息收集代理、谈判策略代理、条款评估代理、对话执行代理之后,每个代理的职责窄而清晰,上下文窗口利用率高,也方便给每个子代理配置不同的模型和权限。
权限隔离这件事很容易被忽略。举个例子:信息收集代理只需要网络搜索和文档读取权限,条款评估代理需要合同模板和财务计算能力,而对话执行代理最怕的是“手滑”直接执行付款。如果所有功能都塞给同一个代理,风险面会大得离谱。拆开之后,对话执行代理默认没有任何敏感操作权限,只能输出谈判回复文本,其他动作都走审批流。这个设计后来救过我一次——沙盒测试里有个子代理意外生成了“接受预付款 100%”的回复,因为动作层无权限而直接被我拦了下来。
本地模型的选择,核心考虑是数据边界和成本可控。交易谈判涉及企业采购价格、供应商信息、财务预算,这些数据放在云端 API 上总归不踏实。我在本地跑了量化版的轻量模型,由于它是私有化部署,推理日志、谈判记录都留在本机,整个链路的数据闭环都是自己的。从响应速度上看,本地模型在一般配置的图形工作站上表现也能接受,单轮代理决策约 2-5 秒,这在谈判场景中完全够用,因为谈判节奏由人控制,不需要毫秒级响应。
结合热词里提到的“openclaw+ros”组合,我这套执行层还可以发布成 ROS 节点,把代理接入机器人仿真环境做沙盒推演:让代理与模拟的“供应商代理”在仿真空间里完成一轮交易博弈,过程中所有状态变化都可视化出来。这本质上是用环境工程的语言来验证 AI 代理决策的质量,门槛比想象中低,价值却很高。
2. 核心细节解析:它必须先知道你真正想要什么
2.1 目标谱系:模糊愿望如何转成可执行指标
“知道你想要什么”这句话说得轻巧,落地极难。难在大多数人自己也不知道自己要什么。举个我在项目中用的例子:最初我给自己定了一个模糊目标——“以合理价格采购一批传感器套件”。这个目标丢给任何代理,都会得到随机结果。后来我花了两天把它拆成了一张目标谱系表,拆完之后自己都惊了:原来我对这笔交易的真实诉求,和最初脑子里的印象根本不一样。
我建议的拆解方式是自上而下分成四个层级:
- 商业目标:这笔交易在更高层面上要服务什么目的?比如“支撑未来三个月的研发试制”。
- 成本约束:包括显性的采购单价、总价上限、预算占比,也包括隐性的时间成本、试错成本。
- 质量与风险底线:产品可靠性指标、供应商资质、售后响应时间、交货违约概率等。
- 关系与偏好:是否有长期合作意愿、是否扶持特定供应商、对谈判氛围的风格偏好。
拆完之后,再给每个明细项打三个标签:硬约束(不可突破)、软偏好(可以弹性)、交易筹码(可以主动让步以换取更重要的利益)。这套标签体系是代理做决策时的核心依据。
光有清单还不够,还得解决目标之间的冲突。我遇到过一个典型冲突:想让采购成本降到最低,同时又要求交货周期最短、账期最长——这三个目标在真实商业环境下是互相拉扯的。代理如果没有明确的优先级排序,它只会随机摇摆。于是我给每个目标项定义了权重,并且写清楚了“主目标”和“次目标”:主目标是成本达标,次目标是加快交货,账期是可谈判项。一旦排序明确,策略层就能算出每一步让步的“机会成本”。
2.2 让代理理解的不仅是目标,还有边界与策略偏好
目标清单解决了“要什么”,但还没解决“怎么要”。同一个“价格压低 10%”的目标,在强势供应商面前和弱势供应商面前是完全不同的打法。所以我额外配置了三个维度的策略偏好:
第一是信息策略。我要不要先亮出自己的预算上限?预算上限是硬约束还是虚标?第一轮报价给多少留出让步空间?这些在目标层里都有对应描述,策略层根据对手的首次回应动态调整。
第二是让步机制。我定义了一张让步偏好表,写明哪些可以让、让到什么程度、交换条件是啥。比如:可以接受付款周期从 60 天缩短到 30 天,但前提是供应商把单价下调 3%。每一对“让步-补偿”之间都有数值计算逻辑,代理在对话中一旦发现对方接受补偿条件,就自动记录为“已成交项”,避免后面反复拉扯。
第三是对话风格。同样是砍价,你可以用合作口吻,也可以用对抗口吻,效果截然不同。我给代理设了两种风格模板,默认合作探讨型,对方若连续三次强硬表态则切换为坚定型。这个切换规则的触发条件也在目标文件里预先定义好,而不是模型自己临时发挥。
有人可能觉得这些配置太繁琐。但实话说,配置这些信息的过程,本身就是一次很有价值的自我审视。你会发现:原来我以为自己很在乎价格,实际算下来更在乎交付风险;原来我以为账期可以商量,实际上现金流根本不答应。这些认知,人自己都没想清楚之前,不要指望任何技术替你补全。
3. 技术实现要点与实操过程
3.1 定义目标文件:用 YAML 描述你的交易需求
项目的第一步是把需求写成结构化配置文件。我选择 YAML 是因为它可读性强、层级清晰,还能被当前主流开发框架直接解析。下面是一个简化但完整的目标定义示例:
commercial_goal: name: "传感器套件采购" purpose: "支撑未来三个月研发试制,不涉及量产需求" cost_constraints: total_budget_cny: 120000 target_unit_price_cny: 850 unit_price_ceiling_cny: 1000 is_budget_hard_constraint: true payment_terms_days: 30 payment_terms_range: [15, 30, 60, 90] quality_risk: return_rate_threshold: 0.01 delivery_sla_percent: 99.5 warranty_months: 12 supplier_certifications: ["ISO9001", "RoHS"] relationship: long_term_cooperation: true preferred_supplier_ids: ["SP-1024"] negotiation_style: "collaborative" trade_offs: - give: "extend_payment_days_to_60" take: "unit_price_reduce_by_3_percent" - give: "increase_order_qty_by_20_percent" take: "delivery_time_shorten_by_5_days" needs_definition: must_have: - "unit_price <= 1000" - "delivery_sla >= 99.5%" - "return_rate <= 1%" nice_to_have: - "unit_price <= 850" - "payment >= 60 days" - "warranty >= 24 months" deal_breakers: - "supplier without ISO9001" - "delivery_time > 30 days"我故意把“必须”“期望”“红线”三条列表分开,因为这三类信息对应的策略完全不同:must-have 是底线,不能动,谈判中只有守住和确认两种操作;nice-to-have 是实现满意度的关键,谈判中用来争取和交换;deal-breakers 是触发器,一旦触发直接终止本轮交易。模型可以自己发挥的,只有 nice-to-have 部分。
配置好这套文件后,我写了一段解析逻辑,把 YAML 转成代理内部统一的目标表示 JSON,并生成一份“决策卡片”,里面包含初始报价、最低可接受价、让步次序和终止条件。决策卡片在执行阶段作为注入给谈判代理的“宪法文本”,即最高优先级上下文。
3.2 编排子代理:信息收集、对手建模、策略生成与话语输出
执行层我开了四个子代理:
- 信息收集代理:负责搜索供应商公开报价、行业平均价格、供应商资质和交付评价,结果汇总给策略层。
- 对手建模代理:根据与“供应商代理”的前几轮对话,推断对方的让步模式、实力底牌和谈判风格。
- 策略生成代理:读取目标文件和当前对话状态,生成下一步行动建议(报价、追问、施压、妥协、终止)。
- 对话执行代理:把策略建议翻译成自然语言回复,并附上动作标记(update_state, request_clause, propose_compromise 等)。
这四个子代理之间不直接对话,而是通过一个中央黑板(blackboard)传递信息。每个子代理把产出写入黑板,其他代理按需读取。这个模式比子代理之间互相发消息更可控,也更容易追溯每一次决策的来源——出问题时能直接回放黑板上每一轮状态变化。
子代理协作中最重要的是“反馈闭环”。策略生成代理给出“提出折中方案”的建议后,对话执行代理如果生成了不匹配的措辞,黑板里的状态更新就会不一致,我写了一个轻量的校验函数来拦截这种情况。简单说就是:动作标记与策略建议不一致时,返回重新生成,最多重试两次;两次仍不一致,则输出“need_human_input”并暂停谈判等待人介入。
这套机制很关键,因为模型偶发性的跑偏不可避免,但谈判不允许“乱说话”。把一致性校验放在动作标记层而不是自然语言层,是技术上更稳的做法——自然语言层面做语义校验成本高且误判多,动作标记是结构化的,校验准确率接近满分。
3.3 沙盒模拟:在注入 ROS 的环境里先跟自己人打一仗
真实的供应商很忙,经不起你拿一个没调好的代理去练手。我做了两层沙盒:
第一层是纯文本模拟。我另起一个模型实例扮演“供应商代理”,它拿一份供应商侧的目标配置文件,跟我的采购代理展开谈判。两者在同一个黑板框架下运行,只是目标文件完全不同。这一层用来调策略参数,比如让步幅度、触发条件、对话风格切换阈值,都能快速迭代。
第二层是 ROS 仿真集成。我把采购代理和供应商代理都封装成 ROS 节点,在 Gazebo 仿真环境里模拟一个“供应链博弈”场景:采购方有需求清单和时间窗口,供应商有库存和产能约束,双方在仿真环境中“交货”。跑完一轮之后,重新开始下一轮,直到累计收益曲线稳定。这个集成的价值在于引入了物理世界的约束维度——比如供应商虽然嘴上说能 7 天交货,但仿真中受产能约束根本交不出来,代理就会在谈判中更早识别出这一点而拒绝不切实际的承诺。
openclaw 框架在这层起了调度作用。它本身是多代理协调框架,我把目标解析、策略生成和动作校验跑在其上,ROS 节点负责仿真环境的读写,两套系统通过标准消息接口互通。整个链路调试顺畅后,我只需在 openclaw 的配置里替换不同的模型接口,就能快速测试本地模型和云模型的差异。
3.4 从沙盒到真实场景:部署时的安全兜底设计
沙盒里跑得再顺,第一次上真实场景也必须佩戴“安全绳”。我的做法是三层兜底:
第一层是数量上限锁。任何子代理输出里的金额数字、日期数字、百分比数字,都会经过一个校验函数,超出目标文件设定的范围时自动标记为违规并拦截。这个函数不需要模型理解语义,纯用户定义的规则判断,零延迟且绝对可靠。
第二层是人类审批节点。代理在三个关键节点必须暂停等人工确认:首次报价调整超过 10%、接受对方新增条款、触发 deal-breaker 但代理建议继续谈。审批通过后代理才能继续执行。这类节点数量不多,不会频繁打断流程,但能覆盖高风险动作。
第三层是完整日志回放。每个子代理的输入输出、每个黑板的读写动作、每一次状态变更,都记录成结构化日志。事后我可以按时间轴回放一遍整个谈判过程,清楚看到代理是在哪一步开始偏离目标,是信息源的问题还是参数配置的问题。没有这套日志,调试代理就像在黑箱子里摸按钮,出了 bug 根本无从下手。
这三层兜底层层递进,前两层防患于未然,第三层用来事后复盘。实际跑下来,三层机制消耗的开发时间比想象中少得多,但带来的安全感巨高。
4. 常见问题与排查技巧实录
4.1 目标文件写清楚了,代理还是跑偏:先查目标竞合关系
这是发生频率最高的问题。配置里单价要低于 1000、账期不短于 60 天,代理谈着谈着就开始在账期上大幅让步,明确违反了 nice-to-have 里的期望。回看日志才发现:目标文件里 cost_constraints 下的账期默认值是 30 天,trade_offs 里又写了“可以用 60 天账期换 3% 降价”,导致代理认为账期是一个可交换筹码。但实际上 60 天账期正是我现金流的关键,两个配置互相打架。
排查思路很简单:把目标文件喂给策略代理之前,先让它输出一份“目标一致性检查报告”,明确列出所有目标之间的最大让步边界。如果检查出冲突,就先改配置再继续跑,不要带病谈判。
4.2 代理疑似过度拟合,开了话术但忘了底线:提升防线优先级
有次测试中会话代理“火力全开”,问候语滴水不漏,但聊到第六轮时直接接受了对方提出的“预付 50% 尾款货到结清”方案,完全不管目标文件里写的账期底线。日志显示策略代理确实给出了“拒绝该方案”的建议,但对话执行代理在生成回复时发生了语义偏移,生成的文本和动作标记不一致,而校验函数当时只校验了触发子代理后的第一轮输出,漏掉了后续接力输出。
修复方案是:把防线优先级提到所有子代理输出处理流程的顶层,无论哪个子代理在哪个环节输出,必须先过规则校验再过模型语义检查,并且校验函数里对“账期变化”和“付款方式变化”这类高风险字段单独加了一个覆盖值比对。从那以后,再没出现过类似疏漏。
4.3 本地模型和云模型表现差异巨大:归因于上下文压缩率
同一个代理编排、同一份目标文件,本地模型跑的谈判结果比云 API 差不少。细看日志发现,本地模型在长上下文中丢失了早期目标细节,策略层给出的建议开始变得“短视”——只关注最近两轮对话,忽略了最初配置的商业目标。这本质上是上下文压缩导致的信息衰减。
应对措施有两个:一是把核心目标信息在每一轮进入策略层之前重新注入一次,确保模型从头到尾都“看得到”初始目标;二是把每个子代理的上下文窗口限制得尽可能小,只保留与当前任务相关的必要数据,避免无关信息稀释注意力。实测下来,这两个措施把本地模型的表现差距缩小到了可接受范围,对私有化部署依赖较重的团队尤其重要。
4.4 谈判陷入僵局时代理不会变通:补充“B 计划”模板
最让我抓狂的一次是代理和供应商在交货周期上死磕了八轮,双方都咬死不松口。其实真实谈判里这种僵局很常见,解法是跳出当前议题,引入新变量来破局。代理没有主动想到这个策略,因为它没有被赋予“僵局处理”的知识。
我在策略层里预置了一个僵局处理流程:连续三到五轮目标进展低于阈值时,主动切换议题,提出“增加订单量换取交货周期缩短”“接受分批发货而非一次到货”“引入备选供应商制造竞争压力”等可执行方案。这个流程谈不上高深,但必须显式写进策略层——别指望模型凭空变出你没有教过它的玩法。
4.5 快速排查表
| 症状 | 可能原因 | 排查路径 |
|---|---|---|
| 代理频繁让步关键条款 | 目标文件竞合、权重模糊 | 跑一致性检查报告,逐条核对 is_hard_constraint 和 trade_offs |
| 报价离谱超出预算 | 数字校验层失效 | 检查规则函数是否覆盖所有金额字段,尤其是嵌套字段 |
| 谈判风格前后不一致 | 风格切换触发条件过于模糊 | 把手动切换改为基于对方动作的显式状态机 |
| 代理在长对话中遗忘初始目标 | 上下文压缩、信息稀释 | 每轮注入核心目标摘要,限制子代理上下文只保留必要数据 |
| 僵局中无限重复 | 缺少策略层干预流程 | 添加僵局检测函数,超过阈值主动切换议题 |
| 本地模型与云模型结果差异大 | 上下文压缩率不同 | 对比同轮次日志,定位信息丢失节点,针对性做重注入 |
| 审批节点过多,打断频繁 | 防线位置设置不合理 | 把审批集中在高风险动作上,低风险动作去掉人工干预 |
5. 扩展:这套思路还能用在哪些交易场景
交易谈判的思路一旦跑通,换场景只是换目标文件的问题。我目前已经在规划两个衍生应用:
一个是设备维保合同谈判代理。这类合同的难点在于条款里埋着大量模糊表述,比如“乙方负责设备维修”但没写清维修响应时间、配件价格上限、是否含上门费。代理需要把目标文件重心放在“模糊条款显式化”上,逐条比对合同模板与历史案例里的常见坑。
另一个是跨部门预算分配代理人。多个业务部门同时提出资源需求,代理作为中立协调者,每个部门给出自己的目标文件,代理在预算约束下计算最大满意度组合。本质上是一个多目标优化问题,与谈判采购相比,少了价格博弈,多了群体决策。但架构完全复用——目标层、策略层、执行层都不用大改,只是对话对象从供应商换成了内部部门负责人。
顺着这个思路往后走,我认为接下来更值得探索的方向是多代理参与的签合同链路:采购代理负责谈商务条款,法律代理负责逐条审阅风险,技术代理负责核验产品规格,三个代理共享一个目标黑板但各司其职,最后由人类做最终签署确认。这种协作模式比单一超级代理更容易追踪责任、更容易 Debug,也更符合现实组织中的职责分离原则。
使用这套方案之后,我对“AI 代理会不会替代人类谈判”这个话题有了更实际的判断:短期内,代理替代的是你“谈判前信息准备”和“谈判中计算辅助”的环节,而不是你本人。真正不可替代的,恰恰是你愿意花多少时间去想清楚自己的目标——这件事任何模型都帮不了你。目标想清楚之后,后面的活儿,倒是真的可以放心交给代理去干了。