校园导航 POI 功能化标注 (Campus Navigation POI Functional Annotation)
校园导航 Agent(Location-based AI Agent) 的 POI 数据层设计方法论。项目位于 D:\1\CS&AI\05-School-Projects\校园导航\AI 校园导航 MCP 版,目标是把百度地图 POI + 人工标注落成 LLM Agent 可用的结构化数据。
核心教训:散文 description 对 LLM 是噪音
初版给每栋楼生成"位于 X,距校园中心约 N 米"的散文描述,喂给模型后几乎无增益:
- 位置模型本来就有坐标字段,散文重复坐标无信息量
- 模型拿不到答案时会编造(旧版答警务亭职能时凭空列出 6 项服务;答取件码 200 时随便指定一个驿站)
- 导航真正需要的是"这个 POI 能干什么 + 怎么辨别你要找的那个",而不是"在哪"
标注 Schema
每个 POI 增加结构化字段(取代散文 description):
{
"uid": "20a830fdbd6e101a72455be8",
"name": "宿舍楼27号(文轩楼)",
"category": "宿舍楼",
"building_no": "27#",
"aliases": ["27号楼", "27号宿舍楼", "文轩楼", "宿舍27栋"],
"func_note": "学生宿舍楼(文轩楼/27号楼)。",
"same_as": "" // 被合并实体的目标 uid(移入 merged 数组)
}| 字段 | 用途 |
|---|---|
building_no | 校内楼号,供房号解析 |
aliases | 俗称→官方名映射,模糊检索用 |
func_note | 能干什么/怎么辨别,人工标注 |
same_as + merged 数组 | 百度 POI 重复条目合并,被合并者移出校园列表但保留数据 |
房号规则(喂给模型,写进 prompts.py)
<楼号>#<房间号> = <楼号>楼 <房间号> 房间
- 27#201 = 27号宿舍楼(文轩楼)201 房间
- 1#1103 = 一号教学楼 1103 房间
- 53-1#205 = 53号楼A栋 205 房间用户说"27号楼"直接命中该楼;给 27#201 则解析出楼栋+房间号。楼号复用(如 12# 既有教学楼又有宿舍)时靠分类+语境,拿不准用 ask_user。
数据流(Agent 接入链路)
campus_dataset_annotated.json (标注数据源,人工+脚本生成)
└─ poi_data.py (加载真实数据,接口签名保持兼容)
├─ list_categories() → 10 个真实分类
├─ list_pois(cat) → 渐进式披露(id/name/楼号/别名)
├─ get_poi(uid) → 完整信息(含 func_note)
└─ search_pois(kws) → name+aliases+building_no+func_note 多词"或"检索
└─ tools.py (7 个 MCP 风格工具,schema 描述同步)
└─ agent_core.py (DeepSeek function calling 循环)接入要点:
- poi_data.py 接口签名保持不变(tools.py 依赖
list_categories/list_pois/get_poi/search_pois/CAMPUS_CENTER),只换数据源 - 前端是通用渲染(用 category_id/name 动态展示),数据接入后前端零改动;导航卡坐标靠
show_poi_navigation_options后端补全 - search_poi 检索范围扩展到 aliases——"文献信息中心"能命中"浙江万里学院-图书馆"
楼号冲突处理规则
百度 POI 数据库会重复/错标楼号,人工裁决规则:
- 通用规则:名字含 寝室楼/学生宿舍/学生公寓/宿舍楼/宿舍/公寓 → 宿舍楼;裸"X号楼" → 教学楼
- #53:教学楼 AB 栋 →
53-1#/53-2#(坐标可能后续人工重标 BD09) - #12:教学楼 12 + 宿舍 12 是两栋,都保留
- #27:两条重复 → 选带文轩楼的,主坐标取文轩楼
- 空中走廊不是楼 → 单独"校内楼栋/连廊"类
人工标注的价值(导航的真正作用)
人工写 func_note 解决模型猜不出来的事。最有价值的是菜鸟驿站取件码分派规则:
取件码分派:
1-100 开头 → 二楼新菜鸟驿站(顺丰标识店)
100+ 开头 → 古茗奶茶店旁
400+ 大件 → 古茗奶茶店旁(露天)
200+ 开头 → 一楼中国移动旁菜鸟驿站Agent 端到端验证:问"取件码200开头去哪取" → 模型命中驿站并精确回答"一楼中国移动旁"。这在旧版会编造。
楼号权威清单(用户老地图,2026-08-12)
老师提供的老地图楼号映射为权威依据,存放于项目 kb_grill/authoritative_buildings.py:
1#教学楼 | 2#空中花园 | 3#教学楼 | 4#大数据+智能学院 | 5#大数据实验楼
6#生环实验室 | 7#法学院 | 8#继续教育学院 | 9#外语学院 | 10#智能实验楼
11#学术报告厅 | 36#行政楼 | 37#体育馆 | 38#文献信息中心/图书馆报告厅
51#C重描中心/创业园 | 51#A中德学院(国际学院) | 52#A设艺建 | 52#B文传
53#教学楼 | 62#商学院+物流 | 63#水上图书馆 | 64#生环决策记录:
- 楼号归属以用户老地图为权威,不盲信知识库。8#=继续教育学院、9#=外语学院(AI 百事通知识库给出的是相反的,经交叉验证知识库文档用"博雅楼(15)"式中文命名,无"8号楼"字样,房间号 8103/9103 是模型推断;老地图实地标注更可信)
- 待补坐标楼:
1# 6# 7# 10# 37# 38# 51#C 51#A 52#A 52#B 53#(百度/APP POI 均无,见kb_grill/placeholder_buildings.json) - 纯房间号对导航无信息量,剔除 room 字段,offices 只保留
department / office(学工办·教务办·院务办) / telephone
服务点职能从学校 AI 知识库获取
警务亭/思政驿站等职能可用学校 AI 接口(D:\1\CS&AI\05-School-Projects\aihw-conversation-api,POST /api/AIAgent/conversation/streaming,knowledge:true)查询。知识库没直接收录时不照单全收模型补充的常识——只采信知识库明确给出的(如保卫处电话),其余保留低风险项或标待确认。
部门办公室挖掘(AI 百事通 grilling)
用 grill_kb_departments.py(knowledge:true 多轮提问)从学校 AI 知识库挖出"部门→楼→办公室→电话":
- 5 轮共 7423 字,结果存
kb_grill/kb_dept_probe.json - 二级学院楼号归属:62#商学院+物流+华美、4#大数据+信息智能、8#继教、9#外语、52#文传+设艺建、64#生环、51A#中德+国际
- 行政楼(36#)含校办/人事/财务/科研/研究生院等 13 部门;小白楼=建设部+保卫处;一站式大厅=学工部+团委
- 交叉验证教训:对话式 RAG 回答偶有格式错位/楼号推断,需用多轮关键词组合检索(
kb_grill/kb_89_verify.json)验证楼号映射,最终以老地图为权威
踩坑记录 (Pitfalls)
- starlette/fastapi 版本冲突:fastapi 0.115.6 需要
starlette<0.42,装到 1.6.0 会Router.__init__() got an unexpected keyword argument 'on_startup'。修复:pip install starlette==0.41.3(经 7890/7897 代理)。sse-starlette 有依赖冲突但当前代码自定义 SSE 生成器,不阻塞 - DeepSeek 402 Insufficient Balance:余额不足时 agent 工具循环跑不了,需先充值
- 编辑工具把直引号转全角引号:改 Python 代码后要
python -c "import ast; ast.parse(open(f).read())"检查语法
钱湖校区楼栋知识库交叉核实(grilling 还原原文)
用户要求 AI 百事通 grilling 必须逐字还原知识库原文(不概括、不加表格/表情),并标注钱湖/回龙校区;冲突时采信时间更近的文档。已交叉核实结果存项目 kb_grill/grill_findings.json:
| 楼号 | 确认结果 | 关键证据 |
|---|---|---|
| 36# | 行政楼(钱湖,东门、3号楼对面,紧邻中心广场) | "钱湖校区36号楼行政楼121办公室10号窗口"(毕业离校财务提示) |
| 63# | 原水上图书馆→现为档案馆(1楼101室),兼学生公寓"水意楼" | 《关于图书馆(档案馆)2026年暑期工作安排的通知》2026-07-06 |
| 2# | 空中花园(1/3号楼之间,螺旋式连廊) | 校园地点介绍 |
| 5# | 大数据实验楼(4号楼后侧) | 校园地点介绍 |
| 11# | 学术报告厅(空中花园后方,6/10号楼之间,3号楼南侧) | 校园地点介绍 |
方法论沉淀:
- 百度 POI 分类系统性错误:大量宿舍楼被百度标成"教学楼"。知识库权威教学楼编号仅
1/3/4/5/6/7/8/9/10/51A/52A/52B/53/62/64;15/17/18/13/23/25/21/22/24/28/39/40/43/54/61/12实为宿舍楼 - 51-71# 是复合楼宇(兼教学+公寓),desc 需并列多用途
- 知识库用中文楼名("行政楼""学术报告厅"),不用编号——"2号楼""11号楼"编号查不到,要用名称检索
- 同一楼可有多重身份(63#=档案馆+水意楼宿舍;51#=中德教学楼+教务招办),description 需并列多用途
- 钱湖图书馆(文献信息中心)实际在1号楼附近(万里大道北侧,靠近景观湖),开放 7:30-22:00;38# 是否=中心馆待核实
- 书库在碳中和研究院B幢(里家宾馆东边,小白楼南侧)
内网依赖 EasyConnect,断线会—— 2026-09-15 更正:该接口公网直达,不需要 EasyConnect。getaddrinfo failed,非 token 问题aihw.zwu.edu.cn有公网 A 记录61.153.150.54,任意网络持 token 均可调用。当时那次getaddrinfo failed是校园 DNS(10.131.64.132)临时解析失败(数分钟,自行恢复),与服务可达性、token 均无关。排查顺序应为先Resolve-DnsName,再怀疑接口 / token / 网络。详见 内网服务连不上先查 DNS (Check DNS First When an Intranet Service Drops)
2026-08-12 楼栋确认全表(grilling 还原原文,28 栋)
| 楼号 | 楼名/确认用途 | 分类修正 |
|---|---|---|
| 3# | 3号教学楼(万里大道北侧,1号楼旁,行政楼对面) | 教学楼 |
| 5# | 大数据实验楼(4号楼后侧) | 教学楼 |
| 51# | 中德学院教学楼(中心广场西侧素拓旁;51B=教务/招办) | 教学楼 |
| 36# | 行政楼(东门、3号楼对面;计划财务处121室) | 教学楼→行政办公 |
| 63# | 档案馆(原水上图书馆,1楼101室;兼水意楼宿舍) | 教学楼→行政办公 |
| 2# | 空中花园(1/3号楼之间,螺旋连廊) | 教学楼→校内楼栋 |
| 11# | 学术报告厅(空中花园后方,6/10之间) | 教学楼→校内楼栋 |
| 15# | 博雅楼(女生宿舍) | 教学楼→宿舍楼 |
| 18# | 毓秀楼(女生宿舍) | 教学楼→宿舍楼 |
| 17# | 寄畅楼(女生宿舍) | 教学楼→宿舍楼 |
| 13# | 女生宿舍(钱湖餐厅东侧) | 教学楼→宿舍楼 |
| 21/22/23/24/25# | 宿舍群(文溯楼22#,万家钱湖餐厅东侧/食万里对面) | 教学楼→宿舍楼 |
| 28# | 宿舍(26-28#群,食万里右侧) | 教学楼→宿舍楼 |
| 39# | 明德楼(39-41#群,食万里左侧) | 教学楼→宿舍楼 |
| 40# | 宿舍(39-41#群) | 教学楼→宿舍楼 |
| 43# | 怡然楼(42-44#群,商业广场附近) | 教学楼→宿舍楼 |
| 54# | 崇智楼(公寓,商业广场附近) | 教学楼→宿舍楼 |
| 61# | 碧阳楼(公寓,商业广场附近,含共享厨房) | 教学楼→宿舍楼 |
| 12# | 思齐楼(研究生公寓,云天万里/18号旁) | 教学楼→宿舍楼 |
| 14# | 静雅楼(女生宿舍,钱湖餐厅东侧) | 宿舍楼(确认楼名) |
| 52# | 52A设艺建/52B文传(复合:兼公寓) | 教学楼(补复合) |
| 53# | 崇礼楼(教学+公寓复合) | 教学楼(补别名) |
| 62# | 霖岚楼(商学院/物流/跨境电商/华美5F,素拓旁;兼公寓) | 教学楼(补复合) |
| 里家公寓 | 里家留学生公寓(里家宾馆,钱湖南路8号,前台0574-82829088,可预订) | 宿舍楼(确认) |
| 教师公寓/50# | 知识库未收录,desc 待定 | 保留 |
全部证据存项目 kb_grill/grill_findings.json,落库脚本 build_apply_grill.py(findings 的 uid/bno/name 三级匹配)。
长期 grill:校园服务/校门/食堂(2026-08-12)
已新增 POI(无坐标占位,desc_source=grill):万家钱湖(一食堂)/万家万里(三食堂)/钱湖教工/万家味道/里家餐厅 5 家食堂(带营业时间),医务室(体艺中心一楼)、体育公园(西校门、篮球/网球/足球/跑道)、健身房(体艺东侧,周一至五17-21、周末15-21,限50人出一进一)。
校门功能性描述(更新百度散文 desc):
- 东校门(主校门):东南角,正对钱湖南路8号;地铁5号线钱湖南路站C口直达,23条公交
- 西校门:西南侧,近体育公园和万家钱湖餐厅;南门:南侧,通商业广场/万里驾校
- 体育公园在西校门、钱湖餐厅旁;体艺中心紧邻素拓中心正对樱花大道,东侧体教中心+健身房
规则/流程类信息(grill 并入 POI desc):
- 图书馆(38#):借阅 30本/90天/无限续借/取消超期费;借还书一楼服务台+自助机;座位预约需签到(未签到 7天3次拉黑7天);开放 7:30-22:00;服务电话 88222051/88222044/88222050
- 一站式大厅:补卡 9号窗口人工(工本费13元)+自助;失物招领
- 办事流程:成绩单/在读证明自助打印在 51号楼A座一楼东首;补卡在一站式或58号楼商业广场自助机;报修走"万里小勤勤"
- 校园交通:车辆通行手续 36#行政楼115/117;电动车限制新增、新生禁止(2026-07);无校车信息
裁决记录:
- 38# = 图书馆(用户权威):文献信息中心是图书馆办公区,同一栋楼。图书馆 POI 已挂
building_no=38#,别名含 38号楼/文献信息中心/图书馆报告厅,desc 含开放时间(周一至周日 7:30-22:00,7:30-8:00 暂不借还书)。知识库"图书馆在1号楼附近"表述不同,以用户为准 - 行政楼部门:知识库仅可采信计划财务处(121室10号窗口),其余12部门无房间号原文(之前"13部门"是模型概括)
相关
本文归档于个人知识库 · 领域:CS & AI · 模块:04 Project_CS_AI/AI apps