AI 工作流中多个模型怎么接力调用不丢上下文?

liulian
liulian 正式会员超兽战士
发布于 2026-10-07 19:00 ·1 浏览 ·0 回复

学完这篇,你能在 n8n 或 Dify 工作流里让多个模型接力调用时,把完整对话历史、工具结果和中间变量按正确格式传下去,不再出现“第二个模型突然失忆”。

第一步:把上下文统一成 messages 数组

这一步要做什么:定义所有模型都认的上下文容器。做完后,无论换 GPT-4o、Claude 3.5 Sonnet 还是 Qwen2.5,都传同一个数组。

用 JSON 数组,每条消息包含 role 和 content。role 只能用 system、user、assistant、tool。示例:

[
  {"role":"system","content":"你是需求分析助手。"},
  {"role":"user","content":"帮我设计登录页。"},
  {"role":"assistant","content":"需要邮箱+验证码。"}
]

接力时,把前一个模型的输出 append 成 assistant,再加新的 user。

注意:不要把上一步输出直接拼成一个大字符串塞进 system,模型会分不清谁说的。

第二步:在 n8n 里用 Set 节点维护上下文

打开 n8n 1.70 以上,左侧 Workflows → Add workflow。添加节点:Manual Trigger → Set(Edit Fields)。在 Set 节点里加字段 messages,类型选 Array,把上面的数组填进去。然后接 OpenAI 节点:搜索 “OpenAI”,Resource 选 Chat,Operation 选 Complete,Model 选 gpt-4o-mini,Messages 来源选 Expression,表达式写 {{ $json.messages }}。这样第一个模型拿到完整历史。

再接一个 Set 节点,把第一个模型的输出 push 到 messages 数组:表达式写 {{ $json.messages.concat([{ role: 'assistant', content: $json.message.content }]) }}。然后接第二个模型节点,比如 Anthropic 节点:Resource 选 Chat,Operation 选 Complete,Model 选 claude-3-5-sonnet-20241022,Messages 同样用 {{ $json.messages }}。第二个模型就能看到第一个模型的完整输出。

注意:n8n 的 OpenAI 节点默认只传 prompt,不传历史。必须在节点里把 Messages 改成 Expression,否则上下文会断。

第三步:用会话 ID 和摘要控制长度

这一步做:给每个工作流实例一个 session_id,并定期把老消息压缩成摘要。结果:长对话不爆 token,也不丢关键信息。

在 n8n 里加 Redis 节点,Key 用 chat:{{ $json.sessionId }},Value 存 messages 数组。每次调用前读出来,调用后写回去。如果 token 超过 6000,就调用一个便宜模型做摘要:模型选 gpt-4o-mini,提示词写“把以下对话压缩成 200 字摘要,保留人设、事实、未完成任务”,然后把摘要替换掉前 10 条消息,保留最近 5 条。

注意:摘要不是随便删。要保留 system 消息和最近一轮 user/assistant,否则模型会忘记当前目标。

第四步:在 Dify 工作流里接力

Dify 1.0 控制台 → 工作室 → 创建空白应用 → 选「工作流」。开始节点后加 LLM 节点,模型选 gpt-4o,提示词里引用 {{#sys.query#}}。再加第二个 LLM 节点,模型选 claude-3-5-sonnet,提示词里引用第一个节点的输出 {{#llm_1.text#}}。如果要多轮记忆,在「开始」节点加一个输入字段 messages,类型 Array,然后在 LLM 节点的提示词里用 {{#start.messages#}} 把历史传进去。

注意:Dify 工作流的 LLM 节点默认不继承聊天记忆。必须手动加输入字段或把上一节点输出写进提示词。

第五步:验证是否丢上下文

每个模型调用后加一个 Code 节点,打印 JSON.stringify($json.messages, null, 2)。运行工作流,看第二个模型的输入里是否包含第一个模型的 assistant 消息,以及最初的 system 消息。如果没有,检查 Set 节点的 concat 顺序。

小结:

  • 上下文用 messages 数组,不要拼大字符串。
  • 接力时把上一步输出 append 成 assistant。
  • n8n 用 Set + Expression,Dify 用输入字段或会话变量。
  • 长对话用 session_id + 摘要,保留 system 和最近轮次。
  • 每次调用后打印完整 messages 验证。
版权声明:本文来自 GJ站长论坛《AI 工作流中多个模型怎么接力调用不丢上下文?》
原文链接:https://www.gj0.com/thread-482.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。

全部回复 0

还没有回复,来抢沙发~