技术博客 · 2026/08/25

从开源贡献赛到知识图谱问答:我如何搭建 Data Knowledge Insight 智能体流水线

复盘 data-knowledge-insight-demo 项目:用 Python 把清洗、知识图谱、KGQA、NL2SQL 和 FastAPI 组织成端到端智能体 Demo,适配 DataMate 与 Nexent 平台,获 ModelEngine 开源项目贡献赛三等奖并合入 AgentsHub。

PythonFastAPI知识图谱智能体NL2SQL

项目背景

这个项目参加的是 ModelEngine 社区的开源贡献赛。社区的 AgentsHub 仓库基于 Nexent 平台打造智能体共享生态,收录通用场景和行业垂直场景的智能体。我不想只提交一个对话机器人,而是想验证一条完整的工程链路:把医疗示例数据从原始 CSV 和非结构化文本,加工成结构化数据、知识图谱,再向上支撑问答与分析。

选择医疗示例数据是因为它天然混合了两种数据形态:结构化的病历记录表和非结构化的症状描述文本。数据形态差异会放大真实的工程问题——清洗规则怎么兼容两类输入、抽取结果怎么落到统一的图谱结构、下游问答和分析又依赖哪些前置产物。这些问题比单点功能更接近实际生产环境。

总体架构与任务拆分

整个 Demo 按”数据 → 知识 → 洞察”拆成三个任务,外加两个横向层:

Demo 总览:三大任务与平台适配层 图:Data Knowledge Insight Demo 总览

  • 任务一(数据处理):清洗 CSV、规范化文本、抽取核心字段;
  • 任务二(知识构建):实体识别、关系抽取、三元组生成与校验;
  • 任务三(数据分析):图谱统计、中心性分析、SQLite 构建、NL2SQL 模板评估与图表输出;
  • planners 层:RuleBasedTaskPlanner 把自然语言任务描述映射成执行计划,LLMTaskPlanner 作为增强路径;
  • adapters 层:DataMate 风格 mapper 与 Nexent/FastMCP 风格工具,负责向真实平台迁移。

完整流程效果 图:从原始数据到洞察产出的完整流程

这样拆的好处是每个任务的输入输出都是明确的产品:任务一产出干净数据,任务二产出图谱文件,任务三产出报告和图表。任何一环出问题都能定位到具体边界,而不是在一个大函数里排查。

数据处理智能体

任务一要同时吃下两种输入。CSV 侧做缺失值清洗、文本字段规范化和核心字段抽取;文本侧做读取、切分和结构化导出。执行计划由规则规划器生成:“只处理 CSV""只处理文本""两者都处理”分别映射成不同的步骤序列。

LLMTaskPlanner 是这条链路上的增强项:让真实模型根据任务描述生成计划。但模型输出不可信时必须有兜底——返回坏 JSON 或未知步骤时自动回退到规则规划结果。此外每个步骤可以通过 StepExecutionPolicy 单独配置重试、必选或可跳过行为,失败时汇总进 execution_state.errors 而不是中断整条流水线。

这套设计的出发点很简单:规划可以智能,执行必须可靠。

知识图谱构建与问答

任务二从医疗文本里抽取疾病、症状、药物等实体及其关系,生成三元组并做校验,然后导出三种格式:JSON 供程序消费,GraphML 供图分析工具导入,HTML 用 pyvis 直接可视化。

疾病症状数量统计 图:知识图谱中疾病-症状关系统计

图谱之上是 KGQAAgent。它支持四类问法:疾病查症状、疾病查用药、症状反查疾病、药物反查疾病。问答直接落在图结构上,答案附带证据路径,避免了生成式模型自由发挥带来的不可解释性——医疗场景里这一点尤其重要。

数据分析与 NL2SQL

任务三把图谱和清洗后的数据进一步变成洞察:节点边数与实体类型统计、疾病症状数量、药物关联疾病数量、中心性分析,并用 matplotlib 输出图表。清洗后的记录写入 SQLite 后,再用 NL2SQL 模板评估自然语言到 SQL 查询的转换效果。

药物关联疾病数量统计 图:药物-疾病关联统计

NL2SQL 这一步我没有追求自由文本到任意 SQL 的转换,而是先用模板圈定可回答的问题域。模板评估的意义在于先建立可衡量的基线,再谈扩展。

平台集成:DataMate 与 Nexent

这部分回答一个关键问题:Demo 怎么迁移到真实平台。

DataMate 侧,我把清洗逻辑改写成 sample -> sample 风格的 mapper(CleanTextDataMateMapper、NormalizeMedicalRecordMapper 等),并提供 datamate_task1_package 目录作为可直接搬运的包示例。迁移成本从”重写”降到”对照结构搬移”。

Nexent 侧,用 FastMCP 把四个业务能力封装成远程 MCP 工具:process_medical_data、build_medical_knowledge_graph、ask_medical_kg、analyze_medical_data。工具内置前置产物检查——图谱文件不存在时返回结构化的 missing_prerequisite 提示而不是崩溃。

Nexent MCP 配置界面 图:在 Nexent 中配置 MCP Server

我在本地用 Docker 跑通了这个集成:Nexent 容器内通过 host.docker.internal 访问宿主机 8001 端口的 MCP Server,界面上创建医疗智能体并勾选四个工具后,可以直接用自然语言触发数据处理、图谱构建、问答和分析。

Nexent 医疗智能体界面 图:Nexent 中的医疗知识图谱助手

结果与复盘思考

最终交付是一个可一键运行、可测试、可解释的闭环:run_demo.py 依次跑通三个任务,FastAPI 暴露健康检查与三大任务共五个接口,56 个 pytest 测试全部通过。项目获得 ModelEngine 开源项目贡献赛三等奖,代码合入社区 AgentsHub 仓库。

复盘下来有三点值得沉淀:

第一,先保证端到端可运行,再谈单点优化。三个任务各自做到 MVP 后立刻串成闭环,很多接口设计和产物格式问题是串起来之后才暴露的。

第二,规划可以有弹性,执行必须有兜底。LLM 参与规划提升了灵活性,但真正让系统可靠的是回退机制和每一步的策略配置。

第三,适配层值得提前设计。adapters 独立成模块后,向 DataMate 和 Nexent 的迁移变成了结构对照和搬移,而不是侵入式改造——这也是它能进入社区共享生态的直接原因。