排查动态上下文问题
修复动态上下文更新到达过晚、触发意外响应,或在刷新或重连后看似被忽略的问题。
当动态上下文更新似乎不起作用时,请使用此页面。先从下面四项检查开始,然后如果问题仍然存在,再查看各症状部分。
第一步检查
在深入查看详细症状之前,先执行这四项检查:
会话已连接
获取聊天机器人连接状态 返回 已连接
网络刷新是否能到达 Convai
本地跟踪器已接受该值
获取上下文状态值 返回预期的 输出值 之后立即 设置上下文状态
蓝图连线和 名称 引脚是否正确
在对话轮次之前刷新已完成
等待一个防抖周期(ContextDebounceWindow,默认 0.5 秒),或者将 bFlushImmediately = true 设为连接后
时间安排是否导致角色在更新到达前作出响应
ShouldRespond 符合你的意图
从不 → run_llm: "false"; Auto → run_llm: "auto"; 始终 → run_llm: "true"
更新是否使用了你期望的连线值发送
上下文更新看起来被忽略了
运行时对话测试未反映该状态
症状: 你调用了 设置上下文状态 ,但在一次端到端运行时测试之前,测试没有反映该状态值。
原因 1 — 更新到达时机晚于对话轮次。 防抖计时器会在最后一次暂存更新后触发。如果玩家在计时器到期前说话,Convai 会在没有该更新的情况下处理这轮对话。
修复: 将更新更早发送到游戏流程中,或者在时序关键时将 bFlushImmediately = true bFlushImmediately
验证: 获取上下文状态值 在本地返回预期值。如果确实如此,而角色仍然没有提及该状态,请在对话轮次前增加提前量,或者使用 bFlushImmediately = true.
原因 2 — ShouldRespond 为 从不,因此该更新使用了 run_llm: "false".
修复: 如果此更新应使用不同的连线值,请使用 ShouldRespond = Auto 或 ShouldRespond = Always 用于该调用。保留 从不 用于只应更新上下文的背景事实。
验证: 确认节点引脚使用了预期的 ShouldRespond 值,然后再暂存更新。
原因 3 — 在你期望网络刷新时,会话尚未连接。 暂存的更新会在离线状态下累积,但直到连接加防抖之后才会到达 Convai。
修复: 检查 获取聊天机器人连接状态 在测试对话行为之前。
验证: 获取聊天机器人连接状态 返回 已连接 在依赖它的测试轮次之前。
移除上下文状态没有明显效果
症状: 你调用了 移除上下文状态 但角色仍然引用已移除的值。
原因: 移除已被暂存,但在对话轮次发生时尚未刷新,或者同一个事实存在于动态上下文跟踪器之外。
修复: 设置 bFlushImmediately = true 在 移除上下文状态 在聊天机器人连接后调用。如果在确认刷新后该值已从跟踪器中消失,请检查此动态上下文页面之外其他项目特定的上下文来源。
验证: 获取上下文状态值 对已移除键的 false 在刷新后返回
防抖时序带来的意外
多次快速更新会合并为一次刷新
症状: 你调用了 设置上下文状态 在单个 tick 中调用了十次,却只观察到一次动态上下文发送。
原因: 这是预期的防抖行为。快速更新在 ContextDebounceWindow 内会合并为一次刷新。
修复: 无需修复。如果你需要分开发送,请将调用间隔放在防抖窗口之外。不建议在实时游戏中针对每次状态变化都发送单独的即时刷新。
验证: 等待一个防抖周期,并用 获取上下文状态值.
更新在快速对话轮次之后到达得太晚
症状: 某个测试轮次在游戏事件推动状态更新后立即开始,而刷新尚未完成。
原因: 防抖窗口使刷新延迟到了对话轮次之后。
修复: 设置 bFlushImmediately = true 在上下文更新调用中,或者更早地推送更新(例如在进入区域时,而不是在对话开始时)。对于重要事件, Add Context Event 其带有 ShouldRespond = Always 发送 run_llm: "true".
验证: 请确认 获取聊天机器人连接状态 为 已连接 并允许刷新在依赖的对话轮次之前完成。
ContextMaxDebounceWindow 在详情面板中不可见
症状: 你想调整防抖上限,但找不到 ContextMaxDebounceWindow.
原因: 底层字段 ContextDebounceWindow 是位于 ContextMaxDebounceWindow 是 高级显示 属性,位于 Convai > DynamicContext.
修复: 展开 高级 详情面板中的该部分,并查找 上下文防抖窗口(秒) 是位于 最大防抖窗口(秒).
验证: 展开后,这两个标签都会可见 高级.
ShouldRespond 误用
健康状态更新发送 run_llm 意外地
run_llm 意外地症状: 每次调用 设置上下文状态 用于 PlayerHealth 都以 ShouldRespond = Auto 或 始终.
原因: ShouldRespond 被设置为 Auto 或 始终 在 设置上下文状态 节点进行暂存。
修复: 使用 ShouldRespond = Never 用于背景状态。保留 Auto 或 始终 用于那些连线 run_llm 值应该为 "auto" 或 "true".
验证: 该 设置上下文状态 节点,用于 PlayerHealth 具有 ShouldRespond 设置为 从不.
事件更新没有发送预期的 run_llm
run_llm症状: 你调用了 Add Context Event 用于一个重要的上下文事件,但该更新没有使用 run_llm 你期望的值。
原因: ShouldRespond 未被设置为你想要的枚举值,或者同一防抖窗口中的另一个暂存项改变了聚合优先级。
修复: 设置 ShouldRespond = Always 在更新应发送 run_llm: "true"时。使用 是否在说话 仅作为本地状态检查,当你编排自己的蓝图逻辑时。
验证: 暂时切换为 ShouldRespond = Always 单独测试,并确认更新是以 run_llm 设置为 "true".
重置动态上下文并重新连接
重置动态上下文后,本地状态仍然出现
症状: 你调用了 重置动态上下文的 Actor,但 获取上下文状态值 仍返回 true 对于你期望清除的键。
原因: 重置尚未刷新,或者在 Reset 调用之后暂存了新状态。
修复: 在从空动态上下文开始时,先让重置刷新完成,再暂存新的状态值。
验证: 获取上下文状态值 对已清除键的 false 在重置刷新后返回
重置没有清除全部内容
症状: 重置动态上下文 已完成,但相关运行时数据仍然出现在项目中。
原因: 重置动态上下文 仅作用于 运行时动态上下文跟踪器仅。它会在发送 Reset 上下文更新后清除已跟踪的状态和事件,但其他更新路径是分开的。
修复: 将 DynamicEnvironmentInfo 如果这些文本也需要更改,请显式更新。将动作和场景元数据通过各自的环境元数据路径进行更新。
验证: 获取上下文状态值 返回 false 对已清除键返回,如果仍有任何数据,则通过相应的非跟踪器更新路径处理。
重置动态上下文 会清除本地状态跟踪器并发送一个 Reset 上下文更新。它不会清除 DynamicEnvironmentInfo 或环境元数据。
离线 Reset 后暂存的更新消失了
症状: 你调用了 重置动态上下文 在 BeginPlay,然后暂存了新状态,但角色始终看不到新数据。
原因: 重置动态上下文 会在第一次连接后的刷新时标记一个待处理的 Reset ,该项会在 在 暂存内容。无论是在 Reset 调用之前还是之后暂存的,只要处于同一个离线窗口中,这都适用于暂存更新。
修复: 连接后先让重置刷新完成,然后再暂存新的 设置上下文状态 或 Add Context Event 调用。
验证: 在第一次连接后的刷新之后, 获取上下文状态值 返回 false 对那些本应已被清除的键。
上下文更新诊断流程
在完成第一步检查后使用此流程。沿着从本地跟踪器状态到连接状态、刷新时机以及预期的 run_llm 值来查看各分支。
下一步
同步行为与时序动态上下文 Blueprint 参考最后更新于
这有帮助吗?