物流路径优化从来不是一道单纯的几何题。一个城市配送网络里,车辆有载重上限,客户有收货时间窗,仓库有装车顺序,路上还有限行和实时拥堵。传统做法依赖VRP求解器或启发式算法,但业务人员描述需求的自然语言和求解器需要的结构化输入之间隔着一条沟。大模型Prompt正好可以架在这条沟上:它把模糊的运输规则、异常场景和人工经验转成机器能执行的约束与任务描述,再配合求解器完成路线计算。

如果把物流路径优化比作一条流水线,需求描述是原材料,求解器是加工机床,那么Prompt就是中间的夹具和编程接口。夹具不稳定,再好的机床也生产不出合格零件。因此,设计物流场景的大模型提示词时,重点不是让模型替代算法,而是让它把非结构化信息整理成算法能接收的格式,并持续校验输出质量。
一、把大模型放在正确的位置:不是替代求解器,而是调度层
不少团队尝试让大模型直接输出访问顺序来解决车辆路径问题,但结果往往不可靠。比如50个客户点的旅行商问题,模型可能生成一条看似通顺的路线,实际却出现漏点、重复访问或违反载重约束。这是因为大模型擅长语言理解和模式匹配,并不擅长精确的组合优化与数值计算。更合理的分工是:大模型负责理解和结构化业务需求,求解器负责在约束下搜索最优或近似最优解。Prompt在这里相当于一个编译器前端,把订单、车辆、仓库、时间窗等信息整理成VRP模型的标准输入。
举个例子,调度员说:“明天上午十点前必须送到,司机中午要休息半小时,A客户卸货要45分钟。”如果直接写进代码,需要人工枚举字段。通过Prompt可以让模型抽取为包含time_window_start、time_window_end、service_duration、break_rules等字段的JSON。模型还能识别隐含约束,比如冷冻品不能和普通货混装,需要拆成两个舱位或不同车辆。这个过程不要求模型计算距离,只要求它准确翻译规则。
所以在设计提示词时,第一句话就应该明确模型不负责求解最短路径。否则模型容易输出不可靠的路线建议,干扰后续求解器工作。把大模型定位成调度层,既发挥它的抽取和推理能力,又避免它进入不擅长的数值优化领域。
二、物流路径优化提示词的四个关键模块
一个可复用的物流提示词通常包含四个部分:角色定义、任务边界、约束注入、输出格式与校验规则。下面的模板展示了如何把这四部分组合起来。
你是一名物流运筹算法助手,负责把自然语言配送需求转换为VRP任务描述。请从以下输入中抽取车辆、客户、仓库、时间窗、载重、服务时长、互斥规则等信息。不要计算最短路径,只输出结构化JSON。
输入需求:
{{delivery_requirement}}
输出JSON格式:
{
"depot": {"id": "D1", "address": "..."},
"vehicles": [{"id": "V1", "capacity_kg": 800, "available_from": "08:00", "available_to": "18:00"}],
"customers": [{"id": "C1", "lat": 31.23, "lng": 121.47, "demand_kg": 120, "time_window": ["09:00", "11:00"], "service_minutes": 20}],
"hard_constraints": ["车辆载重不超过capacity_kg", "每个客户只能访问一次"],
"soft_constraints": ["尽量降低总行驶里程"]
}
角色定义让模型进入运筹工程语境,减少无关输出;任务边界明确不要计算最短路径,避免模型自由发挥;约束注入是核心,要把业务规则一条条列进去;输出格式用JSON结构约束字段,方便后续解析。还可以要求模型标记每一条约束的来源,如果输入里没有给出,则使用默认值,比如未提供卸货时长默认15分钟。
提示词中最好加入冲突检测:如果同一辆车既要求冷冻又要求常温,模型需要标记冲突并给出拆分建议。这样从需求阶段就减少返工。实战中可以维护一个提示词版本库,不同行业模板不同,例如医药配送关注温度记录,生鲜关注时效,家具配送关注搬运时长。随着业务场景增加,这些模块可以沉淀成提示词片段,按需拼接。
三、从自然语言需求到可执行路线:一个Python示例
把大模型返回的结构化数据接入求解器,才算走完整个链路。下面这段代码演示了如何调用大模型API,把自然语言需求转换成VRP的JSON结构,然后用最近邻启发式生成一条初始路线。实际项目中可以把最近邻替换成OR-Tools或其他求解器。
import json
import requests
def build_vrp_payload(requirement_text):
prompt = f"""你是一名物流运筹算法助手。请从以下需求中抽取VRP字段并返回JSON,不要计算路线。
需求:{requirement_text}
输出JSON必须包含depot、vehicles、customers三个键。"""
response = requests.post(
"https://api.ipipp.com/v1/chat/completions",
headers={"Authorization": "Bearer sk-xxx"},
json={"model": "llm-route", "messages": [{"role": "user", "content": prompt}]},
timeout=60
)
data = response.json()
content = data["choices"][0]["message"]["content"]
return json.loads(content)
def nearest_neighbor(vrp):
depot = vrp["depot"]
customers = vrp["customers"][:]
route = [depot["id"]]
current = depot
while customers:
next_customer = min(customers, key=lambda c: euclidean(current, c))
route.append(next_customer["id"])
customers.remove(next_customer)
current = next_customer
route.append(depot["id"])
return route
def euclidean(a, b):
return ((a.get("lat", 0) - b.get("lat", 0)) ** 2 + (a.get("lng", 0) - b.get("lng", 0)) ** 2) ** 0.5
if __name__ == "__main__":
requirement = "仓库在上海市嘉定区,两辆面包车,每辆载重600公斤。客户C1需要上午10点前送达,客户C2需要下午2点后,客户C3和C4普通货。"
vrp = build_vrp_payload(requirement)
print(json.dumps(vrp, ensure_ascii=False, indent=2))
print(nearest_neighbor(vrp))
这段代码的价值在于打通了从自然语言到结构化任务再到路线生成的闭环。大模型返回的JSON可能包含多余解释文字,可以用正则提取第一个左花括号到最后一个右花括号,或者要求模型只输出JSON,必要时用json.loads容错。示例中的最近邻算法是启发式,不是最优解,但能快速跑通流程。实际工程中应当把vehicles和customers映射成距离矩阵和需求数组,交给OR-Tools的routing库处理。
要特别注意,示例里的API地址是示意用途,真实调用时应替换为自己的模型服务地址。模型输出还可能存在字段缺失或类型错误,建议在解析后增加校验步骤,例如检查每个客户的demand_kg是否为正数,时间窗是否符合HH:MM格式。只有校验通过后才送入求解器,否则一个错误字段就可能导致整条路线不可用。
四、动态约束与反思式提示:从可行到可执行
静态路径往往不够,真实配送中司机会遇到临时改时间窗、车辆故障、道路拥堵。可以在第一版路线生成后,把结果和实际反馈一起回传给大模型,让它判断哪些约束被违反,并给出调整建议。例如提示词:以下是昨天的路线执行记录,客户C5反馈实际到达时间比时间窗晚了40分钟,请分析可能原因并给出新的约束建议,不要重新计算路线。模型可能输出服务时长被低估,或卸货点停车困难,需要把service_duration从20分钟调整到35分钟。这种反思式提示能沉淀经验。
还可以用多智能体Prompt,一个模型扮演路线审核员,另一个扮演调度员。审核员检查路线是否满足每一条硬约束,输出违规报告;调度员根据报告修改任务描述或约束权重。两轮之后往往比单轮更稳定。可以给审核员明确检查清单:是否漏点、是否超载、是否违反时间窗、是否同一客户被访问多次。让模型逐项返回通过或不通过,降低幻觉。
下面是一个审核员提示词模板,用于检查初始路线是否违规。
你是一名物流调度审核员。下面是一条初始路线和约束列表,请逐项检查是否存在违规: 约束列表: 1. 每辆车载重不超过600公斤 2. 时间窗必须满足 3. 每个客户只能访问一次 路线:V1: D1 -> C1 -> C2 -> D1 客户需求:C1 150公斤,C2 500公斤 请输出JSON数组,每项包含check、status、reason。
模型返回的违规报告可以直接驱动下一轮优化。例如发现V1载重650公斤超限,就把C2分配给另一辆车,或者把部分需求拆单。Prompt的反思机制比一次性生成更接近实际调度过程,也让业务人员对结果更有信心。工程上可以把这些审核规则写成自动化测试,每次路线生成后自动跑一遍,只有全部通过才发布给司机端。
大模型Prompt在物流路径优化中的最大价值,不是代替精确算法,而是让需求澄清、约束抽取、方案生成和结果校验形成可迭代的闭环。随着多轮对话和工具调用能力增强,模型还可以直接调用地图接口获取真实行驶时间,把动态路况写进下一轮约束里。把Prompt当作调度层来设计,物流优化系统会更容易维护,也更贴合真实业务。