用AI给一家五口排了趟北京,攻略就一张表
2026-09-24 · AI 项目实战 · 家庭出行规划 · 全文约 5300 字 · 阅读时间 13 分钟
出发前的那个晚上,我把五份攻略打印出来摊在餐桌上,我妈指着其中一张说:这个台阶,照片看着就腿疼。
那是我第三次给全家规划北京行程。第一次全靠搜,小红书、马蜂窝、公众号收藏文件夹各说各话;第二次我学乖了,让 AI 帮我“总结一份五天北京攻略”,它回了我一篇漂亮的小作文——漂亮,但没法用:没有一张票告诉我几点开售,没有一条路线标明老人中途哪里有地方坐。
第三次我换了打法:不让 AI 写攻略,让 AI 把旅行改成一个结构化问题。行程是一棵树,约束是一张表,抢票是一个日历。最后交付给家人的,就是一张纸、一张表——他们只负责在上面挑。
这篇把整套方法拆给你看:怎么收集约束、怎么让模型做决策、抢票日历怎么生成、备选方案为什么一次要出六套。所有票价和政策都写成了“怎么核对”而不是“是多少”,因为这类数字发布时一定变。

※ ※ ※
📋 第一步:把“一家人”翻译成一张约束表
模型再聪明,也不知道你妈的膝盖。家庭出行规划的第一产物不是行程,是一张约束表——把每个同行的自然人拆成一行,把每件事拆成一列:
这张表看着朴素,但它是后面一切的地基。三个经验:
一,约束必须分软硬。“日均两万步以内”是硬的,“想去环球影城”是软的。混在一起写,模型会在软需求上消耗你的硬预算。
二,票价档位单独成列。国内景区的票务体系基本按“全价 / 学生优惠 / 未成年人免票 / 老年人优待 / 身高免票”五档走,而且各档的核验介质不一样:有的看身份证,有的看学生证,有的只看身高。这一列直接决定第三步的“免票门槛核对”要不要做、怎么做。
三,这张表就是提示词的正文。后面所有对 AI 的指令,都从这张表生成,不另起炉灶。
※ ※ ※
🔍 第二步:先取数,再决策——让 AI 干检索的活,别让它干背书的活
大多数人用 AI 规划旅行的姿势错了:直接问“帮我排五天北京行程”。模型只能靠训练语料里过期的记忆硬编——票价是三年前的,预约规则是疫情前的,闭馆日是猜的。
正确姿势分两刀。第一刀:取数。把每个候选景点的“当前规则”当作调研题目扔给带联网检索的 agent,要求逐条给出官方出处。我的清单长这样:
对下列每个对象,检索并输出结构化事实卡(附官方链接与页面日期): - 故宫博物院:门票价格与淡旺季划分 / 预约提前天数与放票时间 / 周一闭馆规则 / 未满18周岁免票政策与是否仍需预约 / 60岁以上优惠档 / 午门进、哪个门出 / 14周岁以下需要成人陪同的比例要求 - 八达岭长城:门票价格 / 60岁以上免票与核验介质 / 1.2米以下儿童政策 / 缆车、索道、滑道三种代步工具各自的到楼位置 / 地面缆车的检修日 / 高铁车站到登城口的步行距离 - 中国国家博物馆:是否免费 / 预约提前天数 / 每日放票时刻 / 讲解服务档位 - 天坛公园:大门票与联票区别 / 回音壁在哪个院 / 无障碍通道情况 - 12306:当前预售期天数 / 起售时间点分布规则 输出 JSON,字段:name, ticket, booking_rule, free_tier, senior_tier, facility_notes, source_url, verified_date。查不到的字段填 null,禁止猜测。
最后一句“查不到的字段填 null,禁止猜测”是整个提示词里最值钱的一句。不加,模型会用看起来合理的数字填空;加了,至少你知道哪里是空的、需要人肉补。
第二刀:核对。AI 交上来的事实卡,逐条点开 source_url 看原文。这一步不能省——取数快是 AI 的功劳,核对严是人的责任。两个我实际撞到的坑:
- ▪ 故宫这类热门馆,官方页面上新旧公告并存,“提前 7 日”和“提前 1 日”两种说法在不同页面出现(前者是门票预售,后者是年票登记)。AI 检索时很容易抓错那条,只有你打开官方订票须知的原始页面才能分辨。
- ▪ 景区优惠政策有陷阱后缀:“免票”常常只免大门票,不含缆车索道;“夜游项目”可能与日场政策完全不通。这种条款藏在政策页的小字里,也是第三步重点核对的对象。
一句话:AI 负责把全网规则捞成一张表,你负责给这张表签字。
※ ※ ※
🚄 第三步:抢票日历——把“哪天几点该动手”算出来
北京行程的难点从来不是“玩什么”,是“约不约得上”。故宫旺季门票放票即罄,热门场馆要卡点抢。这些全是有确定时刻表的动作,最适合让 AI 一次算完。
关键输入就两个数:目标参观日期和各渠道的提前放票规则。第一步的事实卡里已经有了,剩下的纯粹是日期算术:
# ticket_calendar.py — 生成抢票/预约行动日历
# 注意:规则字段来自第二步核对后的事实卡,示例值为占位,以官方页面为准
from datetime import datetime, timedelta
RULES = {
"故宫博物院": {"lead_days": 7, "open_time": "20:00", "note": "参观前7日20:00放票,售完即止"},
"国家博物馆": {"lead_days": 7, "open_time": "17:00", "note": "免费预约,具体放票时刻以官方公告为准"},
"八达岭长城": {"lead_days": 0, "open_time": None, "note": "可当日线上购票,节假日建议提前约"},
"高铁往返票": {"lead_days": 15, "open_time": "按出发车站起售点", "note": "预售期与起售时刻以12306为准"},
}
itinerary = [
("2026-10-02", ["故宫博物院", "国家博物馆"]),
("2026-10-03", ["八达岭长城"]),
]
def build_calendar(itin, today=datetime(2026, 9, 24)):
actions = []
for day, spots in itin:
d = datetime.strptime(day, "%Y-%m-%d")
for s in spots:
r = RULES[s]
fire = d - timedelta(days=r["lead_days"])
if r["open_time"]:
actions.append(f"{fire:%m-%d} {r['open_time']} 抢 {day} 的「{s}」 ← {r['note']}")
else:
actions.append(f"{fire:%m-%d} 前 确认 {day} 的「{s}」 ← {r['note']}")
return sorted(actions)
for a in build_calendar(itinerary):
print(a)
跑出来的东西长这样(节选):
09-25 17:00 抢 10-02 的「国家博物馆」 ← 免费预约,具体放票时刻以官方公告为准 09-25 20:00 抢 10-02 的「故宫博物院」 ← 参观前7日20:00放票,售完即止 09-26 按出发车站起售点 抢 10-03 的「高铁往返票」 ← 预售期与起售时刻以12306为准
拿到日历后做两件事:每条动作设成手机提醒(放票时刻前 5 分钟),给每个“售完即止”的项目预设 Plan B——抢不到故宫是挪日程还是换景山?这个判断留给第四步让 AI 做,但答案要提前存在表里,抢票当晚没有思考时间。
※ ※ ※
🧩 第四步:路线不是搜出来的,是在约束下“解”出来的
现在轮到决策。给带检索能力的 agent 下这道题时,我把提示词写成约束满足而不是推荐:
基于 facts.json(已人工核对的事实卡)和 constraints.md(五人约束表), 为 D1-D5 生成可行程方案。硬性规则,违反即废: 1. 任一日内单成员累计台阶层数 ≤ 老人的 200 级折返线,超过必须给出 代步工具方案并注明该工具到达第几楼; 2. 周一不排故宫/国博(闭馆类场馆),排了直接判废; 3. 每天 13:00-14:00 必须是无交通移动的空档(孩子午睡缓冲); 4. 每日步行量按地图 API 实测距离输出,不许估算; 5. 输出 3 套整体方案(省力优先 / 效率优先 / 天气备选), 每套附「本日放弃项」清单; 6. 所有涉及票种的字段落尾标注核验介质(身份证/学生证/免核验)。
为什么是“三套整体方案”而不是“每天挑最优”?因为家庭行程的失败模式不是某天不够好玩,而是一个环节崩了全盘乱——下雨、老人体力透支、孩子闹觉,都是连锁反应。三套方案各有一个清晰的取舍逻辑,出问题时整段切换,不用当天临时拼凑。
顺带一个反直觉的发现:把规则写成可判废的硬约束后,模型的输出质量跳了一个台阶。之前问“帮我规划适合带老人小孩的行程”,它回的是形容词(“节奏舒缓”“寓教于乐”);现在回的是“本日放弃项清单”——因为它知道违反约束会被逐条对账。
※ ※ ※
🏔 第五步:长城为什么一次要六套备选
带腿脚不便的老人上长城,是全行程约束最紧的一题:台阶多、距离远、交通方式互相排斥、旺季人流不可控。单方案必翻车,所以我的做法是把备选树让 AI 一次列全,人只做删减。
第一维:选哪个长城。八达岭配套最全但人最多;慕田峪有索道、人相对少、坡道比八达岭北线缓;司马台+水镇能玩两天但车程最远;黄花镇、八达岭古长城(水关长城)是未过度开发的段位,缆车少要靠腿。筛法就一句话:老人腿脚 → 优先有索道/缆车直达敌楼的段落;孩子要“好汉感” → 优先有碑刻打卡点的段落;自驾纯电 → 查每个停车场有没有桩、回程 80km 高速在冬天打几折续航。
第二维:到了怎么上去。以八达岭为例,三种代步工具落点不同——有的直接到北八楼,有的到中段还得自己爬;而且有的有检修日、有的排队时长随人流波动。政策页上“老人免票不含缆车”这种小字(第二步挖出来的)也要在这里兑现成钱。

两维交叉,让模型生成六套组合,每套带一行“这套赌的是什么”:
注意最后一列。每套备选必须写“崩了退到哪”,这是给抢票当晚和出发早上的自己留的活路。这六套方案没有一套是我自己想全的——我只提了目的地和体力两个维度,交通工具的落点差异、检修日、滑道对老人的不友好,都是从第二步的事实卡里长出来的。这就是先取数后决策的红利。
※ ※ ※
💰 第六步:预算口径——只算高速/过路费那一行
最后是所有攻略帖最爱吵的一件事:钱。我的口径先说死,免得被抬杠:
家庭自驾纯电,预算表只算高速和过路费,不算充电费和油费对比(家充桩用户没有比价意义,出行前充满即可;北京景区充电桩密度,出发前用地图 App 按停车场逐个确认可用状态,比算每公里差几分钱重要得多)。这条口径写进约束表,AI 生成的预算表就自动干净了。
真正要 AI 算清楚的反而不是油电,是节假日免费通行的边界。7 座及以下小客车在四个法定假期免收高速通行费,但判定标准是“驶离出口的时刻”——免费窗口第一天 0 时前下高速照收,最后一天 24 时前必须下完。这条规则值得让模型算一遍你的实际进出点:
# 收费站判定:以「驶离出口时间」为准,规则以交通运输部实施方案为准
free_windows = [("10-01 00:00", "10-08 24:00")] # 国庆假期,年份不同窗口不同,以当年公告为准
exits = [("10-01 06:30", "进京检查站后第一个出口"),
("10-06 21:40", "返程下道口"),
("10-07 23:20", "备用返程窗口")]
for t, where in exits:
print(f"{t} 驶离 {where} → 免费窗口内,缴费 0 元")
顺带把票价档位表也兑现了:一家五口按约束表的档位走,免票档的孩子只需预约凭证不需钱、老人优待档需要带的是什么证件,全部落到“当天口袋里要有什么”这个颗粒度。规划的最后一步不是表,是清单:谁的手机里要装哪个官方 App、哪张证件在哪个包里,AI 生成,人过一遍。
※ ※ ※
🧭 这套方法真正省下的不是时间
五步走完,交付给家人的那张纸长这样:一页行程树、一张抢票日历(带手机提醒)、六套长城备选(每套带退路)、一张“证件装包清单”。我妈没再问“这个台阶看着就腿疼”,因为每一天的纸上那行小字写着:中途有 3 个能坐的地方。
回头看,AI 在这套流程里干的都不是“帮我想要去哪玩”,是三件脏活:把散在几十个网页里的规则捞成一张可核对的表、把日期算术做成日历、把交叉组合枚举成人想不全的备选树。而“老人膝盖行不行”“孩子会不会闹”这些判断,机器从头到尾没资格碰——它只是把我写下来的约束执行得比人勤。
旅行攻略的本质是决策支持,不是信息堆砌。AI 时代前者终于有人干了,后者我们已经被淹了好多年。
你家出游的约束表里,最难写进去的那条约束是什么?评论区聊聊。觉得这套方法有用,点个“在看”,转给那个还在手抄攻略的朋友。
下一篇预告:3 万条买家评论扒出 12 个真需求——评论区才是免费的市调公司,从抓取、清洗到需求聚类的完整链路,附可复用的提示词模板。
※ ※ ※
📚 资料来源
- ▪ 故宫博物院官网订票须知与门票政策页(预约提前天数、淡旺季票价、未成年人免票、老人半价、午门进神武门出、爽约规则),2026-09 检索核对;票价与规则以出行时官方页面为准
- ▪ 八达岭长城景区公开票务信息(60 岁以上凭身份证优待、缆车索道滑道差异、免票不含代步工具),2026-09 检索核对
- ▪ 交通运输部《重大节假日免收小型客车通行费实施方案》及官方解读(免费窗口以驶离出口时间为准)
- ▪ 铁路 12306 公开信息(预售期、起售时刻规则)
- ▪ 文中代码为本机可运行示例,票价与放票时刻字段均为占位,接入真实规则后需逐条替换核对
- ▪ 本文涉及的家庭成员为作者自家情况,景点政策适用于一般家庭出行参考,不含任何商业推广
评论 (0)
登录 或 注册 后参与讨论。