ChatBI实战:Agent编排、RAG知识库与指标平台如何落地智能问数
发布时间:2026/9/17 4:54:34 锦皓数字建站

简介《2024 ChatBIAgent实战手册八大案例共134页.pdf》是一份聚焦大模型驱动商业智能与智能代理落地的实战合集适合数据分析师、AI工程师及企业管理人员阅读。资源汇集平安人寿、滴滴、喜马拉雅、腾讯、快手、阿里巴巴、网易等企业的真实案例覆盖ChatBI产品设计、技术架构、SQL生成、对话式取数、数据分析自动化及AI Agent场景应用并给出具体的落地挑战与优化思路。全文134页共1个PDF文件压缩包约9.33MB阅读轻便可按企业章节顺序浏览也可直接检索所需场景。截至当前已有432人学习内容兼具行业广度和技术深度。读者既能从中了解头部企业如何搭建ChatBI体系、解决数据质量与模型调优难题也可借鉴其跨部门协作经验文档对ChatBI发展现状、未来趋势及模型调优关键作用的总结更可为自身企业决策支持、智能BI或Agent项目提供直接参考。1. 为什么 ChatBI 不是“给 BI 加个聊天框”传统 BI 的痛点不在“没有图表”而在指标口径不统一、取数要走工单、分析结论靠人工拍脑袋。把大模型接进 BI 之后最容易被低估的难题也不是“自然语言转 SQL”而是如何在多轮对话里稳定锁住指标、时间、维度和权限。平安人寿在手册中给出的方案是反直觉的大模型只做语义理解SQL 生成交给底层指标平台和 API 服务完成。这个取舍让 ChatBI 从演示 Demo 变成了生产环境里的高频工具。适合数据分析师、数据平台工程师和正在做 Agent 开发的团队参考尤其是已经建了数据中台但取数效率仍偏低的公司。2. ChatBI 的总体架构BI 3.0 的四层拆解与 Agent 编排设计2.1 从数据中台到应用层的四层架构手册里平安人寿的实践可以分成四层来理解。最底层是数据中台负责沉淀数据域和上万个规范指标往上一层是平台层集成了 API 服务、知识管理、大模型、Cube 和 GS 平台以及北斗可视化平台再往上是 Agent 层分成问数、分析、数据解读、公共能力四类最上层是应用层对外体现为 What、Why、How 三种能力。What 是对话式取数把数据获取时间从天级压到秒级Why 是用大模型做根因分析、维度分析替代人工推导原因How 是在洞察之后直接给出建议相当于“开药方”。这四层不是简单的一层层调用。平台层把知识管理和大模型并列说明 RAG 检索不是挂在某个模块后面的附件而是和模型推理同等重要的基础设施。Agent 层拆成四类则是为了把一次用户提问拆成可复用的小任务问数 Agent 负责取数分析 Agent 负责下钻归因数据解读 Agent 负责把查询结果翻译成人话公共能力 Agent 统一处理鉴权、指标推荐和元数据查询。这样拆的收益是后面接入新场景时不需要重写整个链路只要替换其中一两个子 Agent。2.1.1 一个最小可用的 Agent 编排配置下面这个 JSON 是常见做法中的最小编排配置手工把四类 Agent 的职责写清楚方便在团队里对齐边界{ agent_id: chatbi_v1, intent_agents: [query_agent, analysis_agent], support_agents: [data_interpret_agent, common_agent], common_agent_capabilities: [um_auth, metric_recommend, metadata_query], model: { llm: qwen-72b-private, temperature: 0.2, top_p: 0.8 }, knowledge_base: { common: [metric_name, sql_syntax], advanced: [insurance_terms, same_period_terms, sql_rules] } }逻辑说明intent_agents是面向用户主问题的 Agent 组成员support_agents是结果加工与兜底用的支持节点。common_agent_capabilities列举了公共能力um_auth是账号鉴权metric_recommend负责在用户没讲清指标时做推荐metadata_query对应“言出必答”这类元数据问答。knowledge_base把手册中提到的常见知识库和进阶知识库分开便于后面接不同的检索源。参数上temperature和top_p都调低是为了减少大模型在指标名和时间条件上的自由发挥私有化部署的qwen-72b-private对应平安人寿提到的 Qwen 72B 微调模型。提示Agent 层的四类划分不是固定答案。如果团队只做报表查询可以先只上问数 Agent 加公共能力 Agent分析类 Agent 等指标图谱成熟后再接。2.2 RAG 知识库决定语义解析准确率的底座手册里把知识库工作称为“开发过程中最重要的工作之一”。平安人寿用的两层知识库结构很值得参考常见知识库存常见名词和 SQL 语法进阶知识库存垂直领域内容比如 BI 术语里的同比、环比、累计保险行业名词以及 SQL 编写规范。大模型在做语义解析后会先检索知识库再用检索结果做二次校准然后才进入任务编排。这个顺序保证了同一个词在不同业务域里能命中正确的口径。下面用一张表看知识库的分层与作用知识库层级存放内容在链路中的作用常见知识库指标名词、SQL 基础语法、通用问法模板提高语义解析准确性让模型先“读懂问题”进阶知识库BI同比、环比、累计等计算口径保证生成的查询条件符合业务语义进阶知识库SQLSQL 编写规范、字段映射规则约束查询代码风格减少无效查询业务知识库保险等行业专属名词支撑跨域问答避免字段名歧义表格的价值在于上线新业务域时先确认口径落在哪一层再决定是否需要新增检索源。知识库的丰富度与语义解析和结果生成的准确性直接相关这是手册中反复提到的一点。我这里补一个简化版的 RAG 检索函数用来演示“向量召回—阈值过滤—组装上下文”的过程import numpy as np from typing import List def rag_retrieve(query: str, vector_store, top_k: int 3) - List[str]: # 1. 把用户问题编码成向量 query_vec embed(query) # 2. 从知识库召回 top_k 最相似的片段 hit_scores vector_store.search(query_vec, ktop_k) # 3. 按相似度过滤低于阈值的片段不送入 prompt valid_hits [doc for doc, score in hit_scores if score 0.75] return valid_hits逻辑说明第一步生成用户问题的向量表示第二步用向量库召回最相近的知识片段第三步按相似度阈值过滤避免把不相关的内容塞给大模型。top_k通常取 3 到 5太小容易漏口径太大会把噪声带进上下文阈值 0.75 是实践中的起步值需要根据自己的 bad case 集去调。3. 对话式问数的实现链路意图识别、任务编排与权限鉴权3.1 一次 ChatBI 请求的完整流程手册里的业务流程图可以拆成七步用户提问、BI 大模型语义理解、知识库二次校准、任务编排、UM 鉴权、SQL 生成并查询 Doris、可视化组装。整条链路会多次与大模型交互而不是一次生成回答就结束。第一步从问题里摘出时间、指标、计算方法、维度四类信息第二步用知识库校准防止模型把“累计保费”理解成“当月保费”第三步的鉴权发生在任务执行前确保用户对指标有权限避免越权取数。这里用 curl 示例模拟“意图识别 参数抽取”这一步的接口调用生产环境通常封装成内部服务请求头里的鉴权先省略curl -s -X POST http://chatbi-internal/parse_intent \ -H Content-Type: application/json \ -d { query: 帮我查一下上海机构本月业绩按团队排序, knowledge_base: advanced, strict_mode: true }这条命令传入了用户原始问题、知识库层级和严格模式开关目标是拿到结构化的查询参数。接口返回的常见格式如下{ metric: premium_income, dimensions: [organization, team], time_range: 2024-07-01~2024-07-31, sort: {dimension: team, order: desc}, missing_info: [] }参数说明metric映射到数据中台的指标 IDdimensions决定后续 group by 的字段time_range由“本月”解析出自然月边界sort由“按团队排序”推导得到。missing_info为空表示信息完整如果非空任务编排层会返回追问或使用手册中提到的兜底话术补齐默认时间比如用户只说了“业绩”没给时间就默认查最近一个完整月份。3.2 为什么让指标平台生成 SQL而不是让大模型直接写 SQL这是手册问答环节里最值得留意的一个决策。平安人寿的嘉宾明确说早期尝试过让大模型直接生成 SQL但实现路径和精准度提升较慢难度较高所以最终采用现有指标平台大模型只做语义理解之后通过 API 方式和 NLP 技术生成代码底层数据服务中台负责快速生成数据查询。这个决策的本质是把口径治理前置到数据中台换来查询可靠性和权限可控性。一个典型的数据查询 SQL 模板可以这样写SELECT org_name, team_name, SUM(metric_value) AS premium_income FROM dwd_metric_agg WHERE metric_id ${metric} AND stat_date BETWEEN ${start_date} AND ${end_date} AND ${permission_filter} GROUP BY org_name, team_name ORDER BY premium_income DESC说明${metric}、${start_date}、${end_date}由上一节的结构化参数填充${permission_filter}由权限服务注入。metric_id必须是数据中台里的规范指标 ID而不是让大模型自由生成的列名。这样做的好处是即使大模型把“业绩”理解成另一个指标最终执行的 SQL 仍然落在白名单之内。3.3 鉴权前置从行级权限到列级权限手册提到平安人寿的权限管理已经从早期的行级别权限服务进化到列级别权限管理后者更细致和安全。底层有一个权限服务每次用户调用时都会做鉴权检查确保用户和指标的权限范围已经预设好。对应到 Agent 设计里我会把鉴权放在资源请求之前而不是在结果返回之前这样即使模型生成了非法查询也会在真正执行前被拦截。下面是一个简化的权限校验伪代码def check_permission(user_id: str, metric_id: str, columns: list) - bool: # 查到该用户在该指标上的列权限清单 allowed_cols permission_service.get_user_metric_columns(user_id, metric_id) # 请求涉及的列必须在允许清单内 return set(columns).issubset(set(allowed_cols))参数说明get_user_metric_columns返回当前用户对这个指标可见的列集合只要请求涉及的列全部落在集合内才允许继续执行。如果校验失败建议返回“请联系数据治理团队申请指标权限”而不是把内部堆栈抛给用户。4. 幻觉治理、根因分析与指标图谱落地中最难的三件事4.1 bad case 闭环幻觉治理没有捷径手册把幻觉问题放在挑战第一位。同一个问题出现不同回答背后往往不是模型参数问题而是指标口径没有被知识库约束住。平安人寿的做法是不断收集 bad case已经分析了十几轮、上千个并在意图识别里加入各种知识产品端设置点赞按钮运营人员对点赞问题逐个分析。他们得出的结论是通过知识库和数据中台的维护来解决问题而不是调整一两个参数就能解决。比较实用的做法是搭一个 bad case 回归表每次模型或知识库变更后跑一遍格式可以这样设计用户问题期望结果实际结果根因修复动作上月个险新单保费个险渠道新单保费按月份聚合返回当月总保费指标口径缺失在业务知识库补充“新单”“个险”映射上海机构的业绩上海机构维度的业绩详情返回全国汇总维度识别失败增加组织机构维度名的同义词哪个团队环比增长最多按环比口径排序的团队列表返回绝对值排序计算口径未识别把“环比增长”加入 BI 术语知识库并绑定 sort 参数这张表要和点赞/点踩数据一起看。点赞功能不只是产品交互它是 bad case 的来源也是判断修复是否生效的依据。每次更新模型后优先看这些案例有没有从“失败”变“通过”。4.2 根因分析从单指标查询到指标图谱手册里把根因分析称为最难的问题。当指标变动时需要判断是哪个维度、哪个关联指标导致的变化这要求在后台有大量的指标图谱和知识库支撑。方向是把指标之间的勾稽关系和相关性整理成知识图谱一个指标可能受多个指标影响包括显性的和隐性的还要考虑时间滞后性。平安人寿把图谱直接放在数据库里作为一个服务通过接口调用并用图算法计算指标之间的隐性关系。实际工程中我会先把指标间的相关性计算出来生成边列表再灌入图数据库或关系表。下面是一个简化的指标相关性计算片段import pandas as pd from scipy.stats import pearsonr def build_metric_edges(metric_df: pd.DataFrame, metric_pairs: list) - list: edges [] for m1, m2 in metric_pairs: # 计算两个指标时间序列的相关系数 corr, p_value pearsonr(metric_df[m1], metric_df[m2]) # 相关系数超过阈值且显著则记为一条隐性关系边 if abs(corr) 0.8 and p_value 0.05: edges.append({source: m1, target: m2, corr: round(corr, 3)}) return edges说明metric_df是多个指标按时间对齐的宽表metric_pairs是需要考察的指标对列表。相关系数高于 0.8 且 p 值小于 0.05 时认为两个指标存在强相关可以作为指标图谱中的隐性边。实际场景里要考虑时间滞后性可以先用shift平移目标序列再重新计算相关性。4.3 数据治理和 API 化是 Agent 的隐形前提手册里平安人寿能快速落地 ChatBI离不开几个前置条件完善的数据中台、长期数据治理形成的上万个规范指标、丰富的可视化组件以及数据服务的 API 化。换句话说ChatBI 的进度更多被这些工程基础决定而不是大模型本身。如果团队还没有统一指标字典就直接上 Agent大模型会在指标映射上反复出错bad case 很难收敛。注意ChatBI 上线前的第一优先级不是选模型而是确认指标口径是否有唯一负责人。口径不统一时先补数据治理再谈 Agent 编排。5. 八大案例的共性ChatBI 与 Agent 在不同业务里的同一套骨架5.1 从平安人寿到滴滴ABI 演进中的同一条主线这本手册覆盖了平安人寿、滴滴、喜马拉雅、腾讯、豆包 MarsCode、快手、阿里巴巴和网易伏羲八个案例。前几家公司的场景都围绕“BI 大模型”展开但切入点不同平安人寿强调报表查询秒级化和根因分析滴滴从 ABI 方向演进探索智能数据分析的前沿与应用快手在分析领域做 BIAI 探索。它们的共同主线是先把指标治理好再用 RAG 知识库约束大模型最后用 Agent 编排把查询、分析、解读串起来。5.2 喜马拉雅与腾讯工程底座和多轮对话设计喜马拉雅和腾讯的案例更多在讲 ABI 工程化和平台化。喜马拉雅基于大模型做 ChatBI 实践探索腾讯在 ABI 工程领域探索与实践。工程化的重点通常落在三个地方一是多轮对话的上下文管理避免用户问了“上海”再问“那北京呢”时丢失主语二是查询性能把秒级返回从演示环境推向生产环境三是可视化组件复用让返回数据能自动选择合适的图表。这里我一般会用上下文状态对象保存每轮已确认的指标和维度作为 agent 记忆里最基础的一种形式class ChatContext: def __init__(self): self.metric None self.dimensions [] self.time_range None def update_from_utterance(self, parsed: dict): # 新一轮解析结果覆盖当前上下文 if parsed.get(metric): self.metric parsed[metric] if parsed.get(dimensions): self.dimensions parsed[dimensions] if parsed.get(time_range): self.time_range parsed[time_range]说明update_from_utterance只覆盖新出现的字段没提到就沿用上一轮的默认值。这个设计能避免大模型在多轮对话中反复猜同一个参数同时让后续 Agent 拿到稳定的查询条件。生产环境还会给上下文加时间戳超过 5 轮就压缩成摘要防止 token 膨胀。5.3 阿里巴巴、网易伏羲与豆包 MarsCodeAgent 走出 BI 的边界阿里巴巴的数据消费场景 AI Agent、网易伏羲的实时语音交互游戏队友、豆包 MarsCode 的编程助手 Agent这三个案例已经超出传统 BI 的范围。它们的共同特点是 Agent 需要调用外部工具并感知环境数据消费 Agent 要打通不同数据产品编程助手 Agent 要读写代码文件游戏 AI Agent 要做实时语音交互。尽管场景不同Agent 骨架仍然可以沿用“意图识别—工具调用—结果校验”这条链路。下面这张表是我对手册整体案例的观察整理方便快速对比使用案例业务场景Agent 侧重点对数据平台的要求平安人寿智能报表、根因分析问数、分析、解读 Agent数据中台、指标治理、API 化滴滴ABI 演进与探索分析 Agent、语义解析统一查询服务喜马拉雅大模型 ChatBI 实践多轮对话与知识库内容数据字典腾讯ABI 工程化工程底座与工具链查询性能、可视化组件豆包 MarsCode编程助手代码生成与执行 Agent代码仓库与沙箱环境快手分析领域 BIAI分析与推荐指标平台阿里巴巴数据消费场景AI Agent 编排数据产品间打通网易伏羲实时语音交互游戏队友实时交互 Agent低延迟链路复制案例时不是照搬某一家的架构而是先找到自己的业务属于哪一列。如果做内部报表重点参考前五行如果是外部交互或代码生成重点看后三行。手册的价值不在于让你抄一套答案而在于给出不同边界条件下 Agent 设计的选择依据。6. 从手册到实战ChatBI Agent 的参数、验证与上线技巧6.1 参数初始化与回归验证按手册里的案例做第一版时我会直接把大模型参数设为低随机性temperature用 0.1 到 0.2top_p用 0.8 左右max_tokens给足到能容纳完整 SQL 和解释文本。知识库检索top_k从 3 开始相似度阈值从 0.75 开始然后跑一批问法看漏召回。多轮对话上下文轮数限制在 5 轮以内超过就把最早一轮压缩成摘要避免上下文膨胀影响后续意图识别。回归验证脚本可以这样写def validate_regression(question_set: list, parse_func, golden: dict) - dict: metric_ok, intent_ok 0, 0 for q in question_set: pred parse_func(q) if pred[metric] golden[q][metric]: metric_ok 1 if pred[intent] golden[q][intent]: intent_ok 1 return { metric_accuracy: metric_ok / len(question_set), intent_accuracy: intent_ok / len(question_set), sample_size: len(question_set) }说明question_set是提前维护的 50 到 100 条问法golden是人工标注的期望指标和意图。每次模型或知识库更新后执行一次指标准确率低于 90% 时先不发布而是回到 bad case 表里看哪些问法挂了。这个脚本比人工点几个问题更能暴露回归。6.2 上线前先拦住三类问题第一类是字段映射错误修复方式是把“新单”“续期”“个险”“团险”这类词在知识库里的映射维护成表格每次新指标上线时同步刷新。第二类是权限漏检试运行阶段要把权限校验结果单独打日志每天比对一次越权拦截量确认没有绕过路径。第三类是查询超时在 Doris 这类 OLAP 引擎上先把 group by 维度和时间范围限制住再考虑加缓存。我一般会在 Agent 服务里加一个 dry_run 开关让它返回最终要执行的 SQL 和权限过滤条件方便在 UI 上做人工核对后再放量。本文还有配套的精品资源点击获取
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。