调用通义千问API生成文案、说明或问答内容时,如果请求体里只写了一句“写一段产品介绍”,模型通常会返回一段四平八稳、面向泛化读者的文字。这种结果并不是模型能力不足,而是提示词中缺少一个关键变量:内容到底给谁看。目标人群信息可以让模型在选词、举例、语气和解释深度上做出明显调整,是接口对接阶段最值得投入精力优化的部分。

在上面的请求结构里,目标人群描述并不是一个独立参数,而是作为系统消息或用户消息中的自然语言内容存在。以通义千问API兼容的OpenAI接口为例,messages数组中的system角色适合定义模型身份和受众特征,user角色则承载具体任务。两部分配合,才能让模型既知道“我是谁,在对谁说话”,也知道“我要完成什么”。
如果只把人群信息写在user消息里,模型也可能会生效,但在多轮对话中容易被后续指令稀释。如果只写在system消息里,又可能因为描述过长而弱化任务本身。比较稳妥的做法是:在system中保持一两句精炼的受众画像,在user中围绕该受众提出具体要求。
一、目标人群信息为什么能改变生成结果
大型语言模型在生成文本时,会根据输入提示预测下一个最可能出现的词。如果提示词里没有受众信息,模型会倾向于选择高频、通用、安全的表达方式。例如让它写“智能考勤系统介绍”,默认结果可能是“本系统具有高效、稳定、易用等特点”,这类话术放在任何产品上都成立,但没有针对性。
加入目标人群后,模型相当于获得了一个额外的语境约束。它会自动调整词汇难度、例句类型和说服逻辑。比如面向HR经理时,模型会更强调合规性、考勤数据准确度、实施成本;面向普通员工时,则会更强调打卡便捷性、请假流程透明。以下两个请求体可以直观看出差异:
{
"model": "qwen-plus",
"messages": [
{
"role": "user",
"content": "写一段智能考勤系统介绍。"
}
]
}
{
"model": "qwen-plus",
"messages": [
{
"role": "system",
"content": "你是一名企业软件产品文案。目标读者是30-45岁的人力资源经理,关注合规性、数据准确度和实施成本。请使用正式但易懂的中文。"
},
{
"role": "user",
"content": "写一段300字左右的智能考勤系统介绍。"
}
]
}
第二个请求虽然只是多了一段系统消息,但生成结果往往会从“泛泛介绍功能”转向“面向HR决策者解释管理价值”。这种变化在营销文案、技术文档、教育内容等任务中都十分明显。
因此,在接口对接阶段,不应该把目标人群描述当成可选项。它可以被理解为一种低成本的提示词增强手段,不需要调整模型参数,只需要修改消息内容就能获得更稳定的输出风格。
二、在system与user消息中组织人群描述
通义千问API支持DashScope原生接口和OpenAI兼容接口两种方式。无论使用哪种,请求体中的消息结构都包含role和content字段。role通常设置为system、user或assistant。目标人群信息建议优先放在system消息中,因为系统消息在多轮对话里具有较高的优先级,模型会更稳定地遵守。
一个包含目标人群描述的系统消息,可以从以下几个维度来写:年龄段、职业背景、知识水平、阅读场景、语气偏好、需要避免的表述。例如:
{
"role": "system",
"content": "你是一名技术文档作者。目标读者是刚接触云服务器的后端开发者,已有基础编程经验,但缺少运维背景。请使用循序渐进的方式解释概念,避免使用未定义的术语。"
}
上述内容中,“刚接触云服务器的后端开发者”明确了知识水平,“已有基础编程经验,但缺少运维背景”进一步划定了解释边界,“循序渐进”和“避免使用未定义的术语”则规定了表达方式。这样的人群描述比单纯写“面向开发者”要有效得多。
在user消息中,可以再次呼应目标人群,但不必重复全部画像。比如只写“请考虑这些读者的背景,解释安全组的概念并给出一个最小配置示例”。这样既能保持任务清晰,又不会让系统消息变得冗长。
import os
from openai import OpenAI
client = OpenAI(
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
response = client.chat.completions.create(
model="qwen-plus",
messages=[
{
"role": "system",
"content": "你是一名技术文档作者。目标读者是刚接触云服务器的后端开发者,已有基础编程经验,但缺少运维背景。请使用循序渐进的方式解释概念,避免使用未定义的术语。"
},
{
"role": "user",
"content": "解释什么是安全组,并给出一个最小配置示例。"
}
],
temperature=0.3,
)
print(response.choices[0].message.content)
上面的Python示例展示了通过OpenAI兼容模式调用通义千问API的完整过程。注意base_url使用的是阿里云DashScope提供的兼容地址,api_key从环境变量中读取,避免硬编码。实际项目中,temperature等参数可以结合任务类型调整,技术说明类内容建议使用较低的temperature值,以获得更严谨的输出。
三、按任务类型设计目标人群提示词
不同任务对目标人群描述的侧重点不一样。营销文案关注的是读者的购买动机和身份认同,技术文档关注的是读者的知识水平和操作环境,教育内容关注的是学习阶段和认知特点。下面分别给出示例。
营销文案场景:面对中小餐饮店主推广扫码点餐系统,可以把目标人群设定为“30-50岁的餐饮店主,日常忙碌,关注人力成本和顾客体验”,并明确让模型避免使用“赋能”“闭环”等空泛词汇。示例系统消息如下:
{
"role": "system",
"content": "你是一名餐饮SaaS产品营销文案。目标读者是30-50岁的中小餐饮店主,日常忙碌,关心人力成本和顾客体验。请用简单直接的中文,少用互联网黑话,多从实际经营场景切入。"
}
技术文档场景:面向第一次使用消息队列的Java工程师,除了知识水平,还需要说明技术栈和运行环境。系统消息可以写成“目标读者是有Java Web开发经验但未接触过消息队列的工程师,使用Spring Boot框架,希望了解基本概念和接入步骤”。这样模型在生成示例代码时,会更倾向于给出Spring Boot风格的配置。
教育内容场景:如果让模型为中学生解释“什么是递归”,目标人群信息可以写“14-15岁的中学生,已经学习过循环结构,但没有接触过函数调用栈”。模型会避免直接抛出“栈帧”“尾递归优化”等术语,而是选择生活化的例子来讲解。
可以看出,目标人群描述的重点不是堆砌字段,而是提供模型能理解和执行的约束。一个实用技巧是:写完人群描述后,自己先看一遍,如果换成一个完全不相关的人也能套用,就说明描述太模糊。比如“面向对技术感兴趣的用户”就不够好,而“面向想转行做数据分析、已经掌握Excel基础操作的职场人”才具备实际区分度。
四、常见误区与调优建议
第一个常见误区是把目标人群写得过于宽泛。例如“面向所有用户”“适合各类企业”这类表述几乎不会改变模型输出。目标人群的价值在于缩小选择空间,而不是单纯加一个名词。更有效的方法是加入年龄、职业、知识背景、使用场景等具体限定。
第二个误区是把产品定位和目标人群混在一起。有些人会在系统消息里写“这是一款高端智能手表,主打健康和运动”,这其实是产品卖点。目标人群描述应该写“目标读者是关注心率监测和长续航的跑步爱好者”,两者有交叉,但视角不同。前者在定义产品,后者在定义读者。
第三个误区是只写角色,不写任务。比如系统消息写“你是医生”,但user消息里没有任何医疗任务,模型也无法发挥人群设定的作用。目标人群信息必须与具体任务配套使用,才能在生成时形成有效约束。
调优时,可以先固定system消息,只修改user消息中的任务描述,观察输出差异。再反过来,固定任务,调整人群描述,看模型是否按要求改变语气和解释深度。需要特别注意的是,如果使用了较低的temperature,模型输出会更确定,但对提示词中的矛盾信息也更敏感。如果人群描述中出现互相冲突的要求,例如“写给完全没有编程基础的人”同时又要求“使用专业术语解释”,输出质量会明显下降。
最后,接口对接时可以把目标人群描述做成可配置项,通过业务系统传入不同字段,动态拼接到提示词模板中。例如在后台设置“年龄范围”“职业”“阅读场景”三个输入框,程序将其转换为一段自然语言后写入system消息。这样既保证了提示词结构统一,也能根据不同内容需求快速调整受众画像。