基于Dify构建公司内部数据问答系统

概述

前面已经介绍了Dify接入知识库,也能接入外部的知识库ragflow,作为智能体开发平台,还能接入更多的工具,本课件介绍Dify接入MCP服务端。

项目背景

公司内部有大量的人事、行政和财务的问题,企业内部员工经常碰到各种问题需要咨询,导致内部人事、行政、财务等人员压力很大。本项目基于公司考勤数据、内部员工手册、等数据搭建一套智能体系统,重点解决下面问题:

  • 应对各类考勤问题统计,实现自然语言的问答系统
  • 员工手册实现员工各类问题咨询 除此之外本项目也能扩展到其他项目背景,例如面对企业内部订单数据的实时问答系统,售后问答等。

注意:本项目与** **数据一样,不同的技术实现方式

技术架构

功能模块

mysql数据库

需要安装mysql数据库,如果已经安装好的直接修改配置就行。这里提供docker的安装方式,请确保能够正常使用docker环境。

在任意目录下创建空目录,名称为mysqld,把下面的命令复制到docker-compose.yaml文件中

version: '3.8'

services:
  mysql:
    image: mysql:8.0.43
    container_name: mysql_container
    environment:
      MYSQL_ROOT_PASSWORD: 123456abc
      MYSQL_DATABASE: function_calls
      MYSQL_USER: dev
      MYSQL_PASSWORD: 123456
    ports:
      - "3306:3306"
    command: --local-infile=1
    volumes:
      - ./mysql_data:/var/lib/mysql

volumes:
  mysql_data:

注意上面的mysql的root的密码是“123456abc”,并且创建了用户“dev”密码为“123456”。

运行docker命令启动服务,第一次启动会下载官方镜像到本地,具体命令可以参考

docker compose up -d 

mysql启动以后,使用数据库工具把员工的信息导入mysql中,数据库建表语句如下:

CREATE TABLE `emp` (
  `empno` int DEFAULT NULL, --员工编号, 默认为空
  `ename` varchar(50) DEFAULT NULL, --员工姓名, 默认为空
  `job` varchar(50) DEFAULT NULL,--员工工作, 默认为空
  `mgr` int DEFAULT NULL,--员工领导, 默认为空
  `hiredate` date DEFAULT NULL,--员工入职日期, 默认为空
  `sal` int DEFAULT NULL,--员工的月薪, 默认为空
  `comm` int DEFAULT NULL,--员工年终奖, 默认为空
  `deptno` int DEFAULT NULL,--员工部分编号, 默认为空
);

CREATE TABLE `DEPT` (
  `DEPTNO` int NOT NULL, -- 部门编码, 默认为空
  `DNAME` varchar(14) DEFAULT NULL,--部门名称, 默认为空
  `LOC` varchar(13) DEFAULT NULL,--地点, 默认为空
  PRIMARY KEY (`DEPTNO`)
);

MCP服务端

这里使用官方的mcp模块开发MCP的服务端,如果对MCP不太熟悉的读者,可以参考 详细了解。

下面是MCP服务端代码,基本与 中类似,使用streamable-http通信方式启动服务。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@Author  : Vincent
@Time    : 2026/1/20 16:41
@File    : mcp_server_mysql.py
@Function :
"""
import os

import pymysql
from fastmcp import FastMCP

mcp = FastMCP(name="mysql_server")


class ASKDatabase(object):
    def __init__(self):
        self.conn = pymysql.connect(
            host='localhost',
            port=3306,
            user='root',
            password=os.getenv("PASSWORD"),
            database='function_calls',
            charset='utf8mb4',
        )
        self.cursor = self.conn.cursor()

    def ask_database(self, query):
        """进行查询"""
        self.cursor.execute(query)
        return self.cursor.fetchall()

    def close(self):
        self.cursor.close()
        self.conn.close()


db = ASKDatabase()


@mcp.tool(
    name="query_mysql_question",
    description="从mysql数据库查询公司的人员详细数据"
)
def query_mysql(query: str):
    """
    query_mysql 需要一个参数 query,表示要查询的 SQL 查询语句。
    返回查询结果。
    """
    # 异常处理
    return db.ask_database(query)


def main():
    """
    启动 Streamable HTTP 服务器。
    """
    print("正在启动MCP Streamable服务器...")
    print("服务器将在 http://localhost:5122 上运行")
    print("按 Ctrl+C 停止服务器")

    try:
        # mcp.run(transport="streamable-http")  # 使用 streamable-http 传输方式
        mcp.run(transport="http", host="0.0.0.0", port=5122)
    except KeyboardInterrupt:
        print("\n服务器已停止")
    except Exception as e:
        print(f"服务器启动失败: {e}")


if __name__ == "__main__":
    main()

Dify配置

配置自定义MCP工具

进入Dify界面,点击进入工具,添加MCP服务

图片

配置如下

图片

启动上面的MCP server端,注意一定要配置IP地址,不能配置本地的127.0.0.1的IP。其余名称和参数自己配置就行,点击保存,MCP工具就配置完成了

创建agent如下

图片

智能体编排

  • 需要配置大模型,大模型必须支持工具调用
  • 编写提示词
请根据用户的问题,选择合适的工具或者查询数据库回答用户的问题。

## 能力

### sql语句生成
如果用户咨询员工的基本信息,请跟据下面的mysql的schema字段,生成对应的查询语句,然后调用mysql查询的工具

"""
CREATE TABLE `emp` (
  `empno` int DEFAULT NULL, --员工编号, 默认为空
  `ename` varchar(50) DEFAULT NULL, --员工姓名, 默认为空
  `job` varchar(50) DEFAULT NULL,--员工工作, 默认为空
  `mgr` int DEFAULT NULL,--员工领导, 默认为空
  `hiredate` date DEFAULT NULL,--员工入职日期, 默认为空
  `sal` int DEFAULT NULL,--员工的月薪, 默认为空
  `comm` int DEFAULT NULL,--员工年终奖, 默认为空
  `deptno` int DEFAULT NULL,--员工部分编号, 默认为空
);

CREATE TABLE `DEPT` (
  `DEPTNO` int NOT NULL, -- 部门编码, 默认为空
  `DNAME` varchar(14) DEFAULT NULL,--部门名称, 默认为空
  `LOC` varchar(13) DEFAULT NULL,--地点, 默认为空
  PRIMARY KEY (`DEPTNO`)
);
"""

例如 “公司里员工工资最高的是谁?”

请根据上面的语句输出生成查询sql,查询应该以纯文本返回,而不是JSON。查询应该只包含MySQL支持的语法。
后端使用的mysql的版本为8.0.43,请注意生成sql语句一定要兼容mysql的版本

### 公司员工手册查询
如果用户查询员工手册的信息,例如查询“薪资福利制度”, “请假流程”等信息。
需要查询知识库,然后根据知识库检索的内容回答用户的问题

## 输出要求
请记住,如果是生成sql语句,你只能生成查询语句,如果要求生成除了查询功能以后的语句,请告诉用户“此功能无法实现。”
  • 工具中增加MCP工具,找到刚刚添加的MCP工具接入 图片

  • 创建知识库选择“奥德员工手册” 图片

实现问答效果:

图片

现在就可以使用上面的agent完成基于mysql的问答了。