想让讯飞星火做数据分析时自动输出“结论+图表解释”,最直接的做法不是把表格原样丢进去然后等着它自己发挥,而是先调整提示词的结构。

如果把“结论”和“图表解释”混在一个问题里,模型通常会优先返回一段概括性描述,图表说明被压缩成“从图1可以看出”。这不是模型不会看图,而是提示词没有告诉它:结论必须包含业务判断,图表解释必须说明图形维度、数值变化和异常点。
一、先把“结论”和“图表解释”拆开,模型才会分别响应
很多数据分析提示词失败,是因为把“结论”和“图表解释”当成同一个东西。模型收到“帮我分析这份数据”后,只能按照通用习惯输出趋势描述,图表说明往往一句话带过。更合适的做法是,在提示词里给两者下定义:结论是一句话判断,例如“华东区Q2营收增长主要由企业客户复购拉动”;图表解释则要写清“图1为月度营收折线图,横轴为月份,纵轴为营收额,6月出现最高点128万,较5月提升17%,主要原因是续约订单集中交付”。
这样拆分之后,模型在生成时就不会只给一个模糊趋势,而是会分别寻找业务上的核心变化,以及图形上的关键拐点。下面是一个最简提示词示例:
你是一名数据分析师。请根据我提供的数据摘要,输出两部分内容: 1. 结论:用一句话说明最重要的业务发现。 2. 图表解释:如果数据涉及图表,请逐个说明图表类型、横纵轴含义、高点低点、变化幅度和异常点。
这个提示词虽然简单,但已经能明显提升输出完整度。如果再把字段名称和图表编号规则写清楚,稳定率会更高。对复杂表格来说,关键是不要让模型自己去猜哪一列代表什么含义。
二、四个模块搭好提示词:角色、字段、模板、图表规则
要让星火在复杂表格上也能稳定输出结论加图表解释,可以把提示词拆成四个模块。第一是角色,比如“你是资深电商数据分析师,擅长从GMV、转化率、复购率中找异常”。角色越具体,模型越容易调用对应的分析框架,而不是泛泛地输出增长或下降。
第二是字段字典。用户上传的表头不一定直观,gmv、uv、cvr这类缩写需要解释。在提示词里写清楚字段含义,可以避免模型把uv理解成独立访客数还是页面浏览量。例如可以这样描述字段:gmv为当日成交总额,uv为当日独立访客数,cvr为支付转化率。
第三是输出模板。固定模板比自由发挥更容易拿到结构化结果。下面给出一个可复用的模板:
【核心结论】 一句话给出最核心判断。 【数据依据】 列出支撑结论的三个关键数字或变化。 【图表解释】 - 图表1(趋势类):说明整体走势、最高点、最低点、变化幅度。 - 图表2(对比类):说明各组差异、最大差值、领先或落后原因。 - 图表3(占比类):说明前三项占比、长尾项特征。 【业务建议】 给出两条可执行建议。
第四是图表规则,这个模块最容易被忽略。数据分析场景里常见折线图、柱状图、饼图,不同图表要解释的东西不一样。可以用表格明确要求:
| 图表类型 | 必须解释的维度 | 示例表达 |
|---|---|---|
| 折线图 | 趋势、拐点、异常点、累计变化 | 6月出现最高点,较5月提升17% |
| 柱状图 | 对比关系、最高最低、差值 | 华东区比华南区高23% |
| 饼图 | 占比排名、前三项、长尾 | A类商品占比42%,前五类合计81% |
把四个模块都写进提示词后,星火返回的内容基本不会再出现“详情见图”这种空话。每个图表解释都可以直接贴到报告里,不用再做二次润色。
三、用API调用时,让JSON结构锁死“结论+图表解释”
网页对话可以用自然语言提示词,但要在自己的系统里自动解析,最好用API并强制返回JSON。讯飞星火开放平台提供了兼容OpenAI风格的接口,可以在system提示词里放入完整模板,然后让user消息携带数据摘要。返回JSON后,前端可以直接渲染结论和图表解释,不用再做复杂文本切割。
下面是一个Python调用示例,核心是把输出格式写成JSON,并关闭随机性:
import os
import requests
SPARK_API_URL = "https://spark-api-open.xf-yun.com/v1/chat/completions"
API_KEY = os.getenv("SPARK_API_KEY")
system_prompt = """
你是一名数据分析师。请基于用户提供的数据摘要,输出JSON格式结果。
结构如下:
{
"conclusion": "一句话核心结论",
"evidence": ["数字依据1", "数字依据2"],
"chart_explanations": [
{
"chart_name": "图表1",
"chart_type": "折线图",
"explanation": "说明图表类型、横纵轴、趋势、最高点、异常点"
}
],
"suggestions": ["建议1", "建议2"]
}
要求:
1. 图表解释必须引用具体数值。
2. 如果数据不涉及图表,chart_explanations返回空数组。
3. 只输出JSON,不要使用Markdown代码块,不要添加解释文字。
"""
user_content = """
数据摘要:
- 图表1:月度GMV趋势折线图,1月50万,2月47万,3月63万,4月61万,5月78万,6月92万。
- 图表2:各渠道转化率柱状图,自然搜索3.2%,付费广告4.8%,社群5.1%。
"""
resp = requests.post(
SPARK_API_URL,
headers={"Authorization": f"Bearer {API_KEY}"},
json={
"model": "generalv3.5",
"messages": [
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_content}
],
"temperature": 0.2
}
)
result = resp.json()
content = result["choices"][0]["message"]["content"]
print(content)
这段代码里temperature设为0.2,是为了让图表解释少一些想象成分,尽量贴着数据说话。实际使用时,chart_name要和你系统里图表组件绑定,前端拿到JSON后可以按名称匹配到对应图表,再把解释文字渲染在图表下方。
如果接口返回的JSON被包在Markdown代码块里,可以在提示词中重复强调“只输出JSON,不要使用Markdown代码块”。更稳的办法是在解析时先剥离代码块标记,再做json.loads。不过提示词里多强调几次,大多数情况下已经能干净返回。
四、从“能输出”到“能落地”:三个优化技巧
第一,给提示词加“禁止幻觉”的约束。数据分析场景里,模型有时为了凑图表解释,会编一个数据里没有的峰值。可以在提示词末尾加一句:所有数字必须来自用户提供的数据摘要,不得自行补充或推测。 这个约束能明显减少错误引用,尤其是处理销售、财务等严肃数据时。
第二,用少而明确的图表编号。一次分析里图表不要超过三个,并且要在数据摘要里给每张图起好名字,例如“图表1:月度趋势折线图”。如果命名太随意,模型容易把图表解释写串。更好的做法是让图表的chart_name与前端ECharts或AntV图表的组件ID一致,这样接口返回的JSON可以直接驱动页面渲染,不需要人工核对。
第三,控制解释长度。图表解释不是越长越好,能在两到三句话里说清趋势、对比、异常即可。提示词中可以写:每个图表解释控制在60字以内,只写最重要的变化和原因。 这样输出的内容更适合放在图表下方作为注释,也不会淹没核心结论。
这三个技巧叠加起来,基本可以覆盖大多数数据分析报告场景。即使数据量变大,也只需要在数据摘要里增加分组维度和时间范围,不必重写整套提示词。把提示词模板沉淀到系统配置里,后续每次分析都复用同一套结构,输出稳定性会进一步提高。