For the complete documentation index, see llms.txt. This page is also available as Markdown.

排查动态上下文问题

修复动态上下文更新到达过晚、触发意外响应,或在刷新或重连后看似被忽略的问题。

当动态上下文更新似乎不起作用时,请使用此页面。先从下面四项检查开始,然后如果问题仍然存在,再查看各症状部分。

第一步检查

在深入查看详细症状之前,先执行这四项检查:

检查
如何验证
它告诉你什么

会话已连接

获取聊天机器人连接状态 返回 已连接

网络刷新是否能到达 Convai

本地跟踪器已接受该值

获取上下文状态值 返回预期的 输出值 之后立即 设置上下文状态

蓝图连线和 名称 引脚是否正确

在对话轮次之前刷新已完成

等待一个防抖周期(ContextDebounceWindow,默认 0.5 秒),或者将 bFlushImmediately = true 设为连接后

时间安排是否导致角色在更新到达前作出响应

ShouldRespond 符合你的意图

从不run_llm: "false"; Autorun_llm: "auto"; 始终run_llm: "true"

更新是否使用了你期望的连线值发送

1

确认会话已连接

调用 获取聊天机器人连接状态Convai 聊天机器人 组件。返回值应为 已连接 ,然后再期望网络刷新到达 Convai。

默认的防抖更新在连接前就已暂存,会安全地排队在 PendingContextBatch中。会话连接后,它们会在防抖期限已过的第一个 tick 上刷新。这是预期行为,不是错误。

2

验证本地跟踪器已接受该值

调用 获取上下文状态值 之后立即 设置上下文状态 并打印 输出值 引脚。如果 输出值 返回了预期值,则本地跟踪器已接受更新。

如果本地值正确,但运行时对话测试没有反映出来,请确认网络刷新已在测试轮次之前完成。

3

让防抖窗口过去

除非 bFlushImmediatelytrue,插件会等待 ContextDebounceWindow 秒(默认 0.5)后,在刷新前等到最后一次暂存更新之后的

4

检查 ShouldRespond 设置

如果更新已到达 Convai,但连线 run_llm 的值不是你想要的,请验证 ShouldRespond 在暂存更新的节点上。

上下文更新看起来被忽略了

运行时对话测试未反映该状态

症状: 你调用了 设置上下文状态 ,但在一次端到端运行时测试之前,测试没有反映该状态值。

原因 1 — 更新到达时机晚于对话轮次。 防抖计时器会在最后一次暂存更新后触发。如果玩家在计时器到期前说话,Convai 会在没有该更新的情况下处理这轮对话。

修复: 将更新更早发送到游戏流程中,或者在时序关键时将 bFlushImmediately = true bFlushImmediately

验证: 获取上下文状态值 在本地返回预期值。如果确实如此,而角色仍然没有提及该状态,请在对话轮次前增加提前量,或者使用 bFlushImmediately = true.


原因 2 — ShouldRespond从不,因此该更新使用了 run_llm: "false".

修复: 如果此更新应使用不同的连线值,请使用 ShouldRespond = AutoShouldRespond = 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 意外地

症状: 每次调用 设置上下文状态 用于 PlayerHealth 都以 ShouldRespond = Auto始终.

原因: ShouldRespond 被设置为 Auto始终设置上下文状态 节点进行暂存。

修复: 使用 ShouldRespond = Never 用于背景状态。保留 Auto始终 用于那些连线 run_llm 值应该为 "auto""true".

验证:设置上下文状态 节点,用于 PlayerHealth 具有 ShouldRespond 设置为 从不.


事件更新没有发送预期的 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 后暂存的更新消失了

症状: 你调用了 重置动态上下文BeginPlay,然后暂存了新状态,但角色始终看不到新数据。

原因: 重置动态上下文 会在第一次连接后的刷新时标记一个待处理的 Reset ,该项会在 暂存内容。无论是在 Reset 调用之前还是之后暂存的,只要处于同一个离线窗口中,这都适用于暂存更新。

修复: 连接后先让重置刷新完成,然后再暂存新的 设置上下文状态Add Context Event 调用。

验证: 在第一次连接后的刷新之后, 获取上下文状态值 返回 false 对那些本应已被清除的键。


上下文更新诊断流程

在完成第一步检查后使用此流程。沿着从本地跟踪器状态到连接状态、刷新时机以及预期的 run_llm 值来查看各分支。

下一步

同步行为与时序动态上下文 Blueprint 参考

最后更新于

这有帮助吗?