1. 业务同学要个数为什么总要等两天数据需求排队这件事做过数据开发的人都懂。业务同学在群里问一句「上个月华东区的复购率是多少」看起来简单但背后要走完提需求、排期、写 SQL、跑数、截图回传这一整套流程。数据同学手上同时压着三五个看板改造和埋点治理一个取数需求从提出到拿到结果一两天算快的。问题不在于 SQL 难写而在于「翻译」成本高。业务同学脑子里想的是业务口径数据库里存的是表名和字段名中间这层映射过去靠人肉完成。LLM 出现之后大家自然想到能不能让模型来当这个翻译把自然语言直接转成 SQL查完再把结果用人话讲回来这就是 ChatBI 的核心思路。FastGPT 是一个开源的 LLM 应用构建平台你可以把它理解成一个搭 AI 应用的乐高工厂工作流编排、知识库、工具调用这些能力都是现成的。Apache Doris 则是实时分析型数据库里很能打的一位查询快、运维简单很多团队拿它当 BI 和即席查询的底座。把这两个接起来就能让 FastGPT 这个「大脑」去调用 Doris 这个「数据仓库」业务同学用自然语言提问模型生成 SQL、执行、再把结果整理成表格回传。这篇面向的是已经有 Doris 数仓、想用 LLM 做自然语言查询的团队。我会给出一条可复现的落地路径从连接配置、提示词结构到自然语言转 SQL、执行、结果回传的完整验证动作。全程不需要你手写复杂 SQL但每一步的配置和参数我都会写清楚方便你直接照着搭。2. 前置准备让 FastGPT 能摸到 Doris在动手之前先把两边的「地基」确认好。FastGPT 这边你需要有一个可以创建应用和工具集的账号云端版直接登录就能用私有化部署的版本确认工作流和工具调用功能是开着的。Doris 这边你需要一个具备查询权限的数据库账号并且确认 Doris 的 FE 查询端口默认 9030对 FastGPT 所在网络可达。这里有个容易被忽略的点FastGPT 和 Doris 之间需要一个「翻译官」来承接工具调用。FastGPT 的工具集支持 MCP 协议所以我们可以用一个 MCP Server 把 Doris 的查询能力暴露成标准工具FastGPT 解析之后就能自动拿到「查表列表」「查表结构」「执行 SQL」这些工具。如果你希望整个链路更稳定、模型调用和工具编排统一管理可以在 TaoToken 上先准备好模型接入。它的 API 地址是 https://taotoken.net/api模型对话、Coding Plan、控制台和 API Keys 都有对应的入口。对于这种需要频繁调用模型生成 SQL 的场景把模型接入统一到一个地方管理后面排查问题会省很多事。具体来说模型对话入口在 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite Coding Plan 在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 控制台在 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite API Keys 管理在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite ClaudeCodeAnthropic 相关配置在 https://taotoken.net/claudecode-anthropic?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 。先把 Key 拿到手后面配置模型时直接填。Doris 侧的准备清单可以对照下面这张表检查一遍检查项说明常见值FE 地址Doris 前端节点 IP 或域名10.16.10.6查询端口FE 的 MySQL 协议端口9030账号具备 SELECT 权限的账号root 或只读账号默认库希望默认操作的数据库ssb网络FastGPT 所在机器能否访问上述端口需实测 telnet确认这些之后就可以进入连接配置环节了。3. 可复制配置MCP Server 与 FastGPT 工具集3.1 启动 Doris MCP ServerMCP Server 的作用是把 Doris 的查询能力包装成 FastGPT 能识别的工具。先安装依赖pip install mcp-doris-server安装完成后用下面的命令启动服务。注意把 IP、端口、账号密码换成你自己的doris-mcp-server \ --transport http \ --host 0.0.0.0 \ --port 3000 \ --doris-host 10.16.10.6 \ --doris-port 9030 \ --doris-user root \ --doris-password 123456 \ --doris-database ssb参数逐个说明一下--transport http让服务通过 HTTP 协议提供方便 FastGPT 调用--host 0.0.0.0监听所有网络地址这样别的机器才能访问--port 3000是给这个服务开的端口后面几个--doris-*分别对应 Doris 的 FE 地址、查询端口、账号、密码和默认数据库。看到服务成功启动的日志后这个翻译官就正式上岗了。如果 FastGPT 和 MCP Server 不在同一个局域网内你需要给本地服务生成一个可公网访问的地址或者把 MCP Server 部署到 FastGPT 能访问的服务器上。3.2 在 FastGPT 里创建 MCP 工具集回到 FastGPT 界面在应用市场里新建一个 MCP 工具集名字可以叫Doris MCP Server。MCP 地址填http://你的MCP服务IP:3000/mcp点击解析FastGPT 会自动拉取所有可用工具。正常情况下你会看到类似get_db_table_list、get_table_schema、execute_sql这样的工具。确认创建即可。3.3 配置提示词结构工具集建好之后新建一个应用名字叫Doris ChatBI。最关键的一步是提示词。一个好的提示词要包含角色定义、核心能力、工具使用策略和输出格式约束。下面是我实测下来比较稳的结构# 角色 你是一名数据分析师负责把用户的自然语言问题转换成 Doris SQL 并执行最后用中文解释结果。 # 核心能力 1. 理解业务口径识别用户想查的指标、维度和时间范围。 2. 调用 get_db_table_list 查看有哪些表。 3. 调用 get_table_schema 查看目标表的字段和类型。 4. 调用 execute_sql 执行查询只允许 SELECT禁止任何写操作。 # 工具使用策略 - 不确定表名时先查表列表再查表结构最后写 SQL。 - 生成 SQL 前先确认字段名避免凭猜测写字段。 - 如果用户问题里的时间范围和实际数据范围不符要主动指出。 - 查询结果超过 50 行时只展示前 20 行并说明总数。 # 输出格式 - 先给出一句话结论。 - 再用 Markdown 表格展示关键数据。 - 最后附上本次执行的 SQL方便用户核对。这段提示词的核心是把「先看表、再看字段、最后写 SQL」这个顺序固化下来。很多自然语言转 SQL 失败不是因为模型不会写 SQL而是它不知道你的表里到底有什么字段凭猜测写出来的字段名对不上。配置好提示词后在应用的工具配置里选择团队添加刚才创建的Doris MCP Server工具集。模型选择上建议选一个指令遵循能力强的模型比如豆包或者 Claude 系列。到这里Doris 数据专家就准备好了。4. 验证请求从自然语言到结果回传配置完不验证等于没配。我们分两步来测先测基础信息查询再测复杂分析。4.1 基础查询库里有哪些表在对话框里输入查询 ssb 数据库中有哪些表预期行为是模型调用get_db_table_list返回 ssb 库里的所有表和视图。实测下来它不仅能列出表名还会根据 SSB 测试集的背景对每个表的用途做出推测比如lineorder是订单明细表、customer是客户维表。更贴心的是它会主动给出下一步建议引导你继续查表结构或做数据质量评估。这一步验证的是工具调用链路是否通。如果模型没有调用工具而是直接编造表名说明提示词里的工具使用策略没生效或者工具集没挂上。4.2 复杂分析销售趋势与增长速率再问一个需要多步推理的问题在 ssb 数据库中过去十年的销售趋势如何哪一年的增长速率最快这次模型会先查lineorder表的结构确认时间字段和金额字段然后发现数据范围只有 1992 到 1998 年。它会敏锐地指出这跟「过去十年」不符并对 1998 年数据可能不完整给出说明。基于已有数据它计算每年的销售额和同比增长率用表格展示并准确找出增长最快的年份。最后它还会主动给出进一步分析的 SQL 建议比如按季度聚合或者按商品类别分析销售额变化。这已经接近一个初级数据分析师的工作水平了。4.3 结果回传的格式控制如果你希望结果更规整可以在提示词里加一条约束所有查询结果必须包含三部分 1. 结论一句话回答用户问题。 2. 数据Markdown 表格列名用中文。 3. SQL本次执行的完整 SQL放在代码块里。这样业务同学拿到的不只是一堆数字而是「结论 数据 可核对 SQL」的完整包。数据同学看到 SQL 也能快速判断口径对不对。5. 本篇常见错排查落地过程中踩坑是常态下面这几个是我遇到过的典型问题按排查顺序列出来。工具解析失败看不到工具列表。先确认 MCP Server 是否正常启动用curl http://ip:3000/mcp看有没有响应。如果 FastGPT 和 MCP Server 不在同一网络检查防火墙和端口映射。MCP 地址格式必须是http://ip:port/mcp少写/mcp会解析不到。模型不调用工具直接编造答案。这是提示词问题。检查提示词里有没有明确写「必须先调用工具查看表结构再生成 SQL」。有些模型默认倾向于直接回答需要显式约束。另外确认工具集确实挂到了应用上而不是只创建了没关联。SQL 执行报字段不存在。说明模型没查表结构就写 SQL。在提示词里强化「生成 SQL 前必须调用 get_table_schema 确认字段名」。如果还是不行可以在工具使用策略里加一条「字段名不确定时先执行 DESC 表名 查看结构」。查询超时或返回数据量过大。Doris 对大结果集查询有内存限制。在提示词里限制「结果超过 50 行只展示前 20 行」同时在 MCP Server 侧可以加一个默认 LIMIT。对于分析类查询建议引导模型先聚合再返回。模型生成的 SQL 方言不对。Doris 兼容 MySQL 协议大部分 MySQL 语法能用但一些窗口函数和日期函数有差异。如果发现语法报错把报错信息回传给模型让它修正。提示词里可以加一句「Doris 兼容 MySQL 语法日期函数优先使用 date_trunc」。权限问题导致查询被拒。确认 Doris 账号有目标库的 SELECT 权限。生产环境建议单独建一个只读账号给 MCP Server 用不要直接用 root。这样即使模型生成了写操作 SQL也会被权限拦住。6. 把链路跑通之后还能往哪走到这一步一条从自然语言到 Doris 查询结果回传的链路就完整跑通了。业务同学在 FastGPT 对话框里用中文提问模型自动查表、写 SQL、执行、整理结果整个过程不需要人工介入写 SQL。如果你想让这条链路更稳有两个方向可以继续做。一是把常用查询沉淀成模板比如「月度复购率」「区域销售排名」这类高频问题在提示词里给出参考 SQL 结构减少模型自由发挥的空间。二是把模型接入统一管理通过 TaoToken 的 API 接入模型对话能力API 地址是 https://taotoken.net/api 这样模型调用、Key 管理、用量监控都在一个地方后面扩多个数据源或者多个应用时不会乱。对于需要长期跑编码和 Agent 任务的团队Coding Plan 入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 。先把这条 ChatBI 链路跑通再逐步扩展到数据质量校验、报表自动生成、异常归因这些场景路径是清晰的。