在数据驱动决策的浪潮中,“智能问数”正成为企业管理者与数据分析师的新利器。想象一下:只需要简单提问,就能立刻从海量数据中提取关键信息,并且自动生成可视化图表——这正是SQLBot这样的开源智能问数系统为数据分析场景带来的改变。
SQLBot(github.com/dataease/SQLBot)是一款基于大语言模型和RAG(检索增强生成)的开源智能问数系统,它可以帮助用户实现数据的即问即答,快速提炼获取所需的数据信息及可视化图表,并且支持进一步的智能数据分析。
目前,SQLBot开源项目已经发布了几个月的时间,相信已有不少用户在实际场景中进行了应用,收获了“快问快答”的使用体验。不过,在更加深入的数据分析场景中,用户常常需要进行连续的数据钻取和多维度探索,以逐步揭开“数据背后的故事”。目前,SQLBot“一问一答”的模式在处理这类复杂数据分析任务时,通常需要用户多次发起新问题,一定程度上打断了原本连贯的分析思路,影响了分析过程的流畅性。
好在SQLBot提供了强大的集成的能力,支持与AI应用开发平台实现快速对接。今天,我们为您介绍通过MaxKB开源智能体平台(github.com/1Panel-dev/MaxKB)对接SQLBot的MCP服务,打造“连续数据分析助手”的具体方法。这个方案可以巧妙地将SQLBot的问数能力转化为可持续调用的智能服务,从而让用户在单次对话中实现基于上下文的多轮、连贯数据查询。
这一方案的实现包含三个步骤,分别为在SQLBot中配置MCP服务、获取对话身份标识,以及在MaxKB中构建包含循环执行体的工作流。详细操作步骤如下。
第一步:在SQLBot开源智能问数系统中配置MCP服务
首先,我们在SQLBot中需要进行两个关键配置文件的修改:
1. 修改环境配置文件
位置:/opt/sqlbot/.env
关键配置:填写正确的SQLBot图片存放地址
vi /opt/sqlbot/.env
2. 修改主配置文件
位置:/opt/sqlbot/conf/sqlbot.conf
关键配置:确保图片路径配置正确
vi /opt/sqlbot/conf/sqlbot.conf
第二步:获取对话身份标识
在SQLBot中创建一条对应目标数据源的智能问数记录,这一步很关键,目的是获取后续连续问数所需的chat_id。

第三步:在MaxKB开源智能体平台中构建连续问数工作流
在MaxKB构建具有连续问数能力的工作流是整个方案的核心。我们需要构建一个包含12个节点的智能工作流。
主体工作流(包含7个节点)
■ 开始节点:工作流的标准起点;
■ MCP调用节点:调用SQLBot的用户认证服务,使用“mcp_start”工具,输入用户名和密码;
■ 指定回复节点:将前置节点返回的JSON格式转换为字符串格式;
■ 自定义工具节点:精准提取Token的具体值;
■ AI对话节点:利用AI智能拆解用户的复杂问题,将问题解析成一个一个独立的问数问题;
■ 自定义工具节点:将拆解后的问题堆转换为JSON数组;
■ 循环节点:设置为“数组循环”模式,准备逐个处理问题。

2. 循环执行体(包含5个节点)
■ 循环开始节点:循环流程的起点;
■ 指定回复节点:格式化输出分隔符,确保结果清晰可读;
■ MCP调用节点:这是循环执行体的核心环节,使用“mcp_question”工具,传入问题、chat_id和Token;
■ 指定回复节点:将问数结果转换为字符串格式;
■ 自定义工具节点:解析并提取最终的问数内容。

3. 注意事项
主体工作流第五个节点“AI对话节点”的问题拆解提示词如下:
#问题拆解提示词
你是一个AI助手,负责将用户的问题字符串拆分成独立的子问题,并输出为JSON数组。
用户的问题可能包含多个请求,这些请求通常由连接词(如“以及”、“另外”、“并且”、“同时”等)或标点符号(如逗号)分隔。
你的任务是:1. 识别输入字符串中的所有独立子问题。2. 将每个子问题作为一个字符串元素,放入一个JSON数组中。3. 输出时,保持子问题的原始文本内容,不做修改。4. 确保输出是有效的JSON数组,不要添加任何额外文本或解释。 拆分规则:- 首先,根据常见的连接词(如“以及”、“另外”、“并且”、“同时”、“还有”等)进行拆分。
这些词通常表示新问题的开始。- 其次,注意标点符号(如逗号),但需谨慎处理,因为逗号可能用于列表内部而不是分隔问题。如果逗号后紧跟连接词,则优先按连接词拆分。- 每个子问题应该是一个完整的语义单元,能够独立表达一个请求或查询。
示例:- 输入: "请查询各部门分类名称的销售金额总和,以及使用饼图展示各商品分类名称的销售数量占比,另外再使用折线图展示按日期的销售金额趋势"- 输出: ["请查询各部门分类名称的销售金额总和","使用饼图展示各商品分类名称的销售数量占比","使用折线图展示按日期的销售金额趋势"] 现在,请处理以下用户输入,并直接输出JSON数组:用户输入:{{开始.question}}循环执行体工作流第五个节点“自定义工具节点”的问数内容获取函数如下:
#问数内容获取函数
import re
def extract_markdown_content(input_string):
"""
从输入字符串中提取 Markdown 内容,支持表格和图片标记两种格式
Args:
input_string (str): 包含 Markdown 内容的输入字符串
Returns:
str: 提取到的 Markdown 表格内容或图片标记
None: 如果没有找到任何匹配内容
"""
if not input_string:
return None
# 清理输入字符串(如果包含列表格式)
if re.search(r'!\[.*?\]\(.*?\)',input_string):
# 匹配完整的  字符串
pattern = r'!\[.*?\]\(.*?\)'
matches = re.findall(pattern, input_string)
else:
# 使用正则表达式匹配所有符合"|xxx|xxx|"格式的行
pattern = r'\|[^|]+\|[^|]+\|'
matches = re.findall(pattern, input_string)
# 清理每行的多余空格和换行符
cleaned_matches = []
for match in matches:
cleaned = match.strip()
cleaned_matches.append(cleaned)
matches[0] = "\n".join(cleaned_matches)
return matches[0] if matches else None循环体执行详情如下:

总结
在MaxKB的工作流中,我们特别设计了智能问题拆解和循环执行机制。当用户提出“请查询各部门分类名称的销售金额总和,以及使用饼图展示各商品分类名称的销售数量占比,另外再使用折线图展示按日期的销售金额趋势”这样的复合问题时,系统会自动将连续提问拆分成多个子问题,然后循环调用SQLBot服务逐一进行解答,最后整合输出完整的分析结果。也就是说,实现了从“碎片化问答”到“连贯式探索”的效果,具体效果如下图所示。

总结来说,通过MaxKB对接SQLBot的MCP服务,我们成功实现了单次对话中连续多次数据查询,以及复杂问题的智能拆解与执行,为营造探索式数据分析的流畅体验打下了基础。
这一方案适合需要深度数据钻取的业务场景,比如市场营销效果分析、产品用户行为分析、运营数据监控等。数据分析师不再需要反复重复提问,而是可以像与资深数据分析助手对话一样,自然流畅地完成整个数据分析的探索过程。
通过“MaxKB+SQLBot”的产品组合,我们可以突破传统智能问数系统的交互局限。通过MCP服务将SQLBot的问数能力“服务化”,结合MaxKB强大的工作流智能编排能力,让智能问数系统一次性完成多项问数任务。大家在构建数据智能系统时也可以尝试采用相同的思路,通过产品组件化的整合,为用户营造出强大的数据分析体验。