
这篇文章分析 Generative Agents 中的 感知 Perceive 模块 ,是 Persona 类认知链 Perceive → Retrieve → Plan → Reflect → Execute
中的第一环。主要功能如下:
- 空间感知:识别角色周围可见的瓦片(tiles),并更新其空间记忆树。
- 事件感知:识别角色视野范围内正在发生的事件,并判断是否为新事件。
- 记忆存储 :将新感知到的事件写入联想记忆(
associative memory
)。 - 重要性评分:通过 GPT 模型对事件进行"显著性"(poignancy)评分,用于后续行为决策。
主要函数详解
1. generate_poig_score
python
def generate_poig_score(persona, event_type, description):
- 作用:根据事件类型和描述,使用 GPT 模型计算事件的重要性分数。
- 逻辑 :
- 如果是空闲状态(如
"is idle"
),返回固定值1
。 - 如果是普通事件(event),调用
run_gpt_prompt_event_poignancy()
获取评分。 - 如果是聊天事件(chat),调用
run_gpt_prompt_chat_poignancy()
获取评分。
- 如果是空闲状态(如
2. perceive
输入:
- persona: 当前角色实例。
- maze: 地图实例,提供位置与事件信息。
输出:
ret_events
: 一组感知到的新事件,每个事件是一个<ConceptNode>
对象。
python
def perceive(persona, maze):
这是整个模块的核心函数,负责完成以下任务:
A. 空间感知
python
nearby_tiles = maze.get_nearby_tiles(persona.scratch.curr_tile, persona.scratch.vision_r)
- 获取当前角色视野范围内的所有瓦片。
- 更新角色的空间记忆树(
s_mem.tree
),记录世界、区域、场景、游戏对象等信息。
B. 事件感知
python
for tile in nearby_tiles:
...
- 遍历所有附近瓦片,收集其中的事件。
- 过滤掉重复事件(一个事件可能跨多个瓦片)。
- 根据距离排序,保留最近的
<att_bandwidth>
个事件。
C. 事件处理与记忆更新
python
latest_events = persona.a_mem.get_summarized_latest_events(...)
if p_event not in latest_events
# 调用 openai 模型能力 gpt_structure.py
event_embdding = get_embedding(deesc_embedding_in)
# 调用 openai 模型能力。Get event poignancy.
event_poignancy = generate_poig_score(persona,
"event",
desc_embedding_in)
chat_poignancy = generate_poig_score(persona, "chat",
persona.scratch.act_description)
# 调用 openai 模型能力 gpt_structure.py
def generate_poig_score(persona, event_type, description):
if "is idle" in description:
return 1
if event_type == "event":
return run_gpt_prompt_event_poignancy(persona, description)[0]
elif event_type == "chat":
return run_gpt_prompt_chat_poignancy(persona,
persona.scratch.act_description)[0]
- 判断事件是否为新事件(不在最近记忆中)。
- 提取关键词、生成嵌入向量(embedding)、计算显著性评分。
- 若事件是角色自身的对话,则一并保存对话内容。
D. 记忆写入
python
persona.a_mem.add_chat(...)
persona.a_mem.add_event(...)
- 将新聊天/事件写入联想记忆。
- 更新角色临时记忆中的重要性阈值(
importance_trigger_curr
)。
设计亮点
多层级空间记忆
- 使用树状结构存储世界、区域、场景、物体,便于快速定位。
- 支持动态扩展,适用于复杂环境。
距离优先的注意力机制
- 使用
<att_bandwidth>
控制最大感知事件数。 - 优先感知距离近的事件,避免信息过载。
显著性评分机制
- 利用 GPT 模型评估事件重要性。
- 分别支持普通事件与聊天事件的评分模型。
记忆去重机制
- 使用集合(
set()
)过滤重复事件。 - 保证每次只处理真正的新事件。
关键参数说明
参数 | 描述 |
---|---|
vision_r |
角色视野半径(单位:tile) |
att_bandwidth |
最多感知的事件数量 |
retention |
用于判断是否为新事件的时间窗口(步数) |
这些参数控制角色的感知能力,可用于模拟不同性格或能力的角色。
总结
perceive.py
是 生成式智能体认知架构 的第一环,负责从环境中提取事件与空间信息,并将其转化为机器可理解的记忆节点。它具备以下核心能力:
功能 | 描述 |
---|---|
空间感知 | 构建角色的空间记忆树 |
事件感知 | 识别视野内的事件并去重 |
显著性评分 | 使用 GPT 模型评估事件重要性 |
内存更新 | 将新事件写入联想记忆供后续模块使用 |
它是构建完整智能体行为链条的基础模块,直接影响后续的记忆检索、规划与执行过程。