用Python+LLM复刻斯坦福AI小镇:手把手教你搭建自己的25个智能体沙盒
用Python+LLM构建智能体沙盒:从零实现25个AI角色的行为模拟
在游戏开发、社交模拟和自动化测试领域,构建可信的AI行为一直是个技术难题。传统方法要么依赖繁琐的状态机规则,要么需要海量的训练数据。现在,借助大语言模型(LLM)和Python生态,开发者可以快速创建具有记忆、规划和社交能力的智能体系统。本文将带你用不到200行核心代码,搭建一个简化版的斯坦福AI小镇模拟环境。
1. 环境搭建与基础架构
我们需要三个核心组件:LLM交互层、记忆管理系统和沙盒环境接口。以下是推荐的技术栈:
# 基础依赖 pip install openai python-dotenv numpy sentence-transformers fastapi uvicorn系统架构对比表:
| 模块 | 传统方法 | LLM方案 | 优势比较 |
|---|---|---|---|
| 行为生成 | 有限状态机 | 自然语言指令 | 无需预定义所有可能性 |
| 记忆系统 | 数据库固定字段 | 动态记忆流 | 支持模糊检索 |
| 社交交互 | 预设对话树 | 实时生成对话 | 更自然的上下文延续 |
创建基础Agent类时,我们需要定义几个关键属性:
class GenerativeAgent: def __init__(self, name, description): self.name = name self.description = description # 角色背景设定 self.memory_stream = [] # 记忆列表 self.current_plan = [] # 当前行动计划 self.location = "广场" # 初始位置提示:使用.env文件管理API密钥,避免硬编码。国内开发者可以考虑使用Moonshot、DeepSeek等兼容OpenAI API的国产大模型。
2. 记忆系统的工程实现
记忆流(Memory Stream)是智能体的核心组件,需要处理三种关键特性:
- 近期性(Recency):最近的事件权重更高
- 重要性(Importance):关键事件需要长期记住
- 相关性(Relevance):与当前情境关联的内容
实现记忆检索的函数示例:
def retrieve_memories(self, query_embedding, top_k=5): # 计算记忆的相关性得分 scores = [] for memory in self.memory_stream: recency = math.exp(-0.1 * (time.now() - memory.timestamp).hours) importance = memory.importance / 10 # 0-10分制 relevance = cosine_similarity(query_embedding, memory.embedding) composite_score = recency + importance + relevance scores.append((composite_score, memory)) # 返回得分最高的记忆 return sorted(scores, reverse=True)[:top_k]记忆系统优化技巧:
- 对长期记忆进行定期摘要(Reflection)
- 为不同类型记忆设置不同衰减系数
- 使用向量数据库优化大规模记忆检索
3. 行为规划与决策引擎
智能体的日常行为需要分层规划:
- 每日大纲:早晨生成的粗略计划(如"上午工作,下午社交")
- 小时计划:分解为具体活动(如"9:00-10:00 在咖啡厅写作")
- 即时动作:根据环境变化实时调整(如"与遇到的熟人聊天")
实现计划生成的代码框架:
def generate_plan(self): # 生成每日大纲 prompt = f"{self.description}\n当前时间:早上8点\n请生成今日计划大纲:" daily_plan = llm_query(prompt) self.add_memory(f"制定每日计划:{daily_plan}", importance=7) # 分解为具体时段计划 for chunk in split_daily_plan(daily_plan): detail_prompt = f"将'{chunk}'分解为具体活动,考虑角色特点:{self.description}" detailed_actions = llm_query(detail_prompt) self.current_plan.extend(parse_actions(detailed_actions))注意:实际项目中应该添加计划冲突检测和资源占用检查,避免多个智能体同时前往同一地点。
4. 多智能体社交模拟
当两个智能体相遇时,对话系统按以下流程工作:
- 检索彼此相关的记忆(过去互动、共同朋友等)
- 生成符合角色性格的初始对话
- 根据对方回应动态延续话题
- 将对话内容存入双方记忆
def generate_dialogue(self, other_agent): # 检索与对方相关的记忆 context_memories = self.retrieve_memories(other_agent.name) # 构建对话提示 prompt = f""" {self.description} 相关背景:{context_memories} 当前地点:{self.location} 遇到:{other_agent.name}({other_agent.description}) 请生成自然对话开场白: """ opening_line = llm_query(prompt) self.add_memory(f"与{other_agent.name}对话:{opening_line}", importance=5) return opening_line社交行为优化点:
- 为不同关系级别设置对话风格(陌生/朋友/亲密)
- 添加非语言交互(表情符号、肢体动作)
- 模拟信息传播的保真度
5. 沙盒环境与可视化
使用FastAPI搭建简单的Web界面:
from fastapi import FastAPI from fastapi.staticfiles import StaticFiles app = FastAPI() app.mount("/static", StaticFiles(directory="static"), name="static") @app.get("/agent/{agent_id}") async def get_agent_state(agent_id: int): agent = agents[agent_id] return { "name": agent.name, "location": agent.location, "current_action": agent.current_plan[0] if agent.current_plan else "空闲", "recent_memories": [m.text for m in agent.memory_stream[:3]] }前端可以使用Three.js或Phaser.js实现2D/3D可视化,关键是要显示:
- 智能体的实时位置
- 当前执行的动作
- 最近的重要记忆
- 社交关系网络图
在项目后期,可以添加以下高级功能:
- 环境物品的交互系统
- 天气和时间的影响因子
- 突发事件模拟(如公共活动)
- 长期关系发展算法
开发这类系统时最常见的挑战是LLM的响应延迟和API成本。我们可以通过以下方式优化:
- 对非关键决策使用较小模型
- 实现对话和计划的本地缓存
- 批量处理多个智能体的请求
- 设置合理的速率限制和退避策略
一个实用的调试技巧是为每个智能体创建日志文件,记录其决策过程和内存状态变化。当出现不符合预期的行为时,可以追溯完整的推理链条。
