BCG矩阵(Boston Consulting Group Matrix)诞生于上世纪70年代,至今仍是战略分析的基础工具之一。它用市场增长率和相对市场份额两个维度,把企业产品或业务单元分成四类:高增长高份额的是明星,高增长低份额的是问题,低增长高份额的是现金牛,低增长低份额的是瘦狗。传统做法需要财务和业务团队整理大量数据,再人工判断每个产品落在哪个象限。这个流程既耗时又容易受主观因素干扰。借助大语言模型,我们可以把判断规则和数据结构化后写入Prompt,让模型快速完成归类,并给出理由和下一步建议。关键在于Prompt设计是否足够清晰,输出格式是否受到严格约束。

BCG矩阵的核心逻辑与Prompt设计思路
要让大模型正确执行BCG矩阵分析,提示词中必须明确两个维度的定义和计算方式。相对市场份额通常用「本产品市场份额除以最大竞争对手份额」来表示,市场增长率则是该产品所在品类的年度增速。很多人在设计Prompt时只给了两个数字,却忽略了模型不知道这两个数字对应什么含义,结果模型凭常识自由发挥,导致分类结果不可复现。因此,Prompt里需要写清楚每个字段的名称、单位以及判断阈值。例如可以规定:相对市场份额大于1.0且市场增长率高于10%为明星,相对市场份额小于1.0但增长率高于10%为问题,相对市场份额大于1.0但增长率低于10%为现金牛,两者都低为瘦狗。
除了规则,Prompt还应当包含角色设定和输出格式要求。角色设定可以让模型进入企业战略顾问的语境,减少闲聊式输出。输出格式建议强制指定为JSON,这样后续可以用程序自动解析,避免人工从长文本中提取信息。一个典型的Prompt段落可以这样写:你是一名资深产品战略分析师,请根据以下产品的市场份额和增长率数据,按照BCG矩阵规则将每个产品分类。输入数据为JSON数组,每个元素包含产品名称、相对市场份额、市场增长率。输出必须是JSON数组,每个元素包含产品名称、象限、分类理由、策略建议。这样的约束能让模型的行为更接近一个确定的函数。
另外一个容易被忽略的细节是少量样本(few-shot)的用法。如果只给规则,模型对边界情况(比如增长率恰好等于10%)可能会犹豫。你可以在Prompt中附带一两个示例,展示当数值恰好落在阈值附近时应该如何归类和解释。这种示例不需要多,一到两个就能显著提升输出一致性。示例中要特别注明:边界值按四舍五入或向下取整处理,例如增长率10.0%视为高增长,相对市场份额1.0视为高份额。
可复用的Prompt模板与参数化技巧
下面是一个可以实际使用的Prompt模板。为了便于复制,这里用纯文本块展示,其中大括号内的变量表示需要替换的内容。这个模板已经包含角色设定、字段说明、分类规则和输出格式,可以直接粘贴到ChatGPT、Claude或任何支持系统提示词的大模型平台中使用。
你是一位有十年经验的战略咨询顾问,擅长使用BCG矩阵进行产品组合分析。请根据以下规则对给定产品进行分类。
输入数据是一个JSON数组,每个元素包含三个字段:product_name(产品名称,字符串)、relative_market_share(相对市场份额,浮点数,表示本产品份额/最大竞争对手份额)、market_growth_rate(市场增长率,浮点数,百分数形式,例如8.5表示8.5%)。
分类规则:
- 明星(Star):relative_market_share >= 1.0 且 market_growth_rate >= 10
- 问题(Question Mark):relative_market_share < 1.0 且 market_growth_rate >= 10
- 现金牛(Cash Cow):relative_market_share >= 1.0 且 market_growth_rate < 10
- 瘦狗(Dog):relative_market_share < 1.0 且 market_growth_rate < 10
对每个产品输出一个JSON对象,包含以下字段:product_name、quadrant(取值:Star、Question Mark、Cash Cow、Dog)、reason(用中文解释分类依据,不少于20字)、suggestion(用中文给出该产品的战略建议,不少于20字)。所有输出必须是一个JSON数组,不要添加任何额外的解释文字。
输入数据:
{{product_list}}
这个模板中的 {{product_list}} 是占位符,实际使用时替换成真实数据。注意分类规则中使用了大于等于和小于的组合,避免了边界遗漏。为了适配不同场景,你还可以增加一个可选的阈值参数,比如在Prompt中加入 market_growth_threshold: 10 和 relative_share_threshold: 1.0,让用户自己调整。这种方式尤其适合同一个模板在不同事业部复用,只要改变阈值就能适应不同行业的增长标准。
参数化还有一个好处:你可以把模型温度(temperature)调低,比如设为0或0.1。BCG矩阵分析本质上是规则映射,不需要创造性发挥,温度越低输出越稳定。如果模型平台支持JSON模式或函数调用,建议开启,能进一步保证返回的JSON不包含任何无关文本。但即便没有这些高级功能,只要模板中的输出格式写得足够明确,主流大模型也能大概率返回合法JSON。
用Python调用大模型执行分析
将上面的Prompt集成到自动化流程中,最方便的方式是用Python调用大模型API。下面这段代码演示了如何通过OpenAI兼容接口处理一组产品数据,并解析返回的JSON。代码中使用了环境变量来保存API密钥,避免硬编码。为了保持示例简洁,这里只处理同步调用,生产环境可以改成异步批量处理。
import os
import json
from openai import OpenAI
# 初始化客户端,API Key 从环境变量读取
client = OpenAI(
api_key=os.environ.get("OPENAI_API_KEY"),
base_url="https://api.openai.com/v1"
)
# 模拟产品数据
products = [
{"product_name": "智能音箱Pro", "relative_market_share": 1.8, "market_growth_rate": 25.0},
{"product_name": "老款蓝牙耳机", "relative_market_share": 0.4, "market_growth_rate": 3.2},
{"product_name": "带屏智能音箱", "relative_market_share": 0.7, "market_growth_rate": 18.5},
{"product_name": "经典款充电宝", "relative_market_share": 2.3, "market_growth_rate": 5.0},
]
# Prompt模板,注意大括号需要转义才能通过 f-string 正常输出
prompt_template = """你是一位有十年经验的战略咨询顾问,擅长使用BCG矩阵进行产品组合分析。请根据以下规则对给定产品进行分类。
输入数据是一个JSON数组,每个元素包含三个字段:product_name、relative_market_share、market_growth_rate。
分类规则:
- 明星(Star):relative_market_share >= 1.0 且 market_growth_rate >= 10
- 问题(Question Mark):relative_market_share < 1.0 且 market_growth_rate >= 10
- 现金牛(Cash Cow):relative_market_share >= 1.0 且 market_growth_rate < 10
- 瘦狗(Dog):relative_market_share < 1.0 且 market_growth_rate < 10
对每个产品输出一个JSON对象,包含以下字段:product_name、quadrant、reason、suggestion。所有输出必须是一个JSON数组,不要添加任何额外的解释文字。
输入数据:
{product_list}"""
# 生成最终的prompt
product_list_json = json.dumps(products, ensure_ascii=False)
prompt = prompt_template.format(product_list=product_list_json)
# 调用大模型
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "你是一个严格遵守输出格式的助手。"},
{"role": "user", "content": prompt}
],
temperature=0,
response_format={"type": "json_object"}
)
# 获取并解析结果
content = response.choices[0].message.content
try:
result = json.loads(content)
print(json.dumps(result, ensure_ascii=False, indent=2))
except json.JSONDecodeError as e:
print("返回内容不是合法JSON:", content)
代码中有几个值得注意的地方。第一,使用了 response_format={"type": "json_object"} 来强制模型返回JSON,这是OpenAI较新版本接口支持的参数,很多兼容平台也支持。如果你的模型不支持该参数,可以直接去掉,依靠Prompt中的输出格式要求。第二,温度设为0可以最大限度减少随机性,适合这种确定性分类任务。第三,Prompt模板中使用了Python的 .format() 方法,占位符 {product_list} 会被替换成JSON字符串,注意模板中其他大括号需要双写转义,这里没有额外大括号,所以没问题。如果模板内容本身含有大括号(比如JSON字段格式),则需要双写。
调用返回的JSON数组可以直接写入数据库或导出为CSV,交给可视化工具生成气泡图,气泡的X轴代表相对市场份额,Y轴代表市场增长率,气泡大小代表销售额。这样就把大模型的文本输出转变成了标准的BCG矩阵图形,整个分析链路可以完全自动化。
结果校验与Prompt优化建议
大模型偶尔会在边界值或极端数据上产生错误分类,尤其是当输入数据中某个产品的数值接近阈值时。为了降低风险,可以在Prompt中要求模型输出 reason 字段时明确写出计算对比过程,例如「相对市场份额为0.98,低于1.0,市场增长率12.5%,高于10%,因此归类为问题」。这样你就能通过正则或人工抽查快速发现明显违背规则的输出。如果发现模型多次在特定数值上犯错,不要只依赖更详细的描述,而是应该调整阈值的表述方式,比如把「高于10%」改成「市场增长率超过9.99%时视为高增长」,消除歧义。
另一个有效的优化思路是引入评分制,而不是直接让模型做二分类。你可以要求模型先对每个产品计算相对市场份额得分和市场增长率得分,再根据得分落入哪个区间输出象限。例如:相对市场份额在0到0.5之间得1分,0.5到1.0之间得2分,1.0以上得3分;市场增长率低于5%得1分,5%到10%得2分,10%以上得3分。然后规定得分为(3,3)为明星,(1或2,3)为问题,(3,1或2)为现金牛,(1或2,1或2)为瘦狗。这种打散重构的方法能减少模型直接套用阈值的错误,并且让分类依据更透明。
最后,当你需要处理几十个甚至上百个产品时,可以分批调用模型,每批控制在10个以内,避免长上下文下模型注意力分散导致后半部分产品分类质量下降。也可以先对产品进行初步筛选,把明显属于现金牛或瘦狗的先过滤掉,只让模型分析争议较大的产品,节省token和时间。无论采用哪种方式,都建议保留一份人工复核的机制,尤其是针对明星和问题产品,因为这两类直接关系到资源投入决策。