camel-ai/oasis · 上手攻略

  • 仓库:camel-ai/oasis
  • 链接:https://github.com/camel-ai/oasis
  • 分类:agent(社交仿真 / 大规模 LLM Agent)
  • 作者:spark
  • 更新:2026-07-16

是什么

OASIS(Open Agent Social Interaction Simulations with One Million Agents)是 CAMEL-AI 团队开源的"百万级 LLM Agent 社交模拟器"。它不是单 Agent 框架,也不是 Chatbot 工具,而是一个离散时间步的社交媒体沙盘:用 LLM 驱动的"虚拟用户",在仿 Twitter / Reddit / 电商平台里互相关注、发帖、点赞、评论、转发、举报、群聊,从而让研究者能在受控环境里观察信息扩散、回音壁、群体极化、跟风、虚假信息传播等社会动力学现象。GitHub 4.9k+ Star、Apache-2.0、Python 包名 camel-oasis,主仓库最近一次重要更新为 2025-12 的 camel-ai==0.2.78 同步。

它本质上是一个多智能体强化式仿真环境,采用了类 PettingZoo 的接口(reset / step / close),可以与 RL 库或纯 LLM 调用结合。论文 2024-11 上 arXiv(2411.11581),属于学术可复现的研究型项目,形态介于"工具"和"benchmark"之间。

解决什么问题

研究大规模社交现象时,真实平台要么不可实验(伦理/合规)、要么数据不可得,要么尺度不够。OASIS 提供三件事:

  1. 可控可复现:固定随机种子、固定 prompt、固定模型,可以精确复现"100 万 agent 在 30 天里发生了什么"。
  2. 可大规模:声称可扩展到 1,000,000 个 agent,官方实测 100 agent 单步 token 量约 335,600 输入 + 16,750 输出;用户需自行按激活概率(activation probability)× 时间步估算成本。
  3. 可量化:内置 SQLite 数据库记录全部 action 和 post 状态,研究者可以离线跑传播、影响力、极化、回流等指标。

典型场景:研究错误信息传播、群体极化的形成机制、推荐算法对回音壁的放大、平台治理(举报、限流、删帖)的效果、做社会计算的仿真 demo 给非技术受众看、做 AI 红队/对抗仿真。

快速安装

系统要求

  • Python ≥ 3.10(CAMEL 与 OASIS 已普遍要求 3.10+)
  • 能访问 LLM API(OpenAI 兼容、或通过 CAMEL 适配 Qwen / DeepSeek 等)
  • 磁盘:单次中等规模模拟产出几百 MB~几 GB 的 SQLite 都常见

安装命令

# 1) 创建虚拟环境
python3 -m venv .venv && source .venv/bin/activate

# 2) 安装 OASIS(PyPI 包名 camel-oasis)
pip install -U camel-oasis

# 3) CAMEL 通常会被作为依赖拉入;如未带或要最新版:
pip install -U camel-ai

# 4) 准备 LLM 凭证(以 OpenAI 为例)
export OPENAI_API_KEY="sk-..."

注意:包名是 camel-oasis,仓库名是 oasis。导入语句是 import oasis,与包名不同,踩坑过一次。

数据准备

需要一个 agent profile 文件,描述每个虚拟用户的人口属性、兴趣等。仓库自带示例:

# 从 GitHub 下载示例 profile
mkdir -p ./data/reddit
wget https://raw.githubusercontent.com/camel-ai/oasis/main/data/reddit/user_data_36.json \
     -O ./data/reddit/user_data_36.json

核心用法

下面是 README 给出的最小可运行 demo(基于 CAMEL 的 ModelFactory + oasis.make):

import asyncio
import os

from camel.models import ModelFactory
from camel.types import ModelPlatformType, ModelType

import oasis
from oasis import (ActionType, LLMAction, ManualAction,
                   generate_reddit_agent_graph)

async def main():
    # 1) 定义模型(也可用 Qwen / DeepSeek 等 OpenAI 兼容端点)
    openai_model = ModelFactory.create(
        model_platform=ModelPlatformType.OPENAI,
        model_type=ModelType.GPT_4O_MINI,
    )

    # 2) 声明允许的 action(OASIS 共 23 种)
    available_actions = [
        ActionType.LIKE_POST, ActionType.DISLIKE_POST,
        ActionType.CREATE_POST, ActionType.CREATE_COMMENT,
        ActionType.LIKE_COMMENT, ActionType.DISLIKE_COMMENT,
        ActionType.SEARCH_POSTS, ActionType.SEARCH_USER,
        ActionType.TREND, ActionType.REFRESH,
        ActionType.DO_NOTHING,
        ActionType.FOLLOW, ActionType.MUTE,
    ]

    # 3) 生成 agent 图(profile 决定每个 agent 的人设)
    agent_graph = await generate_reddit_agent_graph(
        profile_path="./data/reddit/user_data_36.json",
        model=openai_model,
        available_actions=available_actions,
    )

    db_path = "./data/reddit_simulation.db"
    if os.path.exists(db_path):
        os.remove(db_path)

    # 4) 构造环境
    env = oasis.make(
        agent_graph=agent_graph,
        platform=oasis.DefaultPlatformType.REDDIT,
        database_path=db_path,
    )
    await env.reset()

    # 5) 第一步:手动注入两个 agent 的开场动作
    actions_1 = {}
    actions_1[env.agent_graph.get_agent(0)] = [
        ManualAction(action_type=ActionType.CREATE_POST,
                     action_args={"content": "Hello, world!"}),
        ManualAction(action_type=ActionType.CREATE_COMMENT,
                     action_args={"post_id": "1",
                                  "content": "Welcome to the OASIS World!"}),
    ]
    actions_1[env.agent_graph.get_agent(1)] = ManualAction(
        action_type=ActionType.CREATE_COMMENT,
        action_args={"post_id": "1",
                     "content": "I like the OASIS world."},
    )
    await env.step(actions_1)

    # 6) 第二步:让所有 agent 自由行动(用 LLM 决策)
    actions_2 = {agent: LLMAction()
                 for _, agent in env.agent_graph.get_agents()}
    await env.step(actions_2)

    await env.close()

if __name__ == "__main__":
    asyncio.run(main())

跑完后 ./data/reddit_simulation.db 里就是完整的动作与帖子流,可以直接用 SQLite 客户端或 pandas 读出来做指标分析。

常用进阶开关

  • 激活概率:每步只有部分 agent 被唤醒(避免全量 LLM 调用爆 token),典型值 0.1~0.5。
  • 推荐算法:支持 interest-based 与 hot-score-based,可注入自己的排序函数研究回音壁。
  • 多模态扩展:官方 roadmap 已列入"支持多模态平台"。
  • 群聊:2025-06 加入 create/send/leave group chat。
  • Interview Action:向指定 agent 提问并收集回答(2025-06)。
  • 报告 / 举报:2025-06 加入 REPORT_POST 用于模拟内容审核。

典型适用场景

  1. 学术论文复现:信息扩散 / 回音壁 / 群体极化 / 平台治理(参考 arXiv 2411.11581)。
  2. 红队 / 对抗演练:研究虚假账户、bot 网络、舆论操纵的传播模型。
  3. 推荐算法实验:在受控用户群上 A/B 不同排序策略,量化回音壁与长尾。
  4. 教学演示:直观展示"1000 个 LLM 在一周内都聊了什么",做 AI 伦理与社会计算的课堂案例。
  5. 预训练数据合成:用 OASIS 跑出大量"逼真"对话帖,作为下游训练语料(注意合规)。

坑与注意

  • Token 成本:100 agent × 1 step × activation 1.0 已经要 33 万输入 token;上 10k agent 单步轻松破百万 token。预算要做预案,建议先小规模跑通。
  • profile 生成本身也耗 LLM:批量 profile 走 LLM 生成,不要一次性塞 1k 上下文写几千人;profile 文件可以离线预处理。
  • SQLite 锁:并发写入要小心,官方默认单进程顺序 step。如果开多进程,迁移到 Postgres。
  • 可复现 ≠ 真实:仿真里的"传播动力学"是 LLM 行为涌现的近似,不等于真人;下结论时务必说明。
  • API 限流:大规模实验要上指数退避或代理池,否则容易 429 中断。
  • license 注意:Apache-2.0,商用与论文使用都 OK,但需保留 NOTICE。
  • 版本耦合:与 camel-ai 主包强绑定,跟随升级时关注 README 顶部 "Update camel-ai version" 公告。

与同类对比

工具 规模 接口 重点
OASIS 1M agent PettingZoo 风格 / asyncio 社交媒体 + 真实推荐 + 23 action
AgentSociety (THU) 10k+ RL + LLM 混合 城市级市民行为仿真
Generative Agents (Stanford) ~25 类文本日志 单小镇记忆与社交
Socially Fair / SOTOPIA <100 对话为主 社交能力评测
Concordia (DeepMind) 数十 组件式 通用社会模拟框架

OASIS 的核心差异是直接对标真实平台(Twitter/Reddit)的 action 与推荐,且规模到百万级——做大规模社会计算实验,目前最接近"可发表复现"的方案。

一句话推荐结论

想做"LLM 驱动的大规模社交仿真"且希望快速出可发表 demo,OASIS 是当前最省力的开源选择;规模超过 1 万 agent 请先把 token 预算与限流策略写进脚本。