注意力与指代锚定
后端如何解析模糊的玩家指代——以及对象描述和当前注意力对象如何影响目标解析。
什么是指代落地?
当玩家说“去那里”或“把那个拿起来”时,Convai 后端需要弄清楚他们指的是哪个对象或角色。这个过程——将自然语言中的模糊指代与场景中的具体事物关联起来——被称为 指代落地.
SDK 通过在会话开始时发送两类上下文,帮助后端进行指代落地:
对象和角色描述 ——场景中每个事物 是
当前注意对象 ——AI 当前 聚焦于
上下文越丰富,AI 就越能更好地解析含糊的玩家请求。
对象和角色描述
你在……中注册的每个对象和角色 ConvaiActionConfigSource 都有一个会发送到后端的文本字段:
对象(ConvaiActionObjectDefinition)
描述
描述该对象是什么,以及它在场景中的位置
角色(ConvaiActionCharacterDefinition)
简介
描述该角色是谁以及其职责
这些字段会在会话开始时包含在发送到 Convai 后端的会话配置中。后端会读取它们,以了解场景中的每个名称指代什么,并用它们来解析玩家讲话中的指代。
为什么描述很重要
比较同一个物理对象的这两个对象定义:
灭火器
(空)
后端只知道名称
灭火器
一个红色灭火器,安装在紧急出口左侧的墙上。
后端知道它是什么、它在哪里,并且可以根据上下文解析“红色那个”“靠近出口的那个”或“它”
将描述写成一句自然的句子,从场景上下文中描述对象。包含类型、颜色、位置或用途——任何有助于将该对象与其他对象区分开的细节。
编写有效描述
位置要具体:
一个黄色安全帽,挂在入口附近的设备架上。安装在北侧墙上、紧挨着出口标志的火警控制面板。
在相关时包含对象用途:
一个用于扑灭 A 类和 B 类火灾的便携式灭火器。切断整层电力的总电源关闭开关。
对角色,描述职责和位置:
站在培训室前方的资深安全讲师。负责监督仓库运营的现场主管。
避免含糊的描述:
场景中的一个对象。
一个木箱,堆放在装卸区门附近。
一个人。
站在主办公室入口旁的仓库经理。
设备。
一个急救箱,安装在消防出口旁边的墙上。
当前注意对象
该 注意对象 告诉后端 AI 当前聚焦的是哪个对象。当玩家使用代词或模糊指代(“去那里”“把它捡起来”)时,后端会使用当前注意对象来解析“它”的含义。
设置初始注意对象
在 ConvaiActionConfigSource,该 初始注意对象 字段会在会话开始时初始化注意力。将其设置为 名称 你已注册对象中的一个的
在会话开始时,后端接收 current_attention_object: "灭火器" 在配置中。如果玩家在未提及任何具体内容前说“告诉我它的情况”,后端就知道“它”指的是灭火器。
该 初始注意对象 必须与 名称 你已注册的某个 可操作对象 的字段完全匹配(不区分大小写)。如果不匹配,该字段将被忽略,并且会在控制台记录一条警告。
对话中的注意力
随着对话推进,后端会根据上下文动态更新其内部注意力——包括玩家和角色提到的对象、执行的动作等。后端会在大多数情况下自动处理。
运行时更新注意对象
对于需要显式控制的场景——例如玩家在 UI 中点击某个对象,或 NPC 移动到新的工作站—— ConvaiCharacter 提供在活动会话期间更新注意对象的方法:
SetCurrentAttentionObject(string name)
按对象名称设置注意对象(必须存在于会话的 Objects 列表中)
SetCurrentAttentionObject(ConvaiActionObjectDefinition obj)
使用类型化定义设置注意对象
ClearCurrentAttentionObject()
移除当前注意落地
SetCurrentAttentionObject 需要一个 活动会话。该名称必须与会话的 Objects 列表中已注册的条目匹配——它不会注册新目标。请在 ConnectAsync 完成后调用。
实际示例:消防安全培训模拟
消防安全培训室注册了以下对象:
灭火器
一个红色便携式二氧化碳灭火器,安装在主工作台左侧的墙上。
报警面板
安装在墙上的火警控制面板,带有一个大的红色把手,位于主门附近。
紧急出口
房间尽头带有绿色发光标志的紧急出口门。
急救箱
一个白色急救箱盒,安装在工作台和储物柜之间的墙上。
初始注意对象: 灭火器
在此设置下:
玩家: “我应该先去哪里?” AI: “先去灭火器那里。” → 后端将其落地到
灭火器
玩家: “现在呢?” AI: “拔掉保险销,并将其对准火焰底部。” → 注意对象仍然是
灭火器
玩家: “那个面板呢?” AI: “那是报警面板——你应该在使用灭火器之前触发它。” → 后端将“那个面板”落地到
报警面板根据描述上下文
提示
独特的名称有助于提高落地效果。 如果两个对象的名称相似(例如, 红色灭火器 和 蓝色灭火器),请让描述明显不同,以帮助后端区分它们。
名称在运行时按不区分大小写匹配,但它们会按原样作为文本发送到后端。请使用一致、自然的名称(推荐使用首字母大写格式: 灭火器,而不是 fire_extinguisher).
描述会在连接时发送到后端。 它们无法在会话中途更改。如果你的场景是动态的(对象生成或销毁),请考虑在每个会话前使用连接时覆盖以编程方式构建配置。
结论
指代落地使玩家能够自然地说话——使用代词、部分名称和依赖上下文的指代——而不是精确的对象名称。对象描述的质量和初始注意对象的准确性会直接影响 AI 解释玩家意图的可靠程度。把描述看作给 AI 的元数据:具体、具上下文,并用通俗语言编写。
最后更新于
这有帮助吗?