周边地点推荐
一句话需求 → 可核验的推荐:先定点,再搜周边,再取坐标,再查真实步行路线,最后按数据过滤、排序并作答。适用于通勤、约饭、散步、找咖啡馆等「附近有什么」的问题。
何时使用
输入包含城市、起点(坐标或可地理编码的地址)和自然语言需求时使用:
- 「我在杭州某地铁站,想找一家咖啡馆,步行不超过 15 分钟,最多 3 家,优先近一点的」
- 「公司楼下附近有能坐下来的餐厅吗,走路 10 分钟内」
- 「这个位置附近有公园吗,走过去要多久」
不适用:跨城行程、多站串联路线、驾车或公交主导的通勤规划、需要预订或支付的操作。各推荐都是从同一起点出发的独立备选,不拼成行程。
依赖高德 MCP Server 的 maps_around_search、maps_search_detail、maps_direction_walking(可选 maps_geo、maps_text_search、maps_distance)。配置方法见 references/amap-mcp-setup.md。
需求解析
| 要素 | 处理方式 |
| --- | --- |
| 起点 | 优先使用给定经纬度;只给地址或地标时用 maps_geo 转坐标;两者都没有就先问用户,不猜坐标 |
| 地点类型 | 转成高德 POI 关键词,如 咖啡馆→咖啡、餐厅→餐厅、公园→公园、地铁站→地铁站 |
| 步行时间上限 | 用户给了就照做;没给按 15 分钟,并在回答中说明这是默认值 |
| 推荐数量 | 用户给了就照做,最终不超过 3 个;没给按 3 个 |
| 偏好 | 「近一点」→按步行距离升序;「评分高」→仅当详情返回评分时才用;没提到的维度不要自行加码 |
工具与参数
| 工具 | 关键参数 | 用途与注意 |
| --- | --- | --- |
| maps_around_search | location「经度,纬度」、radius(米)、keywords | 周边搜索。返回 pois[] 只含 id/name/address/typecode,不含坐标 |
| maps_search_detail | id(上一步的 POI id) | 取 location「经度,纬度」;顺带返回 address、type、biz_ext(营业时间、评分等) |
| maps_direction_walking | origin、destination,均「经度,纬度」 | 步行路线。取 route.paths[0].distance(米)与 route.paths[0].duration(秒) |
| maps_geo | address、city | 地址或地标转坐标,取 geocodes[0].location |
| maps_text_search | keywords、city | 周边结果不足时按城市补充,同样不含坐标,仍需再查详情 |
| maps_distance | origins、destination、type=3 | 可选:批量预筛步行距离;耗时仍以 maps_direction_walking 为准 |
坐标一律「经度在前、纬度在后」,用英文逗号连接。中国境内经度 73–135、纬度 3–54;若第一个数明显小于第二个数(如 30.2,120.1),说明顺序反了,先交换再调用。
执行流程
- 定点:有坐标直接用;否则
maps_geo解析起点并取第一条结果的location。解析不到就停下问用户,不编造坐标。 - 估算半径:
radius ≈ 步行上限分钟 × 80米(15 分钟约 1200 米),不足 1000 取 1000,上限 5000。半径只是搜索范围,是否达标以步行路线为准。 - 周边搜索:
maps_around_search(location=起点, radius=..., keywords=品类词)。品类有歧义时按用户最明确的词搜一次,不连发多种关键词。 - 粗筛候选:按名称与
typecode核对品类,剔除明显不符的(便利店、加油站、同名景区等)与名称重复项,挑 5–8 个最接近的候选进入下一步,不要对整页结果逐个查路线。 - 取坐标:对每个候选调用
maps_search_detail(id),记录location、address与可用的biz_ext。 - 查步行路线:对每个候选调用
maps_direction_walking(origin=起点, destination=候选坐标),记录distance与duration。任何失败都按「失败与不足」处理,绝不用直线距离替代。 - 按时间过滤:
duration / 60分钟向上取整后与上限比较,超时的不作为「符合条件」的推荐。 - 排序取前 N:默认按步行时间升序、时间相同按距离升序;用户偏好优先;取前 3 个或用户指定数量。
- 作答:按下节格式输出,并在末尾说明筛选口径与未核实项。
回答格式
开头一句话回应需求(起点、品类、时间上限、数量)。推荐用表格呈现,最多 3 行:
| 名称 | 地址 | 步行距离 | 步行时间 | 推荐理由 | | --- | --- | --- | --- | --- | | 高德返回的名称 | 高德返回的地址 | 约 650 米 | 约 9 分钟 | 一句话,只引用可核验事实 |
- 距离:小于 1000 米写「约 XXX 米」,否则写「约 X.X 公里」,均由
distance换算。 - 时间:写「约 X 分钟」,由
duration换算;不要只写「很近」「几分钟」。 - 推荐理由只写有数据支撑的内容:品类相符、步行时长、所在商圈或路段、详情里的评分与营业时间(注明来自高德)。
- 安静程度、排队情况、口味好坏、是否适合拍照等无依据的判断一律不写,或标注「未核实」。
- 结尾一句说明口径,例如「以上按步行时间从小到大排序,均在 15 分钟步行范围内」。
示例
用户:「我在杭州市中心(坐标 120.1535,30.2875),帮我找步行 10 分钟内的咖啡店,最多 2 家。」
maps_around_search(location="120.1535,30.2875", radius="800", keywords="咖啡")
→ maps_search_detail(id="B0FFH...") # 取 location 坐标
→ maps_direction_walking(origin="120.1535,30.2875", destination="<详情返回的 location>")
作答(数值以工具实际返回为准):
从 120.1535,30.2875 出发,步行 10 分钟内找到 2 家咖啡店,按步行时间排序:
| 名称 | 地址 | 步行距离 | 步行时间 | 推荐理由 | | --- | --- | --- | --- | --- | | ××咖啡(××店) | ××路 12 号 | 约 430 米 | 约 6 分钟 | 品类为咖啡厅,步行 6 分钟可达 | | ××咖啡(××广场店) | ××街 88 号 | 约 720 米 | 约 10 分钟 | 位于××广场内,步行 10 分钟,接近上限 |
以上按步行时间从小到大排序;营业状态与排队情况未核实。
失败与不足
| 情况 | 处理 |
| --- | --- |
| 周边 0 个结果 | 说明搜索关键词与半径,建议放宽半径或换近义品类,可补搜一次 |
| 符合品类但都超过步行上限 | 如实说明有几家、最近一家约多少分钟;不把超时地点写成推荐,可建议放宽时间 |
| 达标地点少于要求数量 | 只推荐实际达标的,说明「范围内符合条件的仅 N 家」及原因(数量少、超出时间、品类不全) |
| 详情或路线调用报错(isError、status≠1、errcode≠0) | 说明是哪个工具、哪种失败;同一调用最多重试一次,仍失败就说明「未能核实」,不编造坐标或距离 |
| 路线失败但地点真实存在 | 可列出地点并注明「步行路线查询失败,距离与时间未核实」,不把估算写成确定值 |
| 起点无法解析 | 请用户补充更具体的地址或直接给坐标,并停止后续查询 |
约束
- 不编造地点、地址、坐标、距离、时间与营业信息;所有数值只能来自高德返回。
- 目的地必须是
maps_search_detail返回的location,不要把地点名称或地址当坐标传入。 - 不在回答中输出 API Key、原始请求 URL 或大段原始 JSON,只引用需要的字段。
- 工具调用保持精简:1 次周边搜索 + 至多 8 次详情 + 至多 8 次路线,必要时最多再扩一次半径重搜。
- 以当前运行时实际暴露的工具名为准;若某个工具不可用,改用具备同等能力的工具,并在回答中说明哪一步未能核实。
Scan to join WeChat group