前言
作为一个经常写 Flask 后端的 Python 开发者,我平时习惯用高德 API 做一些位置相关的工具。前段时间看到 Seed Evolving 模型做了第二次升级,主打 Coding 工程能力、Agent 检索能力和幻觉控制三个方向的提升。正好手头有高德开放平台的 API Key,就想试试:能不能让 Evolving 模型当"大脑",高德 API 当"眼睛",搭一个能真正用的城市旅行规划 Agent?
答案是:能,而且效果比我想象中好。
本篇是一个 Python 开发者的真实搭建记录:让 AI 帮你规划一场完美的城市旅行。
想做什么
简单说,就是用户输入一个城市名和旅行偏好,Agent 自动帮你:
- 规划每天的行程(上午、下午、晚上分别去哪)
- 从高德 API 拉取真实景点信息(地址、评分、电话)
- 查当天天气,给出穿衣和出行建议
- 生成一篇有温度的旅行指南文案
- 还能继续追问,比如"杭州有什么好吃的"
核心思路是验证 Seed Evolving 的三个升级点:
- Agent 能力:多步骤任务规划,调用外部工具,整合结果
- 检索能力:通过高德 API 搜索真实景点和美食
- 幻觉控制:基于真实 API 数据生成内容,不编造地址和评分
怎么搭的
技术栈
| 组件 | 选型 | 说明 |
|---|---|---|
| 模型 | Doubao-Seed-Evolving | 火山方舟平台调用 |
| 地图 API | 高德开放平台 | 地理编码、POI 搜索、天气查询 |
| 后端 | Flask + Python | 轻量 Web 框架 |
| 前端 | 原生 HTML/CSS/JS | 不依赖框架,一个文件搞定 |
接入 Seed Evolving
火山方舟的 API 完全兼容 OpenAI 格式,接入非常简单。先在控制台创建推理接入点,拿到 Endpoint ID,然后直接 HTTP 调用就行:
创建在线推理:
下一步开通授权模型,享受免费token,不错不错!
开通并授权。
代码如下:
importrequestsdefcall_evolving(messages):headers={"Content-Type":"application/json","Authorization":f"Bearer{ARK_API_KEY}",}payload={"model":"ep-20260805083044-t5r5c",# 你的 Endpoint ID"messages":messages,"temperature":0.7,"max_tokens":4096,}resp=requests.post("https://ark.cn-beijing.volces.com/api/v3/chat/completions",headers=headers,json=payload,timeout=120,)resp.raise_for_status()returnresp.json()["choices"][0]["message"]["content"]这里有个小细节:文档说可以直接用模型名doubao-seed-evolving调用,但我实际测试时发现需要先在控制台开通模型,创建推理接入点后用 Endpoint ID 调用才行。如果直接用模型名会返回 404 提示模型未开通。
Agent 三步走架构
整个 Agent 的核心是三步调用:
第一步:分析需求,生成行程框架
让 Evolving 根据城市名、天数、偏好生成 JSON 格式的行程规划。这里我用 system prompt 约束输出格式,要求它给出每天上午/下午/晚上的景点安排和美食推荐。
defagent_analyze_city(city,days,preferences):system_prompt="""你是一个专业的城市旅行规划助手。 根据用户提供的城市、旅行天数和偏好,生成详细的旅行规划框架。 输出 JSON 格式:包含每天的上下午晚行程、美食推荐、预算预估..."""user_msg=f"城市:{city}\n旅行天数:{days}天\n偏好:{preferences}"content=call_evolving([{"role":"system","content":system_prompt},{"role":"user","content":user_msg},])returnjson.loads(content)第二步:用高德 API 获取真实数据
这一步是整个 Agent 的关键——拿 Evolving 生成的景点名,去高德 POI 搜索接口查真实信息。这样做有两个好处:一是景点地址、电话都是真实的,不会被模型编造;二是高德返回的评分数据可以作为推荐参考。
defagent_enrich_with_real_data(city,plan_json):spots=[]fordayinplan_json.get("days",[]):forperiodin["morning","afternoon","evening"]:spot=day.get(period,{}).get("spot","")ifspot:spots.append(spot)enriched_spots={}forspot_nameinspots:poi_data=amap_search_poi(spot_name,city)pois=poi_data.get("pois",[])ifpois:poi=pois[0]enriched_spots[spot_name]={"name":poi.get("name",spot_name),"address":poi.get("address","暂无地址"),"tel":poi.get("tel","暂无电话"),"rating":poi.get("biz_ext",{}).get("rating","暂无评分"),}# 顺便查天气weather_data=amap_weather(city)returnenriched_spots,weather_info第三步:生成最终旅行指南
把前两步的结果——行程框架和真实景点数据——一起喂给 Evolving,让它生成一篇有温度的旅行文案。这一步最能体现模型的信息整合能力,它需要把行程安排、天气信息、真实景点地址融合成一篇流畅的文章。
defagent_generate_guide(city,plan_json,enriched_spots,weather_info,preferences):spots_summary="\n".join([f"-{info['name']}:{info['address']}(评分:{info.get('rating','暂无')})"forinfoinenriched_spots.values()])returncall_evolving([{"role":"system","content":"你是一个旅行文案创作者..."},{"role":"user","content":f"城市:{city}\n天气:{weather_info}\n..."},])高德 API 集成
高德的接口我用到了四个:
- 地理编码:城市名转坐标,验证城市是否有效
- POI 搜索:搜景点、搜美食,返回名称、地址、评分
- 天气查询:查城市当天天气,用于出行建议
- 景点/美食分类搜索:用高德的类型码筛选(景点 110000,美食 050000)
defamap_search_poi(keyword,city,types="",page=1):params={"key":AMAP_KEY,"keywords":keyword,"city":city,"citylimit":"true","offset":10,"page":page,"extensions":"all",}iftypes:params["types"]=types resp=requests.get(f"https://restapi.amap.com/v3/place/text",params=params)returnresp.json()前端界面
前端就是一个 HTML 文件,用渐变色做背景,卡片式布局展示结果。交互上做了三步动画提示,让用户知道 Agent 正在做什么:
- 第一步显示"分析旅行需求"
- 第二步显示"调用高德 API 检索真实数据"
- 第三步显示"生成个性化旅行指南"
还加了一个对话功能,规划完行程后可以继续追问关于这个城市的任何问题。
实际效果
运行效果如下:
输入目标城市,分析需求,智能Agent就检索数据,开始搜索并生成指南。
输入"杭州,2天,历史文化、美食",Agent 返回的结果让我挺惊喜的:
内容非常丰富,包括图文并茂,知识全面而且细腻:
天气感知:Evolving 注意到当天杭州中雨 26°C~36°C,主动给出了防滑、带伞、穿速干衣的建议。这不是模板话术,是真的看了天气数据后给的针对性建议。
行程合理性:Day 1 上午飞来峰+灵隐寺,下午岳王庙+孤山+西泠印社,晚上河坊街+南宋御街——这些景点在地理位置上确实是串联的,不是随机堆的。Day 2 去德寿宫遗址博物馆→胡雪岩故居→京杭大运河桥西街区,也是一条合理的路线。
真实数据校验:每个景点都从高德 API 拉到了真实地址。飞来峰的地址是"灵隐街道灵隐路法云弄1号",胡雪岩故居是"元宝街18号"——我查过,都是对的。没有出现编造地址的情况。
文案质量:生成的旅行指南标题是"两天一夜杭州旅行指南:雨中东晋南宋,一口杭帮烟火"——这个标题有调性,不像 AI 味的"杭州两日游攻略"。
对 Seed Evolving 的真实感受
用完之后说几点切身感受:
Agent 能力确实强。整个流程是三步串行调用,每步的输出作为下一步的输入。Evolving 在每一步都能稳定输出结构化 JSON,没有出现格式错乱。第二步用高德 API 拿到的真实数据喂给它,它能正确地把这些信息整合到最终文案里,没有丢失或混淆。
幻觉控制有明显改善。我特意测试了:如果高德 API 没返回某个景点的评分,Evolving 在文案里会写"暂无评分"而不是编一个分数。在景点地址上,它完全使用了高德返回的真实地址,没有自己编。这个在实际项目中非常重要——用户按 AI 给的地址去导航,结果地址是假的,这种体验是灾难性的。
长文本生成质量不错。最终生成的旅行指南有 800-1200 字,结构清晰,有开头引入、天气建议、每天行程详情、结尾总结。语言风格不是干巴巴的列表,而是有叙事感的旅行散文。
Token 效率。三步调用加起来消耗的 token 不算多,个人开发者 50 万免费额度够用很久了。
写在最后
这个项目原本只是想验证一下 Seed Evolving 的 Agent 能力,没想到做出来效果还不错,已经可以实际用了。整个开发过程大概花了半天时间,大部分时间在调试 prompt 和前端样式。
Seed Evolving 在这个项目里扮演的角色很清晰:它是 Agent 的大脑,负责理解需求、规划行程、整合信息、生成文案。高德 API 是眼睛和手,负责获取真实数据和验证。两者配合,做出一个既聪明又靠谱的旅行助手。
如果你也有类似的需求——需要让 AI 调用外部 API、整合多源数据、生成有质量的内容——可以参考这个方案试试。Seed Evolving 的 Agent 能力和幻觉控制,确实能撑住真实业务场景。