多轮对话与上下文管理
大模型的无状态特性
大模型具备无状态特性,即每次对话独立,不包含上下文信息。因此,我们需要自己把历史消息一条条拼接回去,每轮都手动维护上下文。
msg={'role':'user','content':userin}resp=api.chat(messages=[msg])userin=input("用户")#在终端输入我是小明,模型回复你好小明,再次调用后输入我叫什么,模型回复我不确定将用户的每一轮对话都存入一个列表中,在每次的对话时将这个列表中的内容给大模型作为背景,大模型就可以拥有“记忆”了。但是随着对话数越来越长,背景信息的token就会达到最大限制,从而记不住更早的信息,常见的模型上下文窗口限制在4k token或8k token ,这是物理限制,与代码逻辑无关。因此我们需要对上下文进行管理。
上下文管理
截断
顾名思义,截断就是保留最近的几条消息,将更早的前面的对话忘掉。这种管理方式适合前后文联系不强的内容,比如简单问答,翻译等任务。
滑动窗口策略
这种方式既能控制长度,又能保留重要内容。
首先,这种方式可以将重要信息固定为锚点从而保留信息。除此之外,它还能进行动态调整,实时计算token,在token即将达到限制时进行截断,防止暴力截断丢失重要信息。
总结
由于大模型具备无状态特性,所以会忘记前面对话的内容,因此需要将每次对话的上下文信息作为背景与新对话的问题一起给大模型,这样大模型就有了记忆。然而随着对话数越来越多,上下文信息会超过最大token限制,这个时候就要进行上下文管理。上下文管理有两种方式:一是截断,只保留最近的N条对话内容,前面的对话内容则丢弃,然而这种方式会导致重要信息丢失,比如第一轮对话的角色信息等;二是滑动窗口策略,将重要信息固定为锚点,同时主动计算token,在快要达到限制前及时丢弃前面的信息,处理更加平滑。
Zero-shot/Few-shot/系统提示词
Zero-shot
无样本示例,直接向模型提问,简单快捷,但有时可能得不到精确的输出格式。
优点:操作简单,快速上手,零成本准备示例。当你需要快速验证一个想法,或者任务本身很简单时,Zero-shot 是最便捷的选择。
缺点:输出格式不稳定,比如有时会附带无关的解释,也可能完全偏离任务要求。而且性能严重依赖模型的通用能力,对于需要严格格式的任务,风险较高。
典型的应用场景:翻译、总结这类简单问题,写诗、故事等创意生成,以及通用知识检索。在这些场景下,Zero-shot 往往能直接给出令人满意的结果。
例子:直接要求模型提取 JSON 数据,它可能返回被 Markdown 代码块包裹的 JSON,而不是纯数据,这就给程序解析带来了麻烦。Zero-shot 虽然方便,但在格式控制上确实容易出问题。
Few-shot
我们提供少量示例来引导模型输出期望的样式,这大大提高了输出可控性。在提示中直接提供一组输入-输出对作为示范。比如,给出一个问题和你期望的答案格式,模型就会模仿这个样式来回答。而且例子不用多,一般 1 到 3 个就非常有效。
对比我们刚才讨论的 Zero-shot,Few-shot 在格式一致性和准确率上都有质的飞跃。但有一个非常重要的注意事项:你选的示例必须覆盖目标的边界情况,否则会引入偏差。比如做情感分类,如果只给正面的例子,模型就可能把所有输入都判成正面。所以用心选好案例,是 Few-shot 成功的关键。
System Prompt
通过设定角色和行为约束,它能让模型在整个对话中保持特定的身份和规则,非常适合复杂应用场景。
System Prompt 位于对话的最前端,它就像舞台导演,为模型预先定义好角色、专业领域、输出风格,甚至安全护栏。比如,你可以告诉模型:“你是一位严谨的法律顾问,回答必须引用法条。”这样,后续的所有对话都会在这个框架下运行。
而 User Prompt,也就是用户提示,是每一次对话中我们直接提出的具体任务或问题。如果把 System Prompt 比作搭建好的舞台和演员角色,那么 User Prompt 就是每一幕的台词和情节。一个负责顶层设计,一个负责具体执行,分工非常明确。理解了这种职责分离,我们就能更高效地驾驭大模型。
例子:设计一个 Python 专用助手。System Prompt 明确写道:“你是一名 Python 助手,仅回答与 Python 相关的问题,拒绝无关提问。”一旦设定,无论用户怎么追问,它都会坚守 Python 专家的身份,这种稳定性在专用服务中至关重要。为了提高 System Prompt 的遵循度,建议使用清晰的列表、加粗或“重要提示”之类的强调语法。比如用“你必须始终…”这样的强力措辞,能有效降低模型偏离轨道的概率。
总结
zero-shot是不给例子,直接让大模型生成,不过生成的内容可能会有问题;few-shot是给少量样本,让大模型根据样本和问题生成内容,例子需要覆盖边界情况,尽量包含所有可能的结果以及结果的答案;系统提示词则是对大模型下一个角色定义,将它的岗位职责规定清楚,用角色特点约束它的行为,赋予它能力。