211 lines
6.4 KiB
Markdown
211 lines
6.4 KiB
Markdown
# 客服图谱快速查询实现说明
|
||
|
||
更新时间:2026-06-03
|
||
|
||
## 1. 目的
|
||
|
||
当前客服页 `http://localhost:8102/admin/plaza/user` 的原型目标不是生成完整复杂行程,而是让客服在对话中快速查到三类高频信息:
|
||
|
||
1. 固定线路有哪些。
|
||
2. 某个景区附近有哪些可选酒店、餐饮。
|
||
3. 某个景区有哪些门票、小交通、保险、二消、必付/可选费用。
|
||
|
||
因此这次没有把所有问题都交给 LLM 慢慢生成,而是先做“轻量 Agent 分流 + 图谱直查”的快速查询能力。
|
||
|
||
## 2. 当前采用的方法
|
||
|
||
### 方法一:高频问题先走规则意图识别
|
||
|
||
对客服常见问题先做规则判断:
|
||
|
||
- `路线有哪些 / 线路有哪些 / 产品有哪些`
|
||
- `黄果树附近有哪些酒店餐饮`
|
||
- `小七孔有哪些必付和可选费用`
|
||
- `酒店房型 / 旺季 / 淡季 / 房价`
|
||
- `加人 / 车型 / 用车`
|
||
|
||
命中这些问题后,直接进入专用图谱查询函数,不进入复杂推荐排序,也不等待 LLM。
|
||
|
||
代码位置:
|
||
|
||
- `app/api/travel_assistant.py:1944`
|
||
- `app/api/travel_assistant.py:3082`
|
||
|
||
### 方法二:线路清单使用轻量图谱查询
|
||
|
||
以前“有哪些线路”会加载完整图谱,包括酒店、餐饮、费用、车辆等关系,导致慢且容易只返回一个推荐方案。
|
||
|
||
现在改成只查询:
|
||
|
||
```text
|
||
TourProduct -> ProductDay -> RouteStop -> ScenicAttraction/SubAttraction
|
||
```
|
||
|
||
不查酒店、餐饮、费用细节。
|
||
|
||
这样“有哪些线路”只返回线路清单,默认最多显示 30 条。
|
||
|
||
代码位置:
|
||
|
||
- `app/api/travel_assistant.py:1679`
|
||
- `app/api/travel_assistant.py:2975`
|
||
|
||
### 方法三:景区附近资源使用 NEARBY 关系直查
|
||
|
||
酒店和餐饮已经拆成独立 POI 实体:
|
||
|
||
```text
|
||
ScenicAttraction -> ATTRACTION_NEARBY_RESOURCE -> Hotel
|
||
ScenicAttraction -> ATTRACTION_NEARBY_RESOURCE -> Restaurant
|
||
```
|
||
|
||
客服问“黄果树附近有哪些酒店餐饮”时,直接从景区节点查附近资源,不再绕到线路产品里查。
|
||
|
||
代码位置:
|
||
|
||
- `app/api/travel_assistant.py:2013`
|
||
|
||
### 方法四:费用资源兼容两条查询路径
|
||
|
||
费用、小交通、保险、二消可能来自两类关系:
|
||
|
||
```text
|
||
RouteStop -> STOP_USES_DEFAULT_RESOURCE -> TravelItem
|
||
ScenicAttraction -> ATTRACTION_HAS_ITEM -> TravelItem
|
||
```
|
||
|
||
因此费用查询同时查这两条路径。
|
||
|
||
如果关系里已有 `MANDATORY / OPTIONAL / INCLUDED`,就直接使用。
|
||
|
||
如果没有明确状态,就按证据文本轻量推断:
|
||
|
||
- 出现“必须、必付、需自理、不含、另付” -> `MANDATORY`
|
||
- 出现“自愿、可选、不必须、客人自愿” -> `OPTIONAL`
|
||
- 出现“已含、包含、赠送” -> `INCLUDED`
|
||
|
||
代码位置:
|
||
|
||
- `app/api/travel_assistant.py:2196`
|
||
|
||
### 方法五:推荐问题才走完整图谱排序
|
||
|
||
如果用户问的是复杂需求,例如:
|
||
|
||
```text
|
||
5个人,想玩5天,想去黄果树、小七孔、西江,预算低,帮我推荐线路
|
||
```
|
||
|
||
这时才加载完整固定线路图谱,做路线匹配、车辆建议、每日行程、费用提示。
|
||
|
||
完整图谱加载包含:
|
||
|
||
```text
|
||
TourProduct
|
||
ProductDay
|
||
RouteStop
|
||
TravelItem
|
||
Hotel
|
||
Restaurant
|
||
Vehicle
|
||
Fee
|
||
NEARBY
|
||
```
|
||
|
||
代码位置:
|
||
|
||
- `app/api/travel_assistant.py:1536`
|
||
- `app/api/travel_assistant.py:3082`
|
||
|
||
## 3. 当前已经验证的效果
|
||
|
||
本地直接调用后端函数验证:
|
||
|
||
| 测试问题 | 返回结果 | 响应时间 |
|
||
|---|---:|---:|
|
||
| `游路线有哪些` | 30 条线路,图谱候选 39 条 | 约 0.12 秒 |
|
||
| `黄果树附近有哪些酒店餐饮` | 8 个酒店、10 个餐饮 | 约 0.07 秒 |
|
||
| `小七孔有哪些必付和可选费用` | 90 条费用候选 | 约 0.09 秒 |
|
||
|
||
说明:这是后端图谱查询耗时,不包含浏览器渲染和网络开销。
|
||
|
||
## 4. 前端展示调整
|
||
|
||
客服页按不同结果类型做轻量展示:
|
||
|
||
- `route_catalog`:线路清单模式,只显示线路编号、名称、天数、路线概览。
|
||
- `nearby_resource`:附近资源模式,只显示酒店候选、餐饮候选、使用说明。
|
||
- 普通推荐:保留原来的行程方案卡片。
|
||
|
||
同时左侧增加常用问法:
|
||
|
||
- 有哪些线路
|
||
- 5天路线有哪些
|
||
- 黄果树附近有哪些酒店餐饮
|
||
- 小七孔有哪些必付和可选费用
|
||
|
||
代码位置:
|
||
|
||
- `admin-web/src/panels/plaza/TravelAgencyAssistantPanel.tsx:131`
|
||
- `admin-web/src/panels/plaza/TravelAgencyAssistantPanel.tsx:156`
|
||
- `admin-web/src/panels/plaza/TravelAgencyAssistantPanel.tsx:182`
|
||
- `admin-web/src/panels/plaza/TravelAgencyAssistantPanel.tsx:218`
|
||
|
||
## 5. 是否满足当前原型需求
|
||
|
||
当前已经满足原型阶段的核心需求:
|
||
|
||
1. 客服可以快速查询已有固定线路。
|
||
2. 客服可以按景区查附近酒店和餐饮候选。
|
||
3. 客服可以按景区查费用、二消、必付和可选项目。
|
||
4. 响应速度从原来的数秒级降到 0.1 秒级图谱查询。
|
||
5. 展示方式从复杂行程卡,调整为按问题类型展示足够信息。
|
||
|
||
## 6. 当前还不是完整 GraphRAG
|
||
|
||
当前实现是:
|
||
|
||
```text
|
||
用户问题
|
||
-> 规则/轻量 Agent 分流
|
||
-> 知识图谱快速查询
|
||
-> 结构化结果展示
|
||
```
|
||
|
||
还没有完整接入:
|
||
|
||
```text
|
||
图谱查询
|
||
-> 向量库补充原文话术/证据
|
||
-> LLM 生成客服自然语言回复
|
||
```
|
||
|
||
原因是当前原型优先解决“查得到、查得快、数据结构可控”。如果一开始所有问题都走向量和 LLM,会更慢,也更容易把线路、费用、可选资源说错。
|
||
|
||
## 7. 后续建议
|
||
|
||
下一步建议把 GraphRAG 分成三层:
|
||
|
||
1. 快速图谱层:线路、景区、费用、附近资源,必须秒级返回。
|
||
2. 向量证据层:客服话术、合同说明、退改规则、行程原文,用于补充解释。
|
||
3. LLM 话术层:只负责把图谱结果和证据整理成客服可复制的话,不负责凭空生成事实。
|
||
|
||
推荐的最终链路:
|
||
|
||
```text
|
||
用户自然语言
|
||
-> Agent 识别意图
|
||
-> KG 精确查询
|
||
-> Vector 补充原文证据
|
||
-> LLM 生成客服回复
|
||
-> 返回可复制话术 + 图谱依据
|
||
```
|
||
|
||
## 8. 当前风险
|
||
|
||
1. 酒店和餐饮的高德车程字段还有部分是 `pending_amap_driving`,附近推荐目前主要依赖业务区域匹配。
|
||
2. 部分费用状态来自文本推断,最终仍应以供应商/产品配置确认。
|
||
3. “路线有哪些”返回的是固定线路产品清单,不等于所有线路都支持小包团,需要看产品字段 `small_group_supported` 或后续供应商补充。
|
||
4. 如果后续图谱节点增加到几万级,需要给线路清单和 NEARBY 查询增加分页、索引或缓存。
|
||
|