Enable ChatBI - 智能问数技能
Enable ChatBI 是 TIS 本体域的核心技能之一,它为已构建好的本体域开启自然语言查询能力,让不懂 SQL 的业务人员也能直接"对话式"地查询数据,快速获取业务洞察。

什么是 ChatBI
ChatBI(Chat-Based Business Intelligence)是"对话式商业智能",用户用日常语言提问,系统自动理解问题、生成 SQL、执行查询并返回结果。
传统方式 vs ChatBI:
| 传统方式 | ChatBI 方式 |
|---|---|
| 业务人员提需求 → 数据分析师写 SQL → 返回结果(耗时数小时) | 业务人员直接问:"上个月销售额是多少?" → 系统 2 秒返回结果 |
| 需要掌握 SQL 语法、表结构、字段命名 | 只需用自然语言描述业务问题 |
| 分析师成为瓶颈,请求排队等待 | 自助式查询,即问即答 |
工作原理(简化说明)
Enable ChatBI 技能在保存时会执行以下操作,为智能问数做好准备:
1. 构建语义图谱
系统将本体域中的所有元数据(ObjectType、Property、LinkType、Glossary 等)加载到图数据库(Neo4j)中,构建一张"语义知识图谱":
- 节点:每个 ObjectType、Property、Glossary 术语都是一个节点
- 边:LinkType 关系成为连接节点的边
- 属性:每个节点携带名称、描述、类型等信息
2. 生成语义向量索引
为每个本体实体生成 384 维的语义向量(Embedding),并构建向量索引(HNSW)。这使得系统能够快速找到与用户问题最相关的表和字段。
举例:
用户问"销售额",系统通过向量相似度搜索,快速召回:
orders.amount(订单金额列)order_items.unit_price(商品单价列)- Glossary 术语"总销售额" →
SUM(orders.amount)
3. 自然语言 → SQL 流程
当用户提问时:
- 语义检索:从图谱中召回与问题最相关的 ObjectType、Property、LinkType
- 上下文拼装:将召回结果序列化为结构化的 Prompt 上下文
- LLM 生成 SQL:大语言模型根据上下文和问题,生成候选 SQL
- 三层校验:
- 关键字白名单:只允许 SELECT/WITH 等只读语句,拒绝 DROP/DELETE
- AST 语法校验:解析 SQL 语法树,检查表名、列名是否存在于召回集中
- EXPLAIN 校验(可选):提交数据库验证 SQL 语义正确性(如函数签名、类型匹配)
- 执行并返回结果:校验通过后执行 SQL,返回结果表格

使用前提
启用 ChatBI 前,需要确保:
本体域已创建 ObjectType
至少导入一张表的元数据(通常从数据源批量导出)ObjectType 已绑定数据源
每个 ObjectType 必须指定来自哪个数据库(通过 DataSourceBinding 绑定)属性已配置语义角色(推荐)
为 Property 标注roleType(Identifier、Dimension、TimeDimension、Measure),帮助 LLM 理解字段用途:- Identifier:主键、唯一标识列
- Dimension:用于分组和筛选的维度(如城市、状态)
- TimeDimension:时间列(支持按日/周/月/季/年聚合)
- Measure:可聚合的度量(如金额、数量),需指定聚合函数(SUM/AVG/COUNT 等)
已配置 Glossary 业务术语(推荐)
将常见的业务口语化表达映射到本体实体,提升召回准确率:- 术语"客户" → ObjectType
customer - 术语"订单金额" → Property
orders.amount - 术语"总销售额" → 指标表达式
SUM(orders.amount)
- 术语"客户" → ObjectType
配置参数说明

在本体域详情页点击"Enable ChatBI"按钮后,需要配置以下核心参数:

1. LLM Provider(大语言模型)
选择用于生成 SQL 的大模型服务。不同模型在准确率、速度、成本上有差异:
| 推荐模型 | 适用场景 | 准确率 | 成本(每次查询) | 速度 |
|---|---|---|---|---|
| 🏆 通义千问 Max / GPT-4 | 生产环境,复杂查询 | 90-95% | ¥0.10-0.15 | 中等 |
| 💰 DeepSeek Chat / 通义千问 Plus | 性价比场景,中等复杂度 | 85-90% | ¥0.02-0.05 | 快 |
| ⚡ 通义千问 Turbo / GPT-3.5-turbo | 内部测试,简单查询 | 75-80% | ¥0.01-0.02 | 很快 |
注意:
- 不推荐使用代码类模型(如 DeepSeek Coder),它们擅长生成代码但不擅长理解业务语义
- 如果未配置 LLM Provider,需先在"系统管理 → LLM 配置"中添加
2. Top-K 种子数(检索配置)
控制语义检索阶段召回多少个"种子实体"(最相关的 ObjectType 和 Property)。
| 取值建议 | 适用场景 | Token 消耗 | 准确率 |
|---|---|---|---|
| 3-5 | 单表或 2 表 JOIN,简单聚合 | 2000-3000 | 适中 |
| 5-8(默认 5) | 3-4 表 JOIN,有复杂聚合 | 3000-5000 | 较高 |
| 8-10 | 5 表以上 JOIN,多层嵌套 | 5000-8000 | 高 |
权衡:
- 值越大 → 上下文越丰富(准确率↑)、但 Token 消耗增加(成本↑)、响应变慢(速度↓)
- 优化技巧:如果发现召回了很多无关的表,说明本体中存在命名混淆,应优化 Glossary 而不是提高此参数
3. EXPLAIN 校验(验证配置)
默认:启用
开启后,系统会在执行 SQL 前先运行 EXPLAIN <SQL> 命令,验证 SQL 的语义正确性。
作用:
- ✅ 拦截函数签名错误(如
DATEDIFF('year', col1, col2)在 Doris 中应为DATE_DIFF(col2, col1, 'year')) - ✅ 拦截类型不匹配(如对 VARCHAR 字段使用 SUM 聚合)
- ✅ 拦截表/列不存在错误(防止 LLM"幻觉"出不存在的字段)
代价:增加约 200-300ms 延迟(相当于总耗时的 5-10%)
建议:
- 生产环境强烈建议开启,保障查询质量
- 性能敏感场景且对准确率容忍度高时可关闭
4. Token 预算(检索配置)
默认:3000
限制 GraphRAG 序列化的 Prompt 上下文长度,防止超出大模型的上下文窗口。
超出预算时,系统会按相关性剪枝 ObjectType 和 Property,优先保留:
- 主键(pk)字段
- Measure 角色的度量字段
- TimeDimension 角色的时间字段
取值建议:
- 设为模型上下文窗口的 20-30%
- 例如:GPT-4 128K 窗口 → 建议 3000-5000;通义千问 32K 窗口 → 建议 2000-3000
- 如果经常遇到"token 预算不足"警告,可适当提高此值,或降低 Top-K 种子数
5. 重试次数(重试配置)
默认:2
SQL 校验失败时,允许重新调用 LLM 修正的次数。
场景:AST 校验或 EXPLAIN 校验失败时,系统会将错误信息反馈给 LLM,引导其修正 SQL。
建议:
- 保持默认值 2 即可(总共最多 3 次 LLM 调用)
- 过高会增加延迟和成本,过低会降低复杂查询的成功率
6. 查询超时(执行配置)
默认:30 秒
SQL 执行的超时时间,防止慢查询阻塞服务。
建议:
- 小型数据库(<1000 万行):30 秒
- 大型数据库(>1 亿行):60 秒
配置完成后,会显示"已成功开启 ChatBI 功能"提示。
使用步骤
步骤 1:进入本体域详情页
在 TIS 控制台,导航至"本体管理" → 点击目标本体域,进入详情页。

步骤 2:点击"Enable ChatBI"按钮
在详情页顶部工具栏找到"Enable ChatBI"按钮并点击。

点击”查看状态“后进入Chat-BI 状态控制台

步骤 5:开始智能问数
方式 A:TIS Web 控制台
- 在本体域详情页,点击"ChatBI 查询"标签页
- 在输入框中输入自然语言问题,例如:
- "2025 年各城市的销售总额排名前 10"
- "库存低于 100 的商品有哪些"
- "最近 7 天每天的新增用户数趋势"
- 点击"提交",等待 2-5 秒
- 查看结果:
- 生成的 SQL 语句(支持复制和编辑)
- 执行摘要(检索到的 ObjectType、LLM 调用耗时、SQL 执行耗时等)

方式 B:通过 MCP 协议接入专业 Agent
TIS 提供了标准的 MCP(Model Context Protocol)服务器,可以无缝接入 OpenClaw、Hermes 等专业 Agent 工具。
优势:
- 定时任务:配置每天定时执行固定的问数任务,并推送结果到邮件或 IM 工具
- 多轮对话:Agent 能理解上下文,支持追问和条件调整(如"把上一个查询改成按周统计")
- 专业渲染:利用 Agent 的图表组件自动渲染结果为可视化图表
- 混合能力:在同一个对话中结合 ChatBI 和 Agent 的其他技能(如文档检索、代码生成)
接入步骤:
在 TIS 中启动 MCP Server(通常在"系统管理 → MCP 配置")
在 OpenClaw 或 Hermes 中添加 MCP 服务器地址:
http://{tis_host}:8080/tjs/mcp通过自然语言调用 ChatBI 功能,例如:"使用chat_bi 工具:找出库存量高于平均水平的门店及其所在城市,显示门店名称、城市和总库存量"
注意前缀“使用chat_bi 工具:”不能少

常见问题
Q1:为什么生成的 SQL 不正确?
可能原因:
- 本体中缺少相关的 Glossary 术语,导致召回失败
- ObjectType 或 Property 的描述信息不够清晰
- 选择的 LLM 推理能力不足
解决方法:
- 补充 Glossary 业务术语,将常见口语化表达映射到本体实体
- 丰富 ObjectType 和 Property 的
description字段 - 尝试更换推理能力更强的模型(如 GPT-4、通义千问 Max)
Q2:查询速度慢怎么办?
可能原因:
- Top-K 种子数过大,导致上下文序列化耗时
- LLM 响应速度慢
- 数据库查询本身慢(数据量大、未建索引)
解决方法:
- 降低 Top-K 种子数(如从 8 降到 5)
- 选择响应更快的 LLM(如通义千问 Turbo)
- 在数据库侧优化查询性能(添加索引、分区)
Q3:如何控制成本?
ChatBI 的主要成本来自 LLM API 调用。控制成本的方法:
- 选择性价比高的模型:DeepSeek Chat、通义千问 Plus
- 降低 Top-K 种子数:减少上下文长度,降低 Token 消耗
- 关闭 EXPLAIN 校验(不推荐):可节省一次数据库调用,但可能降低准确率
- 设置查询频率限制:避免高频刷新
Q4:ChatBI 支持哪些类型的查询?
支持:
- 单表查询、多表 JOIN
- 聚合统计(SUM/AVG/COUNT/MAX/MIN)
- 分组聚合(GROUP BY)
- 时间维度切分(按日/周/月/季/年)
- 排序和 TOP-N
- 简单条件筛选(WHERE)
暂不支持:
- 子查询(部分支持)
- 窗口函数(部分支持)
- 自定义 UDF(需在 Glossary 中预定义)