基于 LangChain + LangGraph 框架的城市内涝风险评估系统。使用 AHP (层次分析法) 对各因子进行打分,通过一致性检验后计算最终权重,生成交互式风险地图。
- AI 驱动打分: 使用 LLM (硅基流动 deepseek-v3) 根据用户描述生成 AHP 权重矩阵
- TIF 降雨处理: 自动提取 TIF 文件中的降雨数据并叠加到渔网
- 自动一致性检验: 自动检验 CR < 0.1,失败则重试
- 样本收集: 收集 20 个有效样本后计算平均权重
- 交互式风险地图: 基于 Folium 生成交互式风险地图
- 历史积水点标注: 可视化历史积水点,验证评估结果
| 组件 | 技术 |
|---|---|
| 语言 | Python 3.10+ |
| 框架 | LangChain + LangGraph |
| LLM | 硅基流动 deepseek-v3 |
| 数值计算 | NumPy, Pandas |
| 地理空间 | GeoPandas, Rasterio |
| 可视化 | Folium, mapclassify |
| CLI | Typer, Rich |
risk-agent/
├── config/
│ └── model_config.py # 模型配置
├── src/
│ ├── main.py # CLI 入口
│ ├── graph/
│ │ ├── state.py # LangGraph 状态
│ │ ├── nodes.py # 节点函数
│ │ ├── graph.py # LangGraph 构建
│ │ └── tools/
│ │ ├── consistency_tool.py # 一致性检验工具
│ │ ├── weight_tool.py # 权重平均工具
│ │ ├── raster_tool.py # TIF 降雨处理工具
│ │ └── risk_map_tool.py # 风险图生成工具
│ ├── models/
│ │ └── ahp_output.py # AHP 输出模型
│ ├── prompts/
│ │ └── ahp_prompt.py # AHP 打分提示词
│ └── chains/
│ └── ahp_chain.py # LLM 调用链
├── data/
│ ├── input/ # 输入数据
│ │ ├── 渔网.shp # 渔网数据 (不含雨量)
│ │ ├── 降雨.tif # 降雨 TIF 文件
│ │ ├── 行政区划.shp # 行政区划边界
│ │ └── 积水点.csv # 历史积水点 (可选)
│ └── output/ # 输出结果
└── tests/
├── test_tools.py # 工具测试
└── test_graph.py # 图流程测试
┌─────────────────────────────────────────────────────────────────┐
│ 用户输入 │
├─────────────────────────────────────────────────────────────────┤
│ 1. 暴雨场景描述 (如: "郑州市遭遇特大暴雨,24小时降雨超过500mm") │
│ 2. 渔网数据 (Shapefile,含地形、不透水、植被等因子) │
│ 3. 降雨 TIF 文件 (动态降雨数据) │
│ 4. 行政区划边界 │
│ 5. 历史积水点 CSV (可选) │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ LangGraph 智能体工作流 │
├─────────────────────────────────────────────────────────────────┤
│ ┌──────────────────┐ │
│ │ 1. 处理降雨 TIF │ ← 提取降雨值并叠加到渔网 │
│ └────────┬─────────┘ │
│ ↓ │
│ ┌──────────────────┐ │
│ │ 2. LLM AHP 打分 │ ← 根据场景描述生成权重矩阵 │
│ └────────┬─────────┘ │
│ ↓ │
│ ┌──────────────────┐ │
│ │ 3. 解析 JSON │ ← 解析 LLM 输出 │
│ └────────┬─────────┘ │
│ ↓ │
│ ┌──────────────────┐ │
│ │ 4. 一致性检验 │ ← CR < 0.1? 通过则收集样本,否则重试 │
│ └────────┬─────────┘ │
│ ↓ │
│ ┌──────────────────┐ │
│ │ 5. 样本收集 │ ← 收集 20 个有效样本 │
│ └────────┬─────────┘ │
│ ↓ │
│ ┌──────────────────┐ │
│ │ 6. 权重平均 │ ← 计算最终权重 │
│ └────────┬─────────┘ │
│ ↓ │
│ ┌──────────────────┐ │
│ │ 7. 生成风险地图 │ ← 结合渔网、权重、积水点生成地图 │
│ └──────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ 输出结果 │
├─────────────────────────────────────────────────────────────────┤
│ • risk_map.html - 交互式风险地图 (含积水点标注) │
│ • ahp_output.json - AHP 打分和权重结果 │
└─────────────────────────────────────────────────────────────────┘
pip install -r requirements.txt编辑 .env 文件,填入硅基流动 API Key:
SILICONFLOW_API_KEY=your_api_key_here获取 API Key: https://cloud.siliconflow.cn/
| 文件 | 格式 | 说明 |
|---|---|---|
| 渔网数据 | Shapefile | 包含因子字段 (地形, 不透水, 植被, 湿度, 人口, 道路) |
| 降雨数据 | GeoTIFF | 降雨栅格数据 |
| 行政区划 | Shapefile | 包含 NAME 或 name 字段 |
| 积水点 | CSV | 可选,包含 lng, lat, count 列 |
# 完整参数运行
python -m src.main run \
--description "郑州市遭遇特大暴雨,24小时降雨量超过500mm" \
--fishnet "data/input/渔网.shp" \
--rainfall "data/input/降雨.tif" \
--boundary "data/input/行政区划.shp" \
--water-points "data/input/积水点.csv" \
--output "data/output"
# 演示模式 (使用默认场景描述)
python -m src.main demo \
--fishnet "data/input/渔网.shp" \
--rainfall "data/input/降雨.tif" \
--boundary "data/input/行政区划.shp" \
--water-points "data/input/积水点.csv"| 文件 | 说明 |
|---|---|
data/output/risk_map.html |
交互式风险地图 (含积水点标注) |
data/output/ahp_output.json |
AHP 打分和权重结果 |
- 地形高程 - 地势高低对水流方向和积水形成的影响
- 不透水地表 - 城市化程度对径流和排水系统的影响
- 植被覆盖 - 植被对雨水的吸收和缓冲作用
- 地形湿度指数 - 地形与水分关系对内涝风险的控制作用
- 人口密度 - 灾害暴露人口数量和潜在损失
- 道路密度 - 基础设施脆弱程度和交通瘫痪风险
- 降雨量 - 从 TIF 文件动态提取
# 运行所有测试
pytest tests/ -v
# 运行特定测试
pytest tests/test_tools.py -v
pytest tests/test_graph.py -v# 显示版本信息
python -m src.main version
# 运行完整评估
python -m src.main run \
-d "场景描述" \
-f "渔网.shp" \
-r "降雨.tif" \
-b "边界.shp" \
-w "积水点.csv" \
-o "输出目录"
# 演示模式
python -m src.main demo \
-f "渔网.shp" \
-r "降雨.tif" \
-b "边界.shp" \
-w "积水点.csv"
# 显示帮助
python -m src.main --helpA: 访问 https://cloud.siliconflow.cn/ 注册并获取 API Key
A:
- 渔网数据: Shapefile 格式,需包含字段 (地形, 不透水, 植被, 湿度, 人口, 道路)
- 降雨 TIF: GeoTIFF 格式,需与渔网坐标系兼容
- 行政区划: Shapefile 格式,包含 NAME 或 name 字段
- 积水点 CSV: 需包含 lng, lat 列,可选 count 列
A: 不需要。系统会自动从 TIF 文件提取降雨数据并添加到渔网。
A: 修改 src/graph/graph.py 中的条件判断,将 >= 20 改为其他值
A: 不是必须的。积水点数据用于在地图上标注历史积水位置,辅助验证评估结果。
MIT License