如果你现在正用AI做数据分析,大概率碰到过这样的场景:同一个模型,别人能半小时产出一份像样的销售复盘,你却只能得到一段正确的废话。差别往往不在模型本身,而在MCP、Skill、Agent、Prompt这四个词上。它们不是四个炫技名词,而是现代AI辅助数据分析的四块地基,哪一块没弄明白,AI用起来就发飘。这篇文章我把它们逐个拆开,结合我搭建数据分析AI助手的经历,说清楚每个概念到底是什么、怎么配合、怎么用,并给出能直接上手的模板和避坑方法。适合有一点数据分析基础、又想把AI真正用进日常工作的人。
1. 四个概念的关系定位:AI能力的四层骨架
1.1 从一次实际需求看四者的分工
设想一个很常见的需求:某零售门店要做上周销售日报。传统做法是你打开数据库,写SQL拉取数据,再拖到表格里做透视,最后码字总结。如果用AI辅助,全流程大概长这样:先给模型一段明确指令(Prompt),告诉它“你是分析师,任务是对比上周与前四周的销售趋势,输出一个结论和三个原因假设”;模型发现自己需要读销售明细数据,于是通过MCP连接数据库查询接口,拉取指定表;拿到数据后,模型调用一个事先封装好的“趋势分析技能”(Skill),来完成同环比计算、波动识别、异常过滤;最后,模型统筹整个流程——先查数、再清洗、后分析、最后排版出报告,这个统筹动作就是Agent在发挥作用。
这里有个值得细说的点:很多初学者把Agent当成“模型自己变大变强”,其实并不准确。Agent更像是一个调度器,它负责把大任务拆成子任务,决定下一步调用谁、何时结束、结果要不要重新处理。没有Agent,模型只能一次回答一个问题,哪怕你把所有步骤都写进Prompt,它也只能在文本层面模拟过程,无法真正触发数据库查询和代码运行;有了Agent,它才能连续工作,像一个人一样把查询、分析、汇总串起来,遇到中间结果异常还能自动调整下一步。所以,这四个概念不是同一个维度的东西,而是分层配合的关系。
1.2 四个概念的快速定义与对照
如果要用一句话定义这四个词,我的理解是这样的:
- Prompt:人与模型之间的指令文本。作用是告诉模型“做什么、怎么做”。
- Skill:一个可复用的能力模块。可以由提示词、代码片段、规则校验等组成,作用是让模型复用成熟的分析方法。
- Agent:一个能自主规划、调用外部工具、根据反馈调整行动的执行体。作用是承担多步骤流程的调度与决策。
- MCP:模型与外部工具、数据源之间的标准化连接协议。作用是让模型能稳定地“碰”到数据库、文件、接口等外部资源。
我把它们之间的关系整理成一张表,便于查阅。
| 概念 | 本质 | 解决什么问题 | 在数据分析中的角色 |
|---|---|---|---|
| Prompt | 指令 | 让输出更贴合需求 | 把模糊想法变成清晰指令 |
| Skill | 方法 | 让流程可复用 | 把分析套路固化成模块 |
| Agent | 执行体 | 让多步任务自动运行 | 当流程总指挥 |
| MCP | 连接协议 | 让模型拿到真实数据 | 打通数据和工具之间的路 |
注意:这四个概念在实践中经常同时出现,但层级完全不同。理解层级比记住定义更重要。
1.3 为什么是“分层协作”而不是“四选一”
我见过不少朋友试图用“一个概念”解决所有问题。比如只优化Prompt,希望模型自己套公式做分析;或者只引入Agent,以为它会在没有数据和工具的情况下凭空产生结果。这样都走不通。实际上,这四个概念是分工协作的:Prompt是“说清楚”,Skill是“会方法”,Agent是“能调度”,MCP是“有路可走”。四者配合,AI才能完成一次真实的数据分析工作。
用一个生活类比来说:Prompt就像你给团队下达的工作指令,Skill是团队成员各自的专业技能,Agent是那个拆解任务、安排干活顺序的项目经理,MCP则是办公楼的接口——门禁、网络、工位。指令再清晰、团队再能干、经理再勤快,如果办公楼不通水不通电,活照样干不成。后面我会按“指令层→方法层→调度层→连接层”的顺序逐个深入,先从最基础的Prompt讲起,因为这是门槛最低、也最容易马上改善效果的一层。
2. Prompt:把分析需求说清楚的第一关
2.1 数据分析Prompt的四要素
对于数据分析场景,我认为一个高质量Prompt要包含四个要素:角色、任务、上下文、约束。
角色设定不是煽情,而是为了触发模型的专业模式。给模型设定“资深数据分析师”的角色,等于告诉它从分析视角组织语言,多用指标、趋势、归因而非空泛评价。任务描述要使用动作明确的动词,比如“计算”“对比”“筛选”“列出前5条”,避免使用“分析一下”“看看”这种模糊表述。上下文是让模型不要凭想象推断数据,最好把字段名、数据类型、时间范围、样本条数写清楚,甚至是几行样例数据。约束则决定输出的可用性,包括输出格式、长度限制、是否给出置信度、如何处理无效数据等。
四个要素里,最容易漏掉的是约束。很多人只写了角色和任务,结果模型输出很漂亮,但格式完全没法用,或者结论没有支撑数据,最后还得手动返工。与其让模型先回答再修改,不如一开始就把约束写死。
2.2 可直接套用的Prompt模板
下面这个模板,我每次做销售或用户行为分析都会基于它调整,基本能应对大多数场景:
角色:你是资深数据分析师,擅长指标体系设计与业务归因。 任务:基于下表数据,完成以下分析: 1. 计算2025年6月销售额环比与同比; 2. 按商品品类拆解销售额变化,找出Top3增长和Top3下降的品类; 3. 给出下降品类的3条可能原因,并按数据支撑程度排序。 数据说明: 表名:sales_records 字段:order_id, date, region, category, revenue, quantity 时间范围:2025年1月1日至2025年6月30日 样例: order_id="A1001", date="2025-06-01", region="华东", category="数码", revenue=1299.0, quantity=3 约束: - 按周粒度计算,周定义为周一到周日; - 金额保留2位小数,增长率用百分比展示; - 不能假设表中不存在的数据,例如客单价或毛利; - 最终输出格式:一段总结(200字内)+ 一张汇总表 + 归因列表。这里的关键是“数据说明”和“约束”。有了字段结构和样例,模型才知道应该读哪些列,不会自己虚构“毛利率”之类字段;有了约束,它才知道什么叫“可用输出”。我通常还会在任务里加一句“先看懂表,再写结果”,让它在复杂数据下不至于一上来就盲答。这个模板看起来简单,但实际用下来,效果比那些几十行但全是套话的Prompt稳定得多。
2.3 三种高频失败模式与修正思路
第一种:没有上下文,模型凭常识编数据。比如直接问“帮我分析一下销售情况”,模型可能给出“建议提高客单价、增加复购”这种万金油回答。修正方法很简单:把数据表和字段丢进去,让模型基于真实数据说话。
第二种:任务太宽泛,输出没有焦点。比如问“分析用户流失原因”,模型会列出十几条原因,每条都很浅。修正思路是拆小任务,一次只问一个核心问题,例如“对比流失用户与活跃用户的访问频率、订单金额差异,选出差异最大的3个特征”。
第三种:约束缺失,输出无法落地。比如没有指定输出格式和指标口径,模型会给出“约、左右、明显提升”这类模糊描述。修正方向是把“明显提升”改成“提升幅度超过10%且连续两周”,把“列几条”改成“列出Top3”。Prompt调整通常能解决模型输出质量问题,但解决不了“每次都重新写一遍”的重复劳动。当同一个分析逻辑要在多个项目里反复使用时,就该进入下一层:把方法和流程封装成Skill。
3. Skill:让分析流程能复用、可沉淀
3.1 Skill在数据分析中的真实形态
Skill这个词在不同框架里叫法不同,有人叫“技能”,有人叫“工具包”,有人叫“插件”,本质上都是一回事:把完成某一类任务的方法、规则、代码、校验逻辑打包成模块,供模型或Agent反复调用。
在数据分析中,一个Skill通常包含五部分:触发条件(什么需求下启用)、输入参数(需要哪些数据或字段)、处理逻辑(具体步骤、公式、阈值)、输出规范(结果以什么格式返回)、错误处理(数据缺失或异常时怎么办)。与Prompt相比,Skill最大的优势是稳定性。Prompt每次都要模型现场即兴发挥,哪怕措辞稍有变化,结果就可能不一样;Skill把步骤写死,输入同样的数据、大概率得到同样的结果。
我自己最常用的一个Skill是“口径校验”。每次在做跨周对比前,先跑一遍这个Skill,检查日期字段、销售额单位、是否有退货单混入。这听起来很简单,但恰恰是这些琐碎校验,决定了后续分析可信不可信。没有这层校验,模型再聪明也容易拿脏数据算出一套漂亮但错误的结论。
3.2 手把手封装一个异常检测Skill
我以“异常检测Skill”为例,演示完整封装思路。这个Skill的目标是:给定某个业务指标的时间序列,自动识别出异常波动点,并输出候选原因分析的入口数据。
输入参数可以这样设计:
- metric_series:指标序列,格式为“日期、数值”列表;
- granularity:时间粒度,默认day;
- method:检测方法,支持zscore(均值±3σ)和iqr(四分位距法);
- threshold:判定阈值,zscore默认3,iqr默认1.5倍。
处理逻辑分两步。第一步是预处理:补全缺失日期,剔除负值或空值;第二步是计算异常:zscore方法先计算序列的均值与标准差,再将每个点转化为z分数,超过阈值就标记为异常。iqr方法则计算Q1、Q3和四分位距IQR,把小于Q1-1.5乘IQR或大于Q3+1.5乘IQR的点标记为异常。为什么两种方法都要保留?zscore对正态分布效果理想,但业务数据往往有偏态,比如周末销售额天然偏低,直接算zscore可能把每个周六都标成异常;iqr对偏态更稳健,适合把真实异常从周期波动中分离出来。
输出规范可以定义为:返回异常点列表,包含日期、实际值、预测基线、偏离程度,以及一句结论。比如:“2025年6月12日销售额为3.2万,偏离近30日均值1.1万,属于上行异常,建议核对是否有多渠道投放或大额订单。”
这里我补充一个实操心得:Skill里的阈值不要写死,尽量做成参数。我在实际使用中发现,不同业务线的数据分布差异很大,同一套阈值换一个部门就失效。把阈值外置,让调用方决定,能大幅提高Skill的复用率。
3.3 什么时候该把Prompt升级成Skill
一个简单判断:如果一段Prompt被你在不同项目里复制粘贴超过三次,就值得把它升级成Skill。判断标准包括:流程是否固定、逻辑是否需要校验、结果是否要求稳定。如果三个都满足了,别犹豫,直接封装。
还有一个容易混淆的点:Skill不一定要和代码绑定。最简单的Skill,可以只是一段带有变量占位符的Prompt模板,加上一段输出格式校验文本。我在项目初期就经常这么干,把高频分析模板里的变量抽出来,比如日期范围、品类、阈值,然后做成一个JSON结构的输入参数,模型每次只填参数就能复用整套分析套路。等你需要精确计算或外部调用时,再把Python函数、SQL查询塞进去。先做成文字版Skill,再逐步升级成代码版Skill,是我觉得最平滑、也最稳妥的路径。很多人一上来就写复杂函数,结果数据结构稍微一变就崩,反而被代码束缚住了。
4. Agent:把多步分析串成自动流程
4.1 一个Agent的核心工作循环
Agent真正厉害的地方,在于它可以把一次大任务拆成多个小步骤,并且边做边判断。最核心的工作循环可以概括为:规划、调用、执行、反馈。规划指Agent把用户目标拆解为若干子任务,例如“取数→清洗→计算→出报告”;调用指它决定每个子任务由谁来完成,可能是某个Skill,也可能是MCP连接的外部工具;执行指Skill和工具真正运行并返回结果;反馈指Agent看到结果后判断是否达到目标,如果结果有问题,它可能调整计划重新执行。
这个循环和我们平时做分析的思考过程是同构的。你接到需求后,先想清楚分几步,然后边看数据边调整下一步该做什么。Agent只是把这个过程自动化了。在数据分析场景里,Agent带来的最大改变是“多步闭环”:以前模型只能回答“怎么分析”,现在它能真正完成分析本身,包括读写文件、执行SQL、生成图表。换句话说,Agent是把Prompt、Skill、MCP这几层能力组织起来的那个大脑。
4.2 设计一个经营日报自动生成Agent
下面是我在一次模拟项目中用过的设计,目标是让它每天自动输出一份经营日报。
Agent收到指令后,先用规划能力把任务分解成五步:连接数据库取数、清洗数据并计算核心指标、调用趋势分析Skill识别异常点、生成可视化图表、汇总成日报文本。每一步都对应一个可执行单元。取数和可视化通过MCP连接,计算和异常检测通过Skill完成,最后文本总结通过Prompt模板生成。整体流程可以用下面这段伪代码近似表达:
task = "生成昨日经营日报" steps = agent.plan(task) # steps = ["query_sales", "clean_data", "calc_metric", # "detect_anomaly", "render_report"] for step in steps: if step == "query_sales": data = mcp.call("database", sql="SELECT * FROM sales WHERE date='2025-06-12'") elif step == "clean_data": data = skill.run("data_clean", input=data) elif step == "calc_metric": metrics = skill.run("metric_calc", input=data) elif step == "detect_anomaly": anomaly = skill.run("anomaly_detect", input=metrics) else: report = prompt.render("daily_report", metrics=metrics, anomaly=anomaly) print(report)这段代码没有具体框架,但体现了一个原则:Agent负责安排“做什么”,Skill负责“怎么做”,MCP负责“去哪里拿数据”。三者各司其职,整个流程才不会乱。
设计时有一个常见误区:希望Agent一步到位完成所有事,结果任务描述太复杂,Agent在第一步就乱了。我的经验是先设计好一个线性流程,固定步骤顺序,等跑稳了再允许Agent自己增删步骤。另外,一定要给Agent设置最大步数和终止条件,否则遇到异常数据,它可能反复重试同一个步骤,白白消耗大量调用额度。
4.3 多Agent协作的适用边界与代价
遇到更复杂的任务,比如“先抓取外部数据、再清洗分析、最后生成报告”,可以考虑多个Agent分工:数据采集Agent、分析Agent、报告Agent。每个Agent只负责一段,通过消息传递衔接。
但多Agent不是银弹,它带来三个代价:上下文传递丢失、循环调用难以终止、调试难度上升。上下文传递丢失体现在分析Agent拿到的数据可能是采集Agent截断后的残缺版本;循环调用体现在某个Agent反复执行同一个失败步骤,浪费大量资源;调试难度上升则是因为问题可能发生在任何一个Agent的接口上。所以我的建议是:能用单Agent解决的,不要为了架构好看硬拆成多Agent。拆之前先确认每个子任务确实有独立的输入输出和验收标准。
5. MCP:让大模型真正“摸得到”数据
5.1 MCP解决了什么问题
MCP的全称是Model Context Protocol,即模型上下文协议。它的目标很直接:让大模型与外部数据源、工具之间的连接方式标准化。
在没有MCP这类协议之前,想让模型调用数据库、文件或内部接口,每个工具都要单独写一套适配代码。模型每适配一个新数据源,工期短则一天,长则一周,而且所有能力都绑在具体业务里,换个项目就要重来。MCP出现后,把“模型如何调用工具”抽象成了一套通用规范:一端是MCP客户端,一端是MCP服务器,客户端负责把模型的请求翻译成标准格式,服务器负责对接具体的数据或工具,再把结果翻译回来。
这个思路很像USB接口:以前不同设备接口各不相同,如今大家共用同一个口,设备即插即用。MCP要做的,就是让AI应用和数据源之间也出现这样一个标准化接口,降低接入成本,同时让能力可迁移、可复用。
注意:MCP不是模型自身的能力,而是外部连接层的规范。所以在实际项目中,你需要有一个能执行这些连接的运行环境,并明确哪些数据资源可以被MCP暴露给模型。
5.2 数据分析中三种典型的MCP接入方式
在数据分析项目里,最常见的MCP接入有三类。
第一类是数据库查询。MCP服务器连接数据仓库,模型直接发送SQL语句或语义化查询请求,服务器执行后返回表格结果。这里的安全策略很重要:尽量给查询账号设置只读权限,并且对查询时长和返回行数做硬限制,否则一个失控的Agent可能拖垮整个数据库。
第二类是代码执行与文件读写。MCP服务器提供沙箱环境,让模型运行Python代码、读写CSV或Excel文件。比如给模型一个运行Python脚本的工具,模型就能自己完成多步清洗计算,而不必一次把全部逻辑写在提示词里。沙箱隔离是关键,不要让模型有权限操作系统级别的文件。
第三类是BI与可视化工具的连接。MCP服务器把报表平台的指标、图表接口暴露给模型,模型可以查询指标定义、拉取可视化结果。这一类接入最能缓解“模型拿不到业务口径”的问题,不过接入前要做权限梳理,防止模型拉取到超出范围的数据。
下面是一个简化的配置示意,重点看在resources和tools里做了什么限制。配置里数据库被声明为只读,run_sql工具规定了超时时间,run_python工具开启沙箱并限制内存。这些限制不是可有可无的,而是在告诉模型和调用方:你可以通过接口取数,但是不能写库,不能无限查询,不能直接访问宿主机文件系统。对数据分析场景来说,这既保护了数据安全,也避免模型失控时造成不可逆影响。
{ "name": "sales-mcp-server", "resources": [ { "type": "database", "host": "dw.example.internal", "readonly": true } ], "tools": [ { "name": "run_sql", "timeout_sec": 30, "max_rows": 5000 }, { "name": "run_python", "sandbox": true, "max_memory_mb": 512 } ] }5.3 MCP、Skill、Agent三者的联调关系
把三者放在一起看,链路就清晰了:Agent接到任务后生成执行计划,计划里的每个步骤要么调用Skill、要么调用MCP工具。调用Skill时,Skill内部可能还需要更多数据,这时Skill会反过来通过MCP去获取。最终所有结果回到Agent,由它校验、汇总、输出。
这条链路在调试时有一个关键点:日志要记录每一层。我会在Agent层面记录“计划是什么”,在Skill层面记录“输入参数和输出结果”,在MCP层面记录“调了哪个资源、用了多少时长、返回多少行”。没有这些日志,一旦结果出错,你很难定位是模型理解错了,还是Skill写错了,还是数据库根本没连上。
6. 实操复盘:搭建一个最小可用的数据分析AI助手
6.1 目标范围与整体架构
在讲完四个概念之后,我更愿意用一个最小方案把它们串起来。目标很简单:输入一段自然语言,AI自动完成查询、计算、汇总,最终输出一段分析结论。
整体架构分四层:应用入口负责接收用户的自然语言请求;Agent层负责把请求拆成子任务;Skill层提供固定的分析处理逻辑;MCP层负责连接数据库和文件资源。第一版没有做外部指标库,也不做多Agent,先把链路跑通。
数据环境用模拟数据,表是sales_records,字段有order_id、date、region、category、revenue、quantity,里面塞了近3个月的模拟流水。这个环境我把查询账号权限设为只读,MCP工具执行SQL的返回行数限制为5000行,超时30秒。目标定得足够小,跑通之后才有信心往里加更复杂的功能。
6.2 分步实现过程
第一步是准备Prompt模板。模板包含角色、任务、数据说明和输出约束,也就是第二节里那个模板的简化版,不追求面面俱到,先把核心要素放进去。
第二步是封装第一个Skill。我选择的是“同环比计算”:输入一组日期过滤后的记录,输出销售额汇总、环比增长率和同比增长率。逻辑用Python实现,关键点是日期过滤用ISO周格式,避免跨年周出错。这个Skill虽然简单,但它让我第一次体会到了“封装”带来的好处:后续换数据源、换指标口径,只需要改Skill的参数,不需要重写整段Prompt。
第三步是配置MCP连接。这里需要准备一个MCP服务器,把数据库暴露成可查询资源,并且只开放一个run_sql工具。配置里写清楚readonly=true和max_rows限制。这一步花了些时间,因为一开始没有把超时时间考虑进去,后面踩了坑才补上。
第四步是让Agent把前几步串起来。Agent收到“帮我生成上周销售同比环比分析”后,规划成三个步骤:查询数据、调用同环比Skill、生成结论。查询数据走MCP的run_sql,同环比计算走Skill,结论生成走Prompt模板。整个过程不超过两小时就能跑通。我没有用任何重型框架,完全是最小实现。跑通的价值在于:四个概念之间的关系从抽象描述变成了真实可见的调用链,后续再往里加复杂能力就有据可依了。
6.3 实测中踩过的三个坑
第一个坑是MCP查询返回的字段类型不兼容。数据库里的order_id是字符串,但某些行被写成了数字,Skill里有一步按字符串类型做拼接,结果直接报错。解决办法是在进入Skill之前先加一层字段类型标准化,把order_id统一转成字符串。这个坑让我意识到,真实数据远比模拟数据脏,Skill里一定要预留数据清洗的入口。
第二个坑是SQL查询超时。第一次配置运行时,我把整个季度数据一次性捞出来,结果超过30秒直接失败。后来改成两步:先按周分别查询,再在内存中合并。这样单次查询数据量小,速度稳定,也避免了模型上下文被一次塞满。现在我做任何MCP查询,都会先估算返回行数,超过预期就拆查询,而不是盲目增加超时时间。
第三个坑是模型上下文溢出。当查询结果太大,再叠加Prompt和Skill输出,很容易超过上下文长度。解决办法是“能汇总就不传明细”:让Skill在MCP返回后立刻聚合成按周、按品类的汇总表,只把汇总结果传给后续流程。这个经验非常关键,很多数据分析AI项目挂在第一关,就是没做好数据降维。
7. 常见问题排查与调优经验
7.1 效果不符预期的定位思路
当AI分析结果不符合预期,我习惯按“三看”来定位:先看Prompt有没有把需求说清楚,再看Skill有没有拿到正确的输入参数,最后看MCP有没有真正返回数据。大多数问题都出在这三层之间。用一张表整理常见症状和排查方向,方便你对照处理。
| 症状 | 可能原因 | 优先排查路径 |
|---|---|---|
| 回答泛泛而谈,没有具体数字 | 数据上下文没给到位 | Prompt是否包含字段、样例、口径 |
| 分析结果格式混乱 | 输出约束缺失 | Prompt是否规定了输出格式和长度 |
| 按模板执行但结果明显错误 | Skill输入参数或口径不对 | 检查Skill接收到的字段和日期范围 |
| Agent反复执行同一无效步骤 | 缺少终止条件或任务拆分不合理 | 为Agent增加最大步数和超时时间 |
| 查询报错或数据缺失 | MCP连接或SQL权限问题 | 检查MCP日志与数据库只读权限 |
这个表不是万能的,但能帮你在遇到问题时快速划定排查范围,不至于从头到尾把代码重看一遍。我在实际排查中,超过一半的问题最后都指向同一个根源:数据口径没有在Prompt里说清楚。
7.2 渐进式调优:不要一上来就搭大框架
我在刚开始学Agent时也走过弯路:同时上多Agent、接一堆Skill、配一堆数据源,结果一周过去了,连一个稳定可靠的场景都没跑通。后来我换了一种方式:先从一个高频小任务开始,比如“同环比计算”,用Prompt把它跑对,再封装成Skill,然后让Agent调用它,最后再接MCP。每增加一层只解决一个问题,问题定位就会非常容易。
这个顺序背后是有道理的。Prompt层练的是指令设计能力,Skill层练的是流程固化能力,Agent和MCP练的是系统整合能力。你不可能跳过前两层直接建一个复杂系统,因为到时候你根本分不清错误出在哪个环节。真想快速上手,就从复制第二节的模板开始,跑通一个真实分析任务,再动手封装Skill。
7.3 三条具体的小经验
第一,所有调用都要留日志。特别是MCP执行SQL的时间、Skill的输入参数和返回结果。有了日志,排查时节省的时间远超记录成本。
第二,对数据量敏感的环节提前降维。让Skill负责把明细聚合成汇总,而不是把原始记录到处传递,既能防上下文溢出,也能提高响应速度。
第三,给自己设定一个可验收标准。比如“输入一段话,5分钟内输出一份包含指标、图表和归因的日报”。有这个标准在,才不会在系统搭建中迷失方向。
关于这四个概念,我个人的建议是:不用急着追求全自动、高大上的系统,先把自己工作上重复次数最多的一个分析流程做成Prompt模板,再封装成Skill,然后让Agent调用,最后用MCP接通真实数据。这条路看起来慢,但每一步都很扎实。等这四层你都亲手跑通一遍,会发现以后再看到任何AI辅助数据分析方案,一眼就能判断它到底靠谱不靠谱——你不再是被名词唬住的人,而是能拆解、能把控、能优化的那一个。