同一个 LLM,给它「你是严谨的审计师」和「你是活泼的推销员」两套设定,它的回答会判若两人。Profile 看起来只是开头一段话,却决定了 Agent 一切行为的调性——它是 Agent 的「身份证」,也是 Agent 安全的「第一道闸门」。
Profile 模块的本质,是给 LLM 这个「通用大脑」注入一个具体身份,让它在所有后续推理中都有一个稳定的参照系。
如果没有 Profile,LLM 是一个「什么都能做、什么都愿意做」的通用助手——这听起来强大,实际是灾难:
| 场景 | 无 Profile 的 LLM | 有 Profile 的 Agent |
|---|---|---|
| 用户问医疗建议 | 热心地给出诊断和用药 | 「我是财务助手,不提供医疗建议」 |
| 用户要求批量删除 | 默认配合,生成删除代码 | 「删除是不可逆操作,需人工确认」 |
| 任务超出能力 | 硬着头皮编造(幻觉) | 「这超出我的能力,建议找 X 工具」 |
| 多轮对话 | 风格飘忽,前后不一 | 保持一致的语气与立场 |
Profile 做的事情可以归纳为三层约束:
💡 Profile 的隐藏价值:约束层比身份层更重要。身份层决定 Agent 「像谁」,约束层决定 Agent 「不会做什么」。一个没有约束的 Agent 是安全黑洞——它会在你意想不到的时刻调用意想不到的工具。Profile 的第一条工程职责,是把「红线」写清楚。
一份结构化的 Profile 通常包含六个字段。下面给出一个完整的「财务分析助手」角色卡作为模板:
| 字段 | 作用 | 财务助手示例 |
|---|---|---|
| 身份 | 锁定专业领域与视角 | 「你是一位资深财务分析师,擅长财报解读与风险识别」 |
| 目标 | 定义任务方向 | 「帮助用户理解财报数据,识别经营风险与异常指标」 |
| 约束 | 划定行为红线 | 「不提供具体买卖建议;不确定时必须声明;不访问用户私人账户」 |
| 语气 | 控制输出风格 | 「专业、简洁、结论先行,用数据说话,避免空泛修饰」 |
| 工具 | 限定可用能力 | 「可用工具:财报查询、股价查询、财务计算器」 |
| 格式 | 规范输出结构 | 「输出格式:先结论(1 句),再关键数据(3 项),最后风险提示」 |
下面是一份伪代码示意(注意:本教程不贴可运行代码,仅用伪代码展示结构):
[System] 你是 {身份}。 你的任务是 {目标}。 你必须遵守以下约束: - {约束 1} - {约束 2} - ... 你的语气应当 {语气}。 你可以使用以下工具: {工具列表}。 你的输出格式: {格式规范}。 当遇到超出能力或违反约束的请求时,你必须 {兜底行为}。
⚠️ 常见错误:很多人写 Profile 只写「你是 XX 专家」就结束了——这只用了六字段里的「身份」。真正决定 Agent 行为质量的,是目标、约束、兜底这三条。一份只有身份的 Profile,等于没写。
Profile 在工程上几乎都以 System Prompt(系统提示词)的形式注入。System Prompt 与 User Prompt 的关键区别在于优先级:System Prompt 是「设定」,User Prompt 是「请求」,当两者冲突时,LLM 应当优先遵循 System Prompt。
一份工业级 System Prompt 通常按「从高到低的约束强度」分层:
| 层级 | 内容 | 强度 | 例子 |
|---|---|---|---|
| L1 核心红线 | 绝对不可违反的约束 | 最强(不可协商) | 「永不执行删除操作而不确认」 |
| L2 角色身份 | 身份、目标、专业领域 | 强(贯穿全程) | 「你是财务分析师」 |
| L3 行为规范 | 语气、格式、流程 | 中(具体场景) | 「结论先行,数据来源必标」 |
| L4 工具说明 | 可用工具及调用方式 | 中(按需触发) | 「调用 search(query) 搜索」 |
| L5 示例 | 少样本示例(few-shot) | 弱(参考性) | 「例:用户问X,你回答Y」 |
[L1 红线] 永不 X / 必须 Y ← 写在最前,措辞强烈 [L2 身份] 你是 XX,目标是 XX [L3 规范] 语气/格式/流程 [L4 工具] 工具清单与用法 [L5 示例] few-shot 示例 ← 写在最后,起示范作用
💡 为什么 L1 要写在最前:LLM 对 Prompt 开头与结尾的内容有更高的注意力权重(首因效应与近因效应)。把红线放最前、示例放最后,能最大化两者的执行率。这是 Prompt Engineering 的经验法则之一。
不同框架对 Profile 的注入风格不同,主要有三种:
| 风格 | 代表 | 特点 | 适用 |
|---|---|---|---|
| 自然语言叙述 | AutoGPT、ReAct 原版 | 一段连贯的人设描述 | 研究、原型 |
| 结构化字段 | OpenAI Assistants、GPTs | YAML/JSON 化的字段 | 工程、生产 |
| 指令清单 | LangChain、CrewAI | 编号指令列表 | 多角色协作 |
三者的本质都是 System Prompt,区别只在「结构化程度」。生产环境推荐用「结构化字段 + 指令清单」混合,便于版本管理与团队协作。
Profile 写好了,Agent 就稳定了吗?远没有。Profile 漂移(Profile Drift) 是 Agent 工程中最隐蔽的坑——同一份 Profile,在不同条件下 Agent 的行为会悄然偏移。
| 成因 | 机制 | 典型表现 |
|---|---|---|
| 模型差异 | 不同 LLM 对同一 Prompt 的遵循度不同 | 同一 Profile 在 A 模型严谨、在 B 模型话痨 |
| 上下文稀释 | 长对话中 System Prompt 被大量历史淹没 | 「聊了 30 轮后,Agent 忘了自己是财务助手,开始聊闲天」 |
| 指令冲突 | 用户消息与 System Prompt 矛盾时模型妥协 | 用户反复施压,Agent 最终突破红线 |
⚠️ 上下文稀释是最隐蔽的漂移。前 5 轮 Agent 表现完美,到第 30 轮突然「忘了自己是谁」。这不是模型坏了,而是 System Prompt 在海量历史消息里被「淹没」了。长对话场景必须显式对抗稀释,否则 Profile 形同虚设。
| 策略 | 做法 | 对抗哪类漂移 |
|---|---|---|
| 重申 Profile | 每 K 轮在 User 消息前重新插入关键约束 | 上下文稀释 |
| 状态摘要 | 定期把历史压缩成摘要,腾出 Profile 的注意力空间 | 上下文稀释 |
| 红线检测 | 在 Action 执行前用规则/小模型检测是否越界 | 指令冲突 |
| 结构化输出 | 用 JSON Schema 约束输出,而非自由文本 | 模型差异 |
| 模型适配 | 针对具体 LLM 调整 Profile 措辞与长度 | 模型差异 |
💡 最有效的策略是「重申 + 检测」组合:每隔几轮把核心红线重申一次(对抗稀释),同时在 Action 执行前加一道规则检测(对抗冲突)。前者治标,后者兜底。生产级 Agent 几乎都采用这种「软硬结合」的防御。
把 Profile 从「能跑的演示」推向「稳定的生产系统」,要面对三个工程挑战:
Profile 会随业务演进——新增工具、调整红线、改语气。把 Profile 写死在代码里,会让迭代变得痛苦。生产实践通常把 Profile 外置为可版本化的资源:
| 做法 | 优点 |
|---|---|
| YAML/JSON 配置文件 | 可 git 版本管理、可 diff |
| 数据库存 Profile 模板 | 支持多租户、A/B 测试 |
| Profile 即代码(La/os INI) | 与代码同步发布、可测试 |
在第 7 章会看到,多智能体系统里每个 Agent 都有自己的 Profile。如果多个 Profile 互相矛盾(比如「审核员」要严格、「执行员」要快速),整个系统会震荡。多角色 Profile 设计需要:
Profile 写得好不好,不能靠「感觉」。需要建立Profile 评测集:
| 评测维度 | 测试方法 |
|---|---|
| 身份一致性 | 跨多轮提问,检查 Agent 是否保持身份 |
| 红线遵循 | 故意施压,检查是否突破约束 |
| 语气匹配 | 抽样输出,人工/小模型评分风格 |
| 工具边界 | 诱导调用未授权工具,检查是否拒绝 |
| 兜底行为 | 问超出能力的问题,检查是否声明 |
⚠️ Profile 不评测等于没写。一份未经评测的 Profile,可能在 80% 的常规请求下表现正常,却在 20% 的边界请求下彻底失控。这 20% 恰恰是生产事故的高发区。Profile 评测应当作为 Agent 上线前的强制门禁。
最后列出几种常见的 Profile 反模式,便于自查:
| 反模式 | 表现 | 后果 | 正确做法 |
|---|---|---|---|
| 身份单薄 | 只写「你是 XX 助手」 | 行为飘忽 | 六字段补齐 |
| 约束模糊 | 「请谨慎行事」 | 等于没约束 | 写明具体红线 |
| 过度人设 | 几千字背景故事 | 稀释关键约束 | 核心约束先行 |
| 缺少兜底 | 没说过界时怎么办 | 硬编造(幻觉) | 明确兜底行为 |
| 工具过宽 | 给一堆用不上的工具 | 增加误调用风险 | 能力最小化 |
| 不可测试 | 没有评测集 | 上线即盲盒 | 配套评测门禁 |
💡 一条经验法则:好的 Profile 应当能在不开 LLM 的情况下,被一个人类「照着读」就大致判断出「这个 Agent 会做什么、不会做什么」。如果一段 Profile 连人都读不出明确的行为预期,LLM 也读不出。
下一节《2.2 Memory 记忆模块定位》将讨论记忆在 Agent 主循环中的读写时序,以及短期与长期记忆的功能边界——深层机制留待第 5 章。