博客翻译项目碎碎念:历史会话

博客翻译项目最初设计过于复杂——先解析 Markdown 格式,再用占位符保护内容,最后送给大模型翻译。其实这完全是多此一举,大模型本身就具备识别 Markdown 语法的能力,可以直接处理原始内容并在翻译时保持格式完整。

我们的工作就从调试代码,切换到调试大模型的提示词

模型:google/gemma-3-4b 硬件:Nvdia 3060 12GB

没错,选的非思考模型,思考模型在执行翻译任务时,效率不够高,对比了 4b 参数和 12b 参数的效果,针对翻译任务来说 gemma3 的 4b 参数已经足够了,12b 的参数在翻译任务上并没有明显的优势。

12b 参数的速度:11.32 tok/sec,4b 参数的速度:75.21 tok/sec

背景介绍

尽管在system里面加上了各种条件限制,输出的翻译结果,还是会出现一些问题,比如:格式没有保护,多出来了一些解释的内容。角色定义的时候,已经声明过,记得保护 Markdown 格式、仅输出翻译结果,最终的翻译还是不太稳定。

此时想起来,以前接触过一个漫画翻译的项目,也用到了大模型的能力,它的翻译效果好像比我的效果更好一些,翻看代码,对比请求的数据,漫画翻译的项目,每次请求都会带上一组上下文,除了当前的翻译内容,还会带上之前的翻译内容。

好处是什么,不仅能提升前后翻译的连贯性,还剩确保输出格式的稳定性。

历史会话的重要性

随着 AI 大模型(如 GPT 系列、Claude、Gemini 等)的普及,越来越多企业和开发者通过 API 接入这些模型,构建智能客服、内容生成、代码助手等应用。然而,许多人在接入初期会遇到一个常见问题:模型输出不连贯、缺乏上下文理解,甚至答非所问

造成这种现象的一个关键原因是——没有在 API 请求中包含历史对话内容

什么是历史对话?

历史对话是指在一次对话会话中,模型和用户之间之前的交流记录。在大多数大模型 API(如 OpenAI 的 Chat Completions API)中,开发者需要自己在请求中构建完整的 messages 数组,将历史对话以轮流的 userassistant 消息形式传入。

示例

{
  "model": "gpt-4",
  "messages": [
    {"role": "user", "content": "帮我写一封辞职信"},
    {"role": "assistant", "content": "好的,你希望辞职的原因写些什么?"},
    {"role": "user", "content": "说我想追求个人职业发展"}
  ]
}

如果你只发送最后一句话:

{"role": "user", "content": "说我想追求个人职业发展"}

模型根本不知道你在说辞职信,它可能完全无法理解上下文,输出质量自然很差。


为什么历史对话如此重要?

1. 构建上下文,提升连贯性

AI 模型本质上是“上下文驱动”的。它无法记住“之前”发生的任何事情,除非你显式告诉它。通过传入对话历史,模型可以更好地理解你的意图和话题背景,输出更符合预期。

2. 降低误解率

如果你希望模型完成一个多轮指令,如写作、总结、调试代码,历史记录能让模型逐步积累理解,避免在中途“跑题”或丢失重点。

3. 模拟真实人类对话行为

在实际应用中,如客服系统、教育助手、健康咨询等,用户的问题往往是逐步展开的,而不是一次性表达清楚。保留对话历史,可以让 AI 更像一个“有记忆力的助理”。


如何在 API 中正确添加历史对话?

以 OpenAI 的 API 为例,建议遵循以下结构:

messages = [
    {"role": "system", "content": "你是一个专业的法律助手"},
    {"role": "user", "content": "什么是合同的有效条件?"},
    {"role": "assistant", "content": "合同有效需要满足以下几个条件:……"},
    {"role": "user", "content": "那口头协议算吗?"}
]

response = openai.ChatCompletion.create(
    model="gpt-4",
    messages=messages
)

注意:

  • 使用 system 消息设定模型行为和身份。
  • 保留最近几轮关键对话即可,不需要每次传入全部历史(避免超过 token 限制)。
  • 在长会话中,可通过截断早期内容,保留核心信息摘要,控制 token 消耗。

实践建议

  • 对话状态管理:后端需设计缓存机制,记录每个用户的会话历史(如 Redis、数据库)。
  • 限制长度:OpenAI GPT-4 的上下文长度为 128k tokens,Claude 3 可达 200k~1M,需合理裁剪。
  • 动态摘要历史:当历史内容过长时,使用模型先对旧对话做摘要,再添加进对话上下文。

总结

AI 大模型的能力强大,但也需要开发者“喂”给它足够的上下文信息。通过在 API 请求中添加历史对话,不仅能显著提升模型输出的质量和连贯性,也能让用户体验更自然、更贴近真实对话。

无论你是在构建 AI 客服、写作助手、编程帮手,还是教育类应用,这都是一个不可忽视的优化技巧。

Licensed under CC BY-NC-SA 4.0
最后更新于 2025年06月02日 21:40
金融IT程序员的瞎折腾、日常生活的碎碎念
使用 Hugo 构建
主题 StackJimmy 设计