旅游攻略生成器(交互式 5 阶段)
本 Skill 把"出攻略"做成有来有回的闭环,而不是一次性丢一份 PDF。核心节奏:
> 先摸清楚人,再挑景点,确认地图,最后出 PDF。
绝不跳过画像采集直接生成。景点是"推荐 + 避坑 + 理由"让用户拍板,不是你替他定。
何时触发
- 用户说:做一份 XX 旅游攻略 / 帮我规划 XX 行程 / 家庭游攻略 / 亲子游 / 避暑游 / 生成一个旅游地图和攻略
- 用户给目的地 + 天数,想系统化成稿
- 任何"把一次旅行变成可交付 PDF/地图"的意图
若用户只是问"XX 好玩吗""XX 几天够"这类单层问题,正常回答即可,不必进流程。
五阶段交互工作流
提问设计铁律(专业代理,不甩空白判断题)
用户是来听专业意见的,不是来当出题人。凡是涉及专业判断的提问(住哪个镇 / 选哪些景点 / 什么档位 / 是否加点名项),AI 必须先给「我的推荐 + 1 句理由 + 备选」,再让用户确认或微调:
- 用
AskUserQuestion时,把推荐项标(推荐)置顶为第一个选项;其余作备选。 - 选项描述里直接写清推荐理由(如「木鱼镇(推荐):配套最全、餐饮多、Day1 神农顶往返最顺」),不要只甩地名。
- 用户「猜」出来的选择,十有八九返工。宁可多写一句研判,少一轮打回。
- 纯事实类(具体出发日期、有无饮食禁忌)才适合空白提问。
阶段 1 | 摸画像(必须先做)
用 AskUserQuestion 或文字提问,覆盖画像卡字段(详见 references/trip_method.md 的「提问清单」)。最少要拿到:
- 目的地 + 大致日期 + 天数
- 同行人数与年龄结构(是否有老人/小孩/孕妇 → 决定强度与避坑)
- 预算档位(经济 / 舒适 / 豪华)
- 出行类别(风景观光 / 康养旅居 / 美食之旅 / 摄影之旅 / 随便走走)→ 直接影响阶段 2 推荐权重与阶段 3 路线编排
- 饮食偏好与禁忌(免辣 / 过敏 / 清真 / 素食等)
- 交通偏好(包车 / 公共交通 / 自驾 / 混合)
- 是否需要酒店及特色餐饮推荐(按预算档位推荐适宜档位)→ 决定 PDF 是否出「住宿推荐」「特色餐饮」板块
- 特殊约束(每日景点上限、午休、体力、必须去的"点名项")
- 到达 / 离开时段(关键!决定实际可游玩时长):问清「预计到达当地的大致时段(上午 / 下午 / 晚上)」与「预计离开当地的大致时段(上午 / 中午 / 下午 / 晚上)」。这决定 Day1 与最后一天是完整日还是半日,AI 排程与画像卡"实际可游玩"均依此推算,不要只问"天数"就按整日排。
> 第一轮用 AskUserQuestion 问 4 个最关键(目的地档期 / 人数年龄 / 预算 / 出行类别),第二轮补饮食交通偏好、酒店餐饮需求、到达/离开时段、约束与点名项。不要一次甩 10 个问题。
拿到画像后,先口头复述一遍画像卡,确认无误再进阶段 2。
阶段 2 | 推景点(避坑 + 推荐 + 理由)
这是本 Skill 的价值高地。做法:
- 用
WebSearch抓真实信息:搜「目的地 + 避坑 / 网红滤镜 / 真实值得去 / 小红书点评 / 预约」,以及各候选景点的门票、开放时间、是否需预约。 - 按
references/trip_method.md的「避坑方法论」与「景点研判框架」筛分:
- 避坑(网红滤镜景点):列出 3-5 个"名气大但体验差"的,每点给具体理由(排队时长 / 同质化 / 溢价 / 对老人小孩不友好)。
- 推荐(真实值得):按画像(有无老小、预算、天数)给 8-15 个候选,标注适配理由与当日体力负荷。
- 按出行类别(trip_type)调整推荐权重(阶段 1 已采,详见references/trip_method.md):
· 风景观光:自然奇观/地标优先,密度可高,重在"到此一证";
· 康养旅居:慢节奏、少赶路,温泉/绿道/公园/长住酒店优先,每日 ≤3 景点 + 午休;
· 美食之旅:餐饮权重最高,市场/夜市/老店/小吃街密集排,景点为辅;
· 摄影之旅:黄金时刻(日出日落、蓝调)、小众机位、避人流,标注最佳拍摄时段;
· 随便走走:不强求密度,随性留白,少预约多散步。
> 类别直接影响阶段 3 路线编排(如摄影之旅把最佳光线点排在清晨/黄昏)。 - 用
AskUserQuestion(multiSelect)让用户从推荐里勾选意向景点,推荐项标(推荐)置顶;并确认要剔除的避坑项。不要抛空白多选题让用户盲选。 - 用户点名的必去项无条件保留,只标体力风险与优化建议。
> 不许只给清单。每个景点必须带一句"为什么适合你 / 为什么劝退",这是和网上通用攻略的区别。
阶段 3 | 出带行程的地图(PNG/网页地图)
用户意向确定后:
- 你(AI)把结构化数据写成
trip_data.json(schema 见references/trip_method.md,重点填days[].places给地图用)。 - 地图分三层,脚本自动选最高可用模式:
- 优先真实地理图:若用户有腾讯地图 Key(或启用tencentmap-map-assistant临时 Key),渲染 JSAPI 网页地图 + 小程序专属地图二维码,可在 WorkBuddy 预览面板/手机直接看。
- 无 Key 降级为地理示意拓扑图:在trip_data.json里提供geo_layout(区域色块 + 各点相对坐标),脚本生成带方位感的水彩色块示意图(如某湖在西北、市区居中、某景区在东南),按天配色虚线连线。比纯色卡更像"地图"。
- 连geo_layout都没有:降级为原「纯色拓扑卡」。
> 无地图 Key 时直接出地理示意拓扑图即可,不必每次跟用户确认交付物性质;仅当用户主动提供腾讯地图 Key(或要求启用tencentmap-map-assistant真实图)时,才出真实地图底图。
运行:
python scripts/make_map.py trip_data.json 地图输出.png - 用
present_files把 PNG(或网页地图)抛给用户看。
阶段 4 | 确认地图
等用户确认地图"无修改"。若有调整(地点增减 / 顺序 / 编号),改 trip_data.json 重跑 make_map.py,直到用户说 OK。未确认前不出 PDF。
阶段 5 | 出 PDF 攻略(最终交付)
地图确认后:
- 运行(封面图若用户未给,脚本自动用渐变占位):
python scripts/build_guide.py trip_data.json
输出暖金风格 PDF,含 P0+P1 全板块。 - 用
pypdf校验页数/中文/图片(参考references/trip_method.md校验段)。 present_files交付 PDF。对外发布默认脱敏(见隐私约定)。- 景点实景图:确认意向后、出 PDF 前,用
WebSearch为入选spots各找 1 张公开实景图 URL(优先风景照、避开人物正脸,兼顾版权与隐私),写入spot.photo_url;build_guide.py自动下载并嵌入景点卡片(下载失败优雅降级为纯文字,不报错)。 - 出 PDF 前必做自检(详见
references/trip_method.md第九章「返工高频坑位与预防」):
- 每个入选spots的photo_url已下载目视确认主题正确,无错配(如食物图配成别菜、湖景配成花田);
-spots数与已配图数一致,build_guide.py无 "缺图/丢图" WARNING;
- 模板无硬编码人群词(行前/画像/适配文案全从 JSON 读,不残留"老人小孩""重庆"等旧目的地痕迹);
- 画像卡=表格样式、住宿餐饮合并一页、路线总览无重复色卡。
> 自检不过关不出 PDF,避免"出了再被打回"。
数据契约:trip_data.json
AI 与脚本之间的唯一接口。完整字段、类型、示例见 references/trip_method.md 的「JSON Schema 全解」。关键节点:
{
"meta": { "title":"", "dates":"", "days":5, "nights":4,
"arrive":"上午", "leave":"晚上", // 到达/离开时段:上午/下午/晚上、上午/中午/下午/晚上;推算实际可游玩时长
"people":"", "trip_type":"风景观光", // 出行类别,影响推荐权重与路线编排
"hotel":"", "tier":"舒适型",
"total_km":"", "prefs":"", "constraints":"",
"cover_image":"", // 封面图路径,空则用渐变占位
"hotel_on":false, "dining_on":false }, // 是否需要酒店/餐饮推荐
"days": [
{ "num":8, "date":"8/8", "week":"六", "theme":"", "color":"RED",
"trans":"", "km":"",
"places":["重庆北站","八一路","解放碑"], // ← 地图用,必填
"timeline":[["17:30","高铁抵达","包车","30分","含高铁"], …],
"food":[["店名","地址","人均","必点","适合"], …],
"tip":"" }
],
"hotels":[ ["名称","区位","价位/晚","适合/亮点","预订贴士"], … ], // hotel_on=true 时出「住宿推荐」
"dining":[ ["类别","推荐","价位/亮点","贴士"], … ], // dining_on=true 时出「特色餐饮」
"spots":[ {"title":"","key":"","intro":"","highlights":"","fit":"","info":"","tip":"","image":"","photo_url":""}, … ],
// photo_url: 公开实景图 URL,脚本自动下载嵌入
"food_index":[["品类","推荐","贴士"], …], // 可选
"transport":[ {"h":"一、高铁接站","lines":["…","…"]}, … ], // 可选
"before_leave":{ "weather":"","packing":"","avoid":["…"],"emergency":"" },
"budget_on": false, // 家庭内部隐私,对外默认关
"budget":{ "tiers":[[…]], "tips":"" } // budget_on=true 时出
}
color 取值:RED / GOLD / GREEN / RIVER / GREY / NAVY(暖金配色体系,脚本内映射)。
视觉与风格约定
- 暖金主色:深蓝
#16384F+ 江蓝#3E8EBA+ 朱红#E0552F+ 暖金#E0A93B+ 米底#F3ECDD。 - 字体:自动探测系统中文字体——Windows 微软雅黑 / macOS PingFang·STHeiti / Linux 文泉驿,均自动适配,无需手动配置;极端无中文字体环境降级为内置 CID 字体。
- 板块顺序:封面 → 出行画像卡 → 路线总览(含地图) → 每日(五列时间线+每日美食卡) → 必去景点深度卡片 → 美食索引 → 交通指南 → 行前必看 → 预算(可选)。
- 图片:景点卡优先用
WebSearch找到的公开实景图 URL(spots[].photo_url,脚本自动下载嵌入),找不到则降级纯文字或渐变占位;封面图由meta.cover_image提供,空则渐变占位。
隐私与脱敏(对外物料)
- 真实姓名(用化名,如"李鹏")、单位/职务、家庭住址、真实亲属关系、门牌号 → 默认脱敏,不等用户提醒。
- 配图优先 AI 生成 / 手绘示意图,不嵌真实家人照片或带具体地标实拍。
- 预算模块
budget_on默认false(家庭内部数据),内部版设true才出。
依赖与环境
- Python 3.10+,需安装三个第三方库(首次使用请先装):
bash pip install reportlab Pillow pypdf
> WorkBuddy 自带 managed Python;若用本机环境,在对应 venv 里pip install即可。 - 字体零配置:脚本自动探测系统中文字体(Windows 微软雅黑 / macOS PingFang·STHeiti / Linux 文泉驿),无需手动指定;仅极少见的无中文字体环境会降级为内置 CID 字体。
- PDF 与默认地理示意图均为本地生成,不依赖外部地图 Key。
- PDF 与默认地理示意图均为本地生成,不依赖外部地图 Key。
- 若要真实地理底图(腾讯地图 JSAPI 网页地图 + 小程序地图),需启用
tencentmap-map-assistant并配置 Key(临时或正式)。 - 地图能力优先级:真实地理图(需 Key) > 地理示意拓扑图(需
geo_layout) > 纯色拓扑卡(无需额外字段)。
文件清单
travel-guide-builder/
├── SKILL.md # 本文件
├── references/
│ └── trip_method.md # 提问清单/避坑方法论/研判框架/JSON Schema 全解/校验
├── scripts/
│ ├── build_guide.py # trip_data.json → 暖金 PDF
│ └── make_map.py # trip_data.json → 带行程拓扑地图 PNG
└── assets/ # 封面占位/字体等(可空,脚本自动占位)