news 2026/6/11 7:10:36

用Python和LangChain复刻斯坦福AI小镇:手把手教你搭建自己的Generative Agents沙盒

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用Python和LangChain复刻斯坦福AI小镇:手把手教你搭建自己的Generative Agents沙盒

用Python和LangChain构建Generative Agents沙盒:从理论到实践的完整指南

想象一下,在一个虚拟小镇里,25位数字居民过着各自的生活——他们记得昨天的对话,会主动规划今天的行程,甚至能自发组织情人节派对。这正是斯坦福"Generative Agents"项目展示的惊人场景。本文将带你用Python和LangChain一步步重建这个神奇世界,无需学术论文的复杂数学,只需基础的编程知识和一台普通电脑。

1. 环境搭建与核心工具链

构建Generative Agents沙盒需要精心设计的工具组合。我们选择Python 3.10+作为基础环境,因为它提供了丰富的AI生态系统支持。以下是推荐的工具栈配置:

# 创建虚拟环境 python -m venv ai_town source ai_town/bin/activate # Linux/Mac ai_town\Scripts\activate # Windows # 安装核心依赖 pip install langchain==0.0.330 openai==1.3.0 pygame==2.5.0 numpy==1.24.0

关键组件分工明确:

  • LangChain:处理记忆流、反射机制和计划生成
  • OpenAI API:作为大语言模型(LLM)引擎
  • Pygame:实现2D可视化界面
  • NumPy:支持向量计算和相似度检索

提示:建议使用conda管理Python版本,避免不同项目间的依赖冲突。如果GPU可用,可额外安装CUDA加速库。

配置环境变量保存API密钥:

# config.py import os os.environ["OPENAI_API_KEY"] = "sk-your-key-here" # 替换为实际密钥

2. Agent架构设计与实现

Generative Agents的核心在于其独特的认知架构。我们将其分解为四个相互关联的子系统:

2.1 记忆流系统

记忆流是Agent经历的连续记录,采用环形缓冲区实现以避免无限增长:

class MemoryStream: def __init__(self, capacity=1000): self.buffer = [] self.capacity = capacity def add(self, description, importance=5): """添加新记忆""" memory = { "timestamp": time.time(), "description": description, "importance": importance, "last_access": None } if len(self.buffer) >= self.capacity: self.buffer.pop(0) self.buffer.append(memory)

记忆检索函数结合三个关键维度:

维度计算方式权重
临近度指数衰减函数0.3
重要度LLM直接评分0.4
相关度余弦相似度0.3

2.2 反射生成机制

当重要事件累积到阈值时触发反射过程:

def generate_reflection(agent): """生成高阶反思""" recent_memories = agent.memory.get_recent(100) if sum(m['importance'] for m in recent_memories) < 15: return None prompt = f"""基于以下记忆,请指出3个最值得反思的主题: {chr(10).join(m['description'] for m in recent_memories)} """ themes = llm(prompt) insights = [] for theme in themes: related = agent.memory.retrieve(theme) insight_prompt = f"关于'{theme}',你能得出什么深层见解?相关记忆:{related}" insights.append(llm(insight_prompt)) return insights

2.3 计划与反应系统

Agent的日常计划采用层级分解策略:

  1. 日计划:早晨生成的总体安排
    • "作为咖啡店老板,今天要进货、培训新员工、推出特饮"
  2. 时段计划:分解为2-3小时块
    • "9:00-11:00:检查库存并下订单"
  3. 具体行动:15-30分钟粒度
    • "9:00:打开电脑查看供应商邮件"
def generate_plan(agent, time_range): prompt = f"""作为{agent.role_description},请为{time_range}制定计划。 当前时间:{current_time} 近期记忆:{agent.memory.get_summary()} """ return llm(prompt).split('\n')

3. 沙盒环境构建

使用Pygame创建2D可视化环境,关键类结构如下:

class Sandbox: def __init__(self, width=800, height=600): self.agents = [] self.objects = [] self.space = pygame.display.set_mode((width, height)) def add_agent(self, agent): agent.sandbox = self self.agents.append(agent) def update(self): """每帧更新所有Agent状态""" for agent in self.agents: agent.step() # 碰撞检测、事件处理等 self._handle_interactions()

环境中的对象采用树状结构组织:

小镇中心 ├─ 咖啡店 │ ├─ 吧台 │ ├─ 厨房 │ └─ 休息区 └─ 公园 ├─ 长椅 └─ 喷泉

4. 多Agent交互实现

Agent间的对话是系统最迷人的部分。当两个Agent进入交互范围时:

  1. 发起方检索关于对方的记忆
  2. 生成对话开场白
  3. 接收方结合上下文回应
  4. 持续交换直到自然结束
class Agent: def initiate_chat(self, other): # 检索关于对方的记忆 memories = self.memory.retrieve(f"关于{other.name}") prompt = f"""你({self.name})想和{other.name}聊天。 你的角色:{self.role} 对方角色:{other.role} 相关记忆:{memories} 请生成开场白:""" opening = llm(prompt) return other.respond_to(self, opening)

5. 完整系统集成

将所有模块组合成可运行系统:

def main(): # 初始化环境 sandbox = Sandbox() # 创建Agent群组 for i in range(25): role = random.choice(ROLES) # 预设角色描述 agent = GenerativeAgent(name=f"Agent_{i}", role=role) sandbox.add_agent(agent) # 主循环 clock = pygame.time.Clock() running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False sandbox.update() render(sandbox) clock.tick(30) # 30FPS

优化技巧:

  • 批处理LLM调用:将多个Agent的请求合并发送,减少API调用
  • 本地缓存:对常见查询结果建立缓存字典
  • 异步更新:非关键系统使用后台线程更新

6. 调试与效果优化

开发过程中常见问题及解决方案:

问题现象可能原因解决方法
Agent行为重复记忆检索范围过窄扩大检索窗口,增加随机性
对话不自然提示词过于简单添加对话历史和性格参数
性能下降记忆流膨胀实现记忆压缩和摘要功能

添加可视化调试面板:

def draw_debug(surface, agent): font = pygame.font.SysFont('Arial', 14) # 显示当前状态 texts = [ f"Name: {agent.name}", f"Location: {agent.location}", f"Current Action: {agent.current_action}", "Recent Memories:" ] + [m['description'][:50] for m in agent.memory.get_recent(3)] for i, text in enumerate(texts): surface.blit(font.render(text, True, (0,0,0)), (10, 10+i*20))

7. 进阶扩展方向

基础系统运行稳定后,可以考虑:

  • 情感系统:为记忆添加情感标记
  • 长期目标:超越日常计划的远大追求
  • 环境学习:Agent对空间建立认知地图
  • 用户扮演:允许人类控制特定Agent

实现情感影响行为的示例:

def emotional_adjustment(agent, memory): """根据情感状态调整行为""" if agent.mood == "angry": return f"{memory} (这件事让我非常生气)" elif agent.mood == "happy": return f"{memory} (回想起来仍感到开心)" return memory

在项目开发过程中,最令人惊喜的时刻是看到Agent们自发组织活动——就像我在测试中观察到,几个Agent在没有预设脚本的情况下,竟然协调举办了一场生日派对。这种突现行为正是Generative Agents的魅力所在。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 7:05:40

身份证与 IC 卡、IC 卡与 NFC

身份证与 IC 卡 1、身份证身份证是法律证件&#xff0c;用来证明“你是谁”内部有一颗安全芯片&#xff08;属于 IC 卡的一种&#xff09;&#xff0c;它高度加密&#xff0c;采用国密算法&#xff0c;专用于公安授权的读卡设备&#xff0c;例如&#xff0c;车站闸机普通手机或…

作者头像 李华
网站建设 2026/6/11 7:05:18

避坑指南:在Pico上玩转SD卡和I2S播放WAV,这些SPI速率和内存细节别忽略

Pico音频开发实战&#xff1a;SD卡与I2S的高效协同设计 当你在Pico上实现SD卡音频播放时&#xff0c;是否遇到过音频卡顿、爆音或系统崩溃&#xff1f;这背后往往隐藏着SPI速率、内存管理和硬件协同的深层问题。作为一款资源受限的微控制器&#xff0c;Pico需要开发者精确把控每…

作者头像 李华
网站建设 2026/6/11 7:04:58

告别IPMI!用Redfish API + Python脚本自动化管理你的Dell/HP服务器

告别IPMI&#xff01;用Redfish API Python脚本自动化管理你的Dell/HP服务器凌晨三点&#xff0c;数据中心的告警铃声又一次响起。你揉着惺忪的睡眼&#xff0c;不得不逐台登录不同厂商的服务器管理界面&#xff0c;检查硬件状态、更新固件——这样的场景是否似曾相识&#xf…

作者头像 李华
网站建设 2026/6/11 7:02:51

用MSP430G2553的ADC和PWM,DIY一个简易光控呼吸灯(附完整代码与电路图)

基于MSP430G2553的光控呼吸灯实战&#xff1a;从ADC采样到PWM调光全解析在嵌入式系统开发中&#xff0c;将模拟信号采集与数字控制相结合是常见需求。MSP430G2553作为TI经典的超低功耗微控制器&#xff0c;其内置的ADC模块和定时器PWM功能为这类应用提供了理想解决方案。本文将…

作者头像 李华
网站建设 2026/6/11 7:00:59

开箱即用的68点人脸关键点检测工具:含dlib预训练模型与运行脚本

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;直接调用dlib官方训练的shape_predictor_68_face_landmarks.dat模型&#xff0c;通过facial_landmarks.py脚本一键完成人脸68个关键点定位。支持标准RGB图像输入&#xff0c;自动输出眉毛、眼睛、鼻子、嘴唇、下…

作者头像 李华