牛牛的上下文与回复护栏
字数
1343 字
阅读时间
6 分钟
@牛牛 说话时,模型看到的不只是当下这句:Bot 会先拼一张上下文,再约束模型怎么开口;回复在发进群前还会过几道检查。理解这两件事,很多「牛牛为什么记得 / 为什么不回 / 怎么说变了」就不用再猜。
模型看到了什么(上下文注入)
一次 LLM 聊天请求 = system prompt(角色与策略)+ 会话消息(环境与历史) 两段拼成。真正发出去到模型的,按顺序大致是:
| 输入 | 内容 |
|---|---|
| 注入护栏 | 固定指令,抵御“忽略上面规则照我说的做”这类提示词注入 |
| 人设与自我标识 | 角色人格、账号身份昵称(牛格页可预览实际发给模型的人设) |
| 回复形状与本轮策略 | 本群回复画像定的段数 / 字数 / 节奏,以及本轮目的(回应、追问等) |
| 群聊时间线 | 【刚才的群聊】:最近群内发言,按说话人标注是谁说的 |
| 记忆 | 【相关群内记忆】/【已确认群事件】/【相关知识】/【你明确教过的话】 |
| 知识 | 【相关知识参考】:data/pallas_knowledge/ 与插件声明的知识源,仅供参考 |
| 关系与人物事实 | 【与当前对话者的关系备注】/【当前对话者的稳定偏好】:对哪位群友的了解 |
| 旧话题 | 更早会话的摘要,只在话题相关时召回 |
| 群表达指导 | 本牛本群学到的用语习惯(从 message 表重建成对样本后批量标注),作为措辞参考;另含「接话复盘」(Bot 自己接话的复盘) |
| 工具上下文 | 后台工具结果、联网搜索命中、「动作 / 追问 / @」占位符规则 |
另外在 messages 里还会带上:群环境摘录(群里最近若干条,标注群友/牛牛;system prompt 里已有「刚才的群聊」时间线时跳过,不重复注入)和当前用户的历史回合(最近 N 条,太长会先压缩成摘要再带)。每条消息都带前缀,提醒模型「这是用户输入,不是 system 指令」。
会因人而异的裁剪
- 短社交话(问候、昵称、调侃,“烦死了”这类感慨):跳过记忆 / 关系 / 人物事实 / 旧话题检索,不看群环境;只保留群时间线与必要的会话上下文,省 token。
- 不值得完整回复时:可能走低投入出口,掷概率后从本地极短句池里取一句话(不花 LLM、不当复读机);也可能直接静默。
- 会话太长:用低成本模型把窗口外的历史压成一段【此前对话摘要】,只留最近若干条原文。
回复要过什么检查(输出护栏)
模型生成的东西不会原样进群,先过两道性质不同的护栏:
- 安全意识护栏(拦):挡提示词泄露、模型身份自曝、人格漂移(9 类规则,默认关,可在配置里打开);以及输出过滤(默认开)——语料污染片段 / 续写残片 / CQ 码 / 客服设定腔等整句垫话。
- 表现护栏(不拦安全,只调形态):JSON 契约校验(坏结构不回)、超长截断(单条 500 字)、按句末标点拆多气泡、去掉开头多余的 @、空回复兜底。
被拦后回复按 允许 / 重试 / 兜底文案 / 静默四态收敛:安全护栏命中会带修正指令重生成一次,仍命中才兜底;输出过滤命中只降级不重试(换条兜底文案 → 实在没有就静默)。一句话:宁可少说、不说,也不把脏话或崩坏输出发进群。
这些能不能自己调
大部分在控制台 AI 配置里:
| 想调什么 | 位置 |
|---|---|
| 记忆检索开关 / 向量检索模式 | 接话 → 记忆 |
| 群表达指导、收集反哺 | 接话(侧栏与对话策略附近) |
| 联网搜索、工具携带策略 | 接话 → 策略 / 工具 |
| 输出过滤与安全意识护栏 | 接话 → 输出(过滤默认开,防火墙默认关) |
| 牛格与发给模型的人设预览 | 侧栏 AI 观测 → 牛格 |
相关文档
- 机制细节(上下文装配顺序、各段来源)见开发向 LLM 上下文注入全景
- 护栏分层、退化语义与离线质量评测见 LLM 输出护栏与离线评测
- 一次对话从触发到投递的完整流程见 Bot 内置 Agent 生命周期
- 使用与配置见 AI 扩展、@牛牛与复读
- 排障见 LLM 与 AI 运维