Generative agents 代码分析 感知

这篇文章分析 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

输入:

  1. persona: 当前角色实例。
  2. 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 模型评估事件重要性
内存更新 将新事件写入联想记忆供后续模块使用

它是构建完整智能体行为链条的基础模块,直接影响后续的记忆检索、规划与执行过程。

相关推荐
韦东东3 小时前
RAGFlow v0.20的Agent重大更新:text2sql的Agent案例测试
人工智能·大模型·agent·text2sql·ragflow
ASS-ASH6 小时前
AI时代之向量数据库概览
数据库·人工智能·python·llm·embedding·向量数据库·vlm
带刺的坐椅6 小时前
用 10 行 Java8 代码,开发一个自己的 ClaudeCodeCLI?你信吗?
java·ai·llm·agent·solon·mcp·claudecode·skills
技术狂人16811 小时前
2026 智能体深度解析:落地真相、红利赛道与实操全指南(调研 100 + 案例干货)
人工智能·职场和发展·agent·商机
熊猫钓鱼>_>14 小时前
OpenClaw技术分析报告
ai·agent·skill·clawdbot·openclaw·meltbot·wise
aopstudio15 小时前
OpenClaw 实测体验:Agent 框架现在到底能不能用?
人工智能·llm·agent·openclaw
千桐科技1 天前
qKnow 知识平台核心能力解析|第 03 期:结构化抽取能力全流程介绍
大模型·llm·知识图谱·知识库·rag·qknow·知识平台
laplace01231 天前
Claude Code 逆向工程报告 笔记(学习记录)
数据库·人工智能·笔记·学习·agent·rag
沛沛老爹1 天前
跨平台Agent Skills开发:适配器模式赋能提示词优化与多AI应用无缝集成
人工智能·agent·适配器模式·rag·企业转型·skills
AI Echoes1 天前
LangChain Runnable组件重试与回退机制降低程序错误率
人工智能·python·langchain·prompt·agent