|
|
1 månad sedan | |
|---|---|---|
| docs | 1 månad sedan | |
| models | 1 månad sedan | |
| scripts | 1 månad sedan | |
| src | 1 månad sedan | |
| .env.example | 1 månad sedan | |
| .gitignore | 1 månad sedan | |
| README.md | 1 månad sedan | |
| meta_graph.png | 1 månad sedan | |
| meta_graph_v2.png | 1 månad sedan | |
| meta_graph_v3.png | 1 månad sedan | |
| meta_graph_v4.png | 1 månad sedan | |
| meta_graph_v5.png | 1 månad sedan | |
| meta_graph_v6.png | 1 månad sedan | |
| meta_graph_v7.png | 1 månad sedan | |
| pyproject.toml | 1 månad sedan | |
| uv.lock | 1 månad sedan |
基于知识图谱的物业业务智能问答系统:把市场部、财务部、人事部、运营部、采购部的业务数据 构建为以「项目」为核心的 Neo4j 知识图谱,通过 LangGraph Agent + DeepSeek 提供自然语言问答, 答案可溯源到图谱中的节点与关系。
reuse_check)由 LLM 结合 当前问题+历史问题+历史回答 判断是否可直接推导;astream,thread_id 会话管理,SSE 流式处理进度,多请求并发;| 层 | 选型 |
|---|---|
| 环境 | 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) |
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
在 Neo4j Desktop(或服务)中启动数据库,确认 Bolt 端口(默认 7687)可连接。
将 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)。
uv run python scripts/ask.py "青浦区图书馆3月份有加班的人是谁"
常用参数:
--auto 自动确认(跳过人工确认,批处理/评测用)
--debug 显示每步实际执行的 实参/丢弃参数/Cypher/首行/检查报告
--user 提问人身份(工号或用户名,默认 admin01)
uv run python scripts/ask.py # 或加 --auto 自动确认
问题 > 青浦区图书馆3月份有加班的人是谁
(回答)
问题 > 那他们4月份呢
(自动引用上一轮实体继续)
问题 > 清空
(重置上下文,开始新话题)
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: confirm、event: 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: progress 的 data 含 node 与 label,label 为中文阶段说明,可直接展示):
| 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 |
正在生成回答 |
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 服务
data/permissions.json:角色 × 意图 + 敏感字段)已就绪,permission_check 节点待接线;| 现象 | 处理 |
|---|---|
Unable to retrieve routing information / 连接 7687 被拒 |
Neo4j 未启动;在 Neo4j Desktop 中 Start 数据库 |
| 端口无监听但服务已开 | 确认 .env 的 NEO4J_URI 与数据库实际端口一致 |
| 局域网其他人访问不到 | 启动加 --host 0.0.0.0,并放行 Windows 防火墙 8000 端口 |
| 回答数量对不上 / 结果为空 | 用 --debug 看执行详情(实参/丢弃参数/Cypher/行数)与检查报告 |
| 首次运行慢 | 属正常:加载嵌入模型 + 多次 DeepSeek 调用;之后同进程会快 |
| DMS token 过期 | 从 DMS 控制台重新复制 vuejs_token(见 scripts/fetch_dms_fields.py) |