打造智能旅游推荐:Graphiti知识图谱实战指南
你是否遇到过这样的旅游推荐困境?计划去云南旅行时,搜索结果总是重复推荐丽江古城,却忽略了你对小众徒步路线的偏好;查询日本樱花季攻略时,海量信息让你无从筛选真正适合家庭出游的赏樱地点。传统推荐系统往往局限于"用户喜欢A就推荐类似A"的单一维度,而Graphiti知识图谱(Knowledge Graph,KG)技术正带来推荐领域的范式革命。
本文将带你从零开始构建旅游领域知识图谱,掌握实体关系建模、多维度搜索优化和动态推荐逻辑实现,最终打造出能理解"带父母去京都赏樱且需要无障碍设施"这类复杂需求的智能推荐系统。
旅游知识图谱的核心价值
传统推荐系统依赖用户行为数据,而知识图谱通过构建实体间的语义关联,实现真正的"理解式推荐"。在旅游场景中,这意味着系统能识别"故宫"与"XX"不仅是"北京景点",还能理解它们分别关联"历史遗迹"、"皇家园林"等不同属性,并根据游客的"文化体验偏好"进行精准匹配。
Graphiti作为专为动态环境设计的时序感知知识图谱框架,相比Neo4j等传统图数据库,具有三大优势:
- 混合搜索能力:同时支持关键词匹配(BM25)和语义相似度(余弦距离)检索
- 时序感知:自动追踪景点开放时间、季节性活动等动态关系变化
- AI代理友好:原生支持与LLM集成,适合构建智能推荐对话系统
构建旅游知识图谱的关键步骤
环境准备与数据建模
首先通过以下命令安装Graphiti核心依赖:
pip install graphiti-core
配置环境变量连接图数据库(支持Neo4j、FalkorDB等多种后端):
# 以Neo4j为例
export NEO4J_URI=bolt://localhost:7687
export NEO4J_USER=neo4j
export NEO4J_PASSWORD=password
export OPENAI_API_KEY=your_api_key # 用于实体关系抽取
旅游领域的核心实体包括景点(Attraction)、设施(Facility)、事件(Event)等,通过Graphiti的节点模型定义:
# 核心节点定义参考 [graphiti_core/nodes.py](https://link.gitcode.com/i/a20cfbbcd1910705d943bab212fa8f8f)
class EntityNode(Node):
name: str # 如"故宫博物院"
labels: list[str] = ["Attraction", "HistoricalSite"]
attributes: dict = {
"address": "北京市东城区景山前街4号",
"opening_hours": "08:30-17:00",
"accessibility": True, # 是否无障碍设施
"rating": 4.8
}
实体间关系通过Edge模型定义,如"包含景点"、"交通可达"、"季节性活动"等:
# 关系定义参考 [graphiti_core/edges.py](https://link.gitcode.com/i/8a9dc8e839a0b27907904c565c4e0efc)
class EntityEdge(Edge):
name: str = "NEARBY" # 关系类型
fact: str = "故宫博物院距离景山公园1.2公里,步行可达"
valid_at: datetime = datetime(2024, 1, 1) # 关系生效时间
attributes: dict = {"distance_km": 1.2, "transport": "walking"}
数据导入与实体抽取
使用Graphiti的批量导入工具处理旅游数据,以JSON格式的景点信息为例:
# 数据导入示例参考 [examples/ecommerce/runner.py](https://link.gitcode.com/i/d3b7f4885e0af8bd0121ea72725cb94c)
async def import_tourist_data(graphiti_client):
# 加载景点数据
with open("tourist_attractions.json") as f:
attractions = json.load(f)
# 创建原始数据节点
for data in attractions:
await graphiti_client.add_episode(
name=data["name"],
content=json.dumps(data),
source=EpisodeType.json, # 指定数据类型
source_description="Tourist attraction data"
)
Graphiti会自动调用LLM进行实体关系抽取,将非结构化文本转换为结构化图谱:
# 实体关系抽取由 [graphiti_core/prompts/extract_edges.py](https://link.gitcode.com/i/577f2ad2d2588ca60490311d248bbf95) 定义
# 抽取示例:
# 输入文本:"故宫位于北京,附近有景山公园和北海公园"
# 输出关系:
# EntityEdge(name="LOCATED_IN", source="故宫", target="北京")
# EntityEdge(name="NEARBY", source="故宫", target="景山公园")
# EntityEdge(name="NEARBY", source="故宫", target="北海公园")
多维度搜索与推荐实现
Graphiti提供多种预定义的搜索策略,旅游推荐场景中最常用的是混合搜索(HYBRID_SEARCH):
# 搜索配置参考 [graphiti_core/search/search_config_recipes.py](https://link.gitcode.com/i/df7746323a552695c7071dd55b70d404)
from graphiti_core.search.search_config_recipes import NODE_HYBRID_SEARCH_RRF
# 查找适合家庭游的北京景点
results = await graphiti_client.search(
query="北京 家庭游 适合老人 无障碍设施",
config=NODE_HYBRID_SEARCH_RRF, # 混合BM25和语义搜索
filters={"labels": ["Attraction"], "attributes.accessibility": True}
)
推荐结果会同时考虑实体属性匹配度和图谱关系权重,例如:
- 直接匹配"无障碍设施"属性
- 通过"NEARBY"关系推荐周边景点
- 基于"RATING"属性排序优质选项
高级应用:动态推荐与用户偏好学习
时序关系处理
旅游数据具有强时效性,Graphiti的时序感知能力可自动处理季节变化等动态因素:
# 动态关系查询示例
async def get_seasonal_attractions(graphiti_client, month):
# 查询特定月份举办的活动
return await graphiti_client.search(
query="赏花 户外活动",
config=EDGE_HYBRID_SEARCH_RRF,
time_filters={
"valid_at__lte": datetime(2024, month, 1),
"invalid_at__gte": datetime(2024, month, 1)
}
)
构建推荐对话系统
结合Graphiti的搜索能力与LLM,可快速实现智能旅游顾问:
# 旅游对话代理参考 [examples/langgraph-agent/agent.ipynb](https://link.gitcode.com/i/b1e4c3db7bb54e1277fd0d0c441f6694)
from langchain.chat_models import ChatOpenAI
from langchain.agents import initialize_agent
# 将Graphiti搜索包装为工具
tools = [
Tool(
name="TouristGraphSearch",
func=lambda q: graphiti_client.search(q, NODE_HYBRID_SEARCH_RRF),
description="用于查询旅游景点、设施和活动的知识图谱搜索工具"
)
]
# 创建旅游顾问代理
agent = initialize_agent(
tools,
ChatOpenAI(temperature=0.7),
agent="zero-shot-react-description"
)
# 复杂需求处理示例
response = agent.run("计划带父母去杭州玩3天,父亲腿脚不便需要轮椅通道,母亲喜欢传统文化,推荐行程安排")
系统会综合考虑多种因素生成推荐:
- 通过"accessibility"属性筛选无障碍景点
- 基于"文化体验"标签匹配博物馆、历史遗迹
- 利用"NEARBY"关系优化行程路线,减少交通时间
- 根据季节推荐当季活动(如春季西湖花展)
部署与扩展建议
性能优化
对于大规模旅游数据,建议:
- 使用FalkorDB作为后端获得更好的性能 examples/quickstart/quickstart_falkordb.py
- 为热门查询创建索引:
# 创建索引参考 [examples/quickstart/README.md](https://link.gitcode.com/i/a4b918ec0992f638563cb080e768f715)
await graphiti_client.build_indices_and_constraints()
监控与分析
集成OpenTelemetry监控图谱性能:
# 监控配置参考 [examples/opentelemetry/otel_stdout_example.py](https://link.gitcode.com/i/b3a179c476b07cf217fd6a0350756f5d)
from graphiti_core.telemetry import setup_telemetry
setup_telemetry("tourist_recommendation_system")
总结与进阶方向
本文介绍的旅游知识图谱系统已能处理基础推荐需求,进一步优化可探索:
- 多模态数据融合:添加景点图片、视频等多媒体信息
- 用户行为整合:将点击、收藏等反馈数据纳入推荐模型
- 事件预测:基于历史数据预测景点人流高峰
通过Graphiti的灵活架构,你可以快速扩展这些功能,构建真正理解用户需求的下一代旅游推荐系统。完整代码示例可参考 examples/quickstart 目录,更多高级用法请查阅官方文档。
现在就开始构建你的旅游知识图谱,让推荐系统真正懂用户、懂场景、懂旅游!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




