13、【AI】【Agent】联网使用大模型(多轮对话tokens)
【声明】本博客所有内容均为个人业余时间创作所述技术案例均来自公开开源项目如GithubApache基金会不涉及任何企业机密或未公开技术如有侵权请联系删除背景上篇 blog【AI】【Agent】联网使用大模型DashScopeOpenAI详细分析了messages中的各个角色system系统指令可以设定 AI 角色user用户输入是可以触发 AI 响应的信号以及assistant保存 AI 的回复用于多轮对话并分析了role角色是如何影响模型输出的比如通过system设定不同的角色或者有无assistant对模型的理解最后列出了一些常见的错误写法下面继续分析Agent再介绍两个写messages的技巧动态system指令虽然不推荐频繁改system但在任务切换时可以重建整个messages适合复杂的 Agent比如# 从【程序员】切换到【翻译官】messages[{role:system,content:你是一名中英翻译专家},{role:user,content:Hello world}]用system控制输出格式可以强化结构输出便于程序解析比如{role:system,content:你的回答必须是 JSON 格式包含 {\answer\: \...\}}OKmessage的三种角色分析完了之前 blog 举的例子基本上都是聚焦单轮对话而在多轮对话中就需要assistant里面 AI 的回复了assistant需要不断保存之前 AI 的回复形成连续的上下文模型才能结合之前的交互给出最近问题的新回答那么这里问题来了在多轮对话中assistant会不断地累积token消耗最终可能就会超出模型上下文的长度限制这也正是所有基于messages的对话系统必须面对的核心挑战下面来分析下首先这个问题的本质是每条消息包括user和assistant都会被编码成tokens比如messages[{role:user,content:你好},# ≈ 3 tokens{role:assistant,content:你好有什么我可以帮忙的吗},# ≈ 10 tokens{role:user,content:你能写代码吗},# ≈ 6 tokens# ... 继续下去]随着对话轮数的增加虽然上下文更连贯了但token总量会越来越逼近上下比如简化版的 Qwen-Plus 最大支持 128K 个tokens超出后 API 会报错Input length exceeds max context length而token成本 所有messages的总长度 新回复长度对于这种多轮对话assistant会不断地累积token的场景也有一些策略可以处理比如滑动窗口最常用只保留最近 N 轮对话丢弃最早的历史比如MAX_TURNS5# 保留最近5轮即10条消息defadd_message(messages,role,content):messages.append({role:role,content:content})# 确保 user/assistant 成对所以最多保留 MAX_TURNS * 2 条iflen(messages)MAX_TURNS*2:# 丢弃最早的两条一轮messagesmessages[2:]returnmessages这样做的话简单高效但是会忘记早期的重要信息总结摘要适合长对话当历史太长时让 AI 自己总结前面的对话# 当 messages 太长时summary_prompt[{role:system,content:请用一句话总结以下对话的核心内容},*old_messages]summarycall_llm(summary_prompt)# 替换历史为摘要 最近几轮new_messages[{role:system,content:f之前的对话摘要{summary}},*recent_messages# 保留最近2-3轮]这样做可以保留早期对话的语义节省大量tokens但需额外调用一次模型增加了成本和延迟选择性保留只保留关键信息比如用户明确要求记住的内容任务相关的上下文文件内容代码片断等忽略寒暄重复提问等不重要信息比如KEYWORDS[记住,注意,重要,配置,代码]essential[msgformsginmessagesifany(kwinmsg[content]forkwinKEYWORDS)]这种方法适合 Agent 或工具调用等场景但需要设计过滤规则外部存储高级方案通过向量数据库存储历史每次只检索相关片断注入system或user# 伪代码relevant_snippetsvector_db.search(querycurrent_question)context\n.join(relevant_snippets)messages[{role:system,content:f相关背景{context}},{role:user,content:current_question}]这种方案可支持无限长对话但架构复杂适合企业级应用在实际使用中可按场景对策略进行选择比如场景推荐策略普通聊天机器人滑动窗口保留最近 3 ~ 5 轮编程助手OpenCoder选择性保留只保留代码或错误信息等客服任务型 Agent总结摘要 关键信息保留长期记忆需求如个人助理外部存储方案多轮对话会累积token但通过滑动窗口等策略可以低成本实现高效上下文管理对于 90% 的应用场景保留最近 3~5 轮对话就足够了既能控制成本又能保证连贯性OK本篇先到这里如有疑问欢迎评论区留言讨论祝各位功力大涨技术更上一层楼更多内容见下篇 blog【Agent】【OpenCode】介绍