Нема описа

wangxi cf2bb104b4 init: 申勤物业知识图谱 Agent 问答系统(图谱构建 + LangGraph 问答 + FastAPI 服务) пре 1 месец
docs cf2bb104b4 init: 申勤物业知识图谱 Agent 问答系统(图谱构建 + LangGraph 问答 + FastAPI 服务) пре 1 месец
models cf2bb104b4 init: 申勤物业知识图谱 Agent 问答系统(图谱构建 + LangGraph 问答 + FastAPI 服务) пре 1 месец
scripts cf2bb104b4 init: 申勤物业知识图谱 Agent 问答系统(图谱构建 + LangGraph 问答 + FastAPI 服务) пре 1 месец
src cf2bb104b4 init: 申勤物业知识图谱 Agent 问答系统(图谱构建 + LangGraph 问答 + FastAPI 服务) пре 1 месец
.env.example cf2bb104b4 init: 申勤物业知识图谱 Agent 问答系统(图谱构建 + LangGraph 问答 + FastAPI 服务) пре 1 месец
.gitignore cf2bb104b4 init: 申勤物业知识图谱 Agent 问答系统(图谱构建 + LangGraph 问答 + FastAPI 服务) пре 1 месец
README.md cf2bb104b4 init: 申勤物业知识图谱 Agent 问答系统(图谱构建 + LangGraph 问答 + FastAPI 服务) пре 1 месец
meta_graph.png cf2bb104b4 init: 申勤物业知识图谱 Agent 问答系统(图谱构建 + LangGraph 问答 + FastAPI 服务) пре 1 месец
meta_graph_v2.png cf2bb104b4 init: 申勤物业知识图谱 Agent 问答系统(图谱构建 + LangGraph 问答 + FastAPI 服务) пре 1 месец
meta_graph_v3.png cf2bb104b4 init: 申勤物业知识图谱 Agent 问答系统(图谱构建 + LangGraph 问答 + FastAPI 服务) пре 1 месец
meta_graph_v4.png cf2bb104b4 init: 申勤物业知识图谱 Agent 问答系统(图谱构建 + LangGraph 问答 + FastAPI 服务) пре 1 месец
meta_graph_v5.png cf2bb104b4 init: 申勤物业知识图谱 Agent 问答系统(图谱构建 + LangGraph 问答 + FastAPI 服务) пре 1 месец
meta_graph_v6.png cf2bb104b4 init: 申勤物业知识图谱 Agent 问答系统(图谱构建 + LangGraph 问答 + FastAPI 服务) пре 1 месец
meta_graph_v7.png cf2bb104b4 init: 申勤物业知识图谱 Agent 问答系统(图谱构建 + LangGraph 问答 + FastAPI 服务) пре 1 месец
pyproject.toml cf2bb104b4 init: 申勤物业知识图谱 Agent 问答系统(图谱构建 + LangGraph 问答 + FastAPI 服务) пре 1 месец
uv.lock cf2bb104b4 init: 申勤物业知识图谱 Agent 问答系统(图谱构建 + LangGraph 问答 + FastAPI 服务) пре 1 месец

README.md

申勤物业知识图谱 Agent 问答系统

基于知识图谱的物业业务智能问答系统:把市场部、财务部、人事部、运营部、采购部的业务数据 构建为以「项目」为核心的 Neo4j 知识图谱,通过 LangGraph Agent + DeepSeek 提供自然语言问答, 答案可溯源到图谱中的节点与关系。

功能特性

  • 知识图谱构建:13 类数据模板(Excel)→ 字段校验 → 两阶段构建(先节点后关系)→ Neo4j;
  • Agent 问答:问题理解(分类+槽位)→ 实体/概念/值 三层接地 → 能力拓展(派生属性推理) → 查询规划(含返回字段)→ 执行(按需返回字段)→ 规则+LLM 双层检查 → 带溯源回答;
  • 多轮对话:同一会话内保留结构化上下文(问题/实体主键/回答),支持拆解式提问与指代; 多轮答案复用(reuse_check)由 LLM 结合 当前问题+历史问题+历史回答 判断是否可直接推导;
  • API 服务:FastAPI + 全异步 astreamthread_id 会话管理,SSE 流式处理进度,多请求并发;
  • 人工确认:槽位确认、计划确认、子图范围收缩,均可自动化或走 human-in-the-loop;
  • 只读保障:所有问答 LLM 提示词注入只读约束,问答阶段禁止修改图谱数据。

技术栈

选型
环境 uv(Python ≥3.11)
图存储 Neo4j 5+(neo4j://127.0.0.1:7687)
LLM DeepSeek(deepseek-v4-flash,OpenAI 兼容)
语义嵌入 Qwen3-Embedding-0.6B(本地模型)
Agent 编排 LangGraph
API FastAPI + Uvicorn(全异步 astream)

快速开始

1. 环境准备

uv sync
cp .env.example .env

编辑 .env

NEO4J_URI=neo4j://127.0.0.1:7687
NEO4J_USER=neo4j
NEO4J_PASSWORD=你的密码
DEEPSEEK_API_KEY=sk-你的key
DEEPSEEK_BASE_URL=https://api.deepseek.com
DEEPSEEK_MODEL=deepseek-v4-flash

2. 启动 Neo4j

在 Neo4j Desktop(或服务)中启动数据库,确认 Bolt 端口(默认 7687)可连接。

3. 准备嵌入模型

将 Qwen3-Embedding-0.6B 放到 models/Qwen3-Embedding-0.6B(首次问答会加载,之后进程内缓存)。

数据与图谱构建

生成模板与测试数据

uv run python scripts/generate_templates.py      # 生成 13 类数据模板(data/templates)
uv run python scripts/generate_test_data.py      # 生成与模板对应的测试数据(data/test_data)

构建知识图谱

uv run python scripts/build_graph.py data/config_example.json --clear

构建分两阶段(先创建全部节点,再创建全部关系),包含字段名写死校验、必填校验与引用存在性校验。

真实数据接入:DMS 模型字段映射见 docs/DMS字段映射.md;需要人工补填的字段清单见 data/manual_fill/人工补填清单.xlsx(生成脚本 scripts/generate_manual_fill_workbook.py)。

Agent 问答(CLI)

单次提问

uv run python scripts/ask.py "青浦区图书馆3月份有加班的人是谁"

常用参数:

--auto    自动确认(跳过人工确认,批处理/评测用)
--debug   显示每步实际执行的 实参/丢弃参数/Cypher/首行/检查报告
--user    提问人身份(工号或用户名,默认 admin01)

交互多轮对话

uv run python scripts/ask.py            # 或加 --auto 自动确认
问题 > 青浦区图书馆3月份有加班的人是谁
(回答)
问题 > 那他们4月份呢
(自动引用上一轮实体继续)
问题 > 清空
(重置上下文,开始新话题)

API 服务

uv run python -m knowledge_agent.api                 # 本机访问
uv run python -m knowledge_agent.api --host 0.0.0.0  # 局域网访问(需放行防火墙 8000 端口)

默认监听 127.0.0.1:8000--host 0.0.0.0 时局域网内通过 http://<你的IP>:8000 访问), 交互文档见 http://127.0.0.1:8000/docs

⚠️ 当前未接鉴权,0.0.0.0 对外开放前请先加 API Key / 权限校验。

接口

接口 说明
POST /ask body {thread_id, query, auto_confirm, reuse_check};块返回完整结果;遇人工确认按 auto_confirm 处理
POST /ask/stream SSE 流式:event: progress(节点级进度)、event: confirmevent: done
POST /threads/{id}/resume 恢复被中断会话({reply: "确认"} 或修改意见)
GET /threads/{id}/history 会话历史(rounds + messages)

请求字段说明:

  • thread_id:会话标识,同一 id 共享上下文(多轮);
  • query:用户问题;
  • auto_confirm(默认 true):自动确认槽位/计划/范围;false 时返回 need_confirm,前端确认后调 /resume
  • reuse_check(默认 true):有历史回答时由 LLM 判断能否直接复用推导答案;false 强制每次完整检索。

SSE 进度事件说明(event: progressdatanodelabellabel 为中文阶段说明,可直接展示):

node label(处理阶段)
understand 正在理解问题(分类 + 槽位抽取)
reuse_check 正在判断是否可复用历史回答
answer_reuse 正在基于历史回答推导答案
ground 正在把问题实体对齐到知识图谱
capability 正在推理派生属性(如 年龄 ← 出生日期)
cap_check / cap_llm_check 正在检查/审查派生规则
confirm 等待确认查询条件
plan 正在制定查询计划
confirm_plan 等待确认查询计划
run 正在检索知识图谱
run_check / run_llm_check 正在检查/审查检索结果
reflect 正在判断结果能否回答该问题
scope 正在缩小查询范围
answer 正在生成回答

curl 示例

Windows PowerShell 下中文 body 建议写 UTF-8 文件避免编码问题:

# body.json(UTF-8 保存)
# {"thread_id":"user-001","query":"青浦区图书馆3月份有加班的人是谁","auto_confirm":true,"reuse_check":true}

curl.exe --request POST --url http://127.0.0.1:8000/ask `
  --header "Content-Type: application/json" `
  --data "@body.json"

或使用 PowerShell 原生:

$body = @{ thread_id = "user-001"; query = "青浦区图书馆3月份有加班的人是谁"; auto_confirm = $true; reuse_check = $true } | ConvertTo-Json
Invoke-RestMethod -Uri "http://127.0.0.1:8000/ask" -Method Post `
  -ContentType "application/json; charset=utf-8" -Body ([System.Text.Encoding]::UTF8.GetBytes($body))

架构概览

graph LR
  Q[用户问题] --> U[问题理解 一次LLM]
  U --> R[复用检查 LLM判断]
  R -->|可复用| A2[直接给出历史推导答案]
  R -->|需检索| G[实体/概念/值 接地]
  G --> C[能力拓展 派生推理]
  C --> P[查询规划 含返回字段]
  P --> E[执行 Neo4j 按需返回]
  E --> A[回答 带溯源]

详细设计(节点职责、时间建模、检索/审查流程、安全与权限、DMS 接入)见 docs/技术方案.md

目录结构

knowledge_agent/
├── pyproject.toml / uv.lock / .env
├── README.md
├── docs/                    # 技术方案、DMS 字段映射、架构图
├── data/
│   ├── templates/           # 13 类数据模板(+填写说明)
│   ├── test_data/           # 测试数据(与模板一一对应)
│   ├── manual_fill/         # 人工补填清单
│   └── config_example.json  # 构建配置
├── models/Qwen3-Embedding-0.6B
├── scripts/                 # 模板/测试数据/构建/问答 CLI/DMS 映射等
└── src/knowledge_agent/
    ├── config.py            # .env 配置
    ├── db.py                # Neo4j driver 单例
    ├── meta/                # 元知识图谱(单一事实源)
    ├── graph/               # 图谱构建(schemas/reader/builder)
    ├── retrieval/           # 实体索引/接地/查询工具集
    ├── agent/               # LangGraph 节点/派生引擎/概念接地/值接地/API
    └── api.py               # FastAPI 服务

安全与权限

  • 所有问答 LLM 提示词注入只读约束(SYSTEM_SAFETY),禁止修改图谱数据;
  • 权限模型(data/permissions.json:角色 × 意图 + 敏感字段)已就绪,permission_check 节点待接线;
  • 完整安全方案见 docs/技术方案.md 第 11 章。

常见问题

现象 处理
Unable to retrieve routing information / 连接 7687 被拒 Neo4j 未启动;在 Neo4j Desktop 中 Start 数据库
端口无监听但服务已开 确认 .envNEO4J_URI 与数据库实际端口一致
局域网其他人访问不到 启动加 --host 0.0.0.0,并放行 Windows 防火墙 8000 端口
回答数量对不上 / 结果为空 --debug 看执行详情(实参/丢弃参数/Cypher/行数)与检查报告
首次运行慢 属正常:加载嵌入模型 + 多次 DeepSeek 调用;之后同进程会快
DMS token 过期 从 DMS 控制台重新复制 vuejs_token(见 scripts/fetch_dms_fields.py