用 LLM 驱动的 Agent 人设模拟框架,支持复杂多 Agent 场景。适合快速原型化 Agent 应用和对话系统测试。
📄 新论文发布!查看我们的 TinyTroupe 论文(预印本),其中详细描述了该库及其用例。您可以在 publications/ 文件夹中找到相关实验和补充材料。
TinyTroupe 是一个实验性 Python 库,允许模拟具有特定个性、兴趣和目标的人。这些人工智能体(TinyPersons)可以听我们和彼此说话、做出回复,并在模拟的 TinyWorld 环境中过着生活。这是通过利用大型语言模型(LLM)的力量实现的,特别是 GPT-4,以生成逼真的模拟行为。这使我们能够在选定条件下研究各种令人信服的交互和消费者类型,具有高度可定制的角色。因此,重点是理解人类行为,而不是直接支持它(比如 AI 助手所做的那样)——这导致了除其他外一些只在模拟环境中才有意义的专门机制。此外,与其他类似游戏的基于 LLM 的模拟方法不同,TinyTroupe 旨在启发生产力和业务场景,从而促进更成功的项目和产品。以下是一些增强人类想象力的应用思路:
广告:TinyTroupe 可以在花费金钱之前,用模拟受众离线评估数字广告(例如 Bing 广告)!
软件测试:TinyTroupe 可以为系统(例如搜索引擎、聊天机器人或副驾驶)提供测试输入,然后评估结果。
训练和探索性数据:TinyTroupe 可以生成逼真的合成数据,随后可用于训练模型或进行机会分析。
产品和项目管理:TinyTroupe 可以阅读项目或产品提案,并从特定角色的角度提供反馈(例如医生、律师和一般知识工作者)。
头脑风暴:TinyTroupe 可以模拟焦点小组,并以极低的成本提供优质的产品反馈!
在以上所有情况以及许多其他情况下,我们希望实验者能够获得关于其感兴趣领域的见解,从而做出更好的决策。
我们在相对较早的阶段发布 TinyTroupe,因为仍有大量工作要做,但我们希望获得反馈和贡献,以引导开发朝着更有成效的方向发展。我们特别有兴趣找到新的潜在用例,例如在特定行业中的应用。
🚧 工作进行中:预期会有频繁更改。TinyTroupe 是一个正在进行的研究项目,仍在进行大规模开发,需要进一步完善。特别是,API 仍然会频繁变化。对 API 变体进行实验对于正确塑造它是必不可少的,但我们正在努力稳定它,并随着时间推移提供更一致和友好的体验。感谢您的耐心和反馈,因为我们继续改进该库。
⚖️ 阅读法律声明。TinyTroupe 仅用于研究和模拟。您对所生成的输出的任何使用负全部责任。适用各种重要的附加法律考虑事项,并对其使用进行约束。使用 TinyTroupe 前,请阅读下面的完整法律声明部分。
🏗️ 项目结构
查看一个示例"产品、诊断和欣赏反馈的视图(图像模态)"笔记本。
LLM API 缓存现在使用 JSON 而不是 pickle。
默认模型现在是 gpt-5-mini。重要提示:GPT-5 模型系列使用与之前的 GPT-4* 系列不同的参数,因此您可能需要相应调整 config.ini 设置。仍然支持旧模型(gpt-4.1-mini、gpt-4o-mini)。
引入 SimulationExperimentEmpiricalValidator,用于使用统计测试(t-test、KS-test)将模拟结果与真实的经验数据进行比较。这对于验证模拟与实际人类行为相匹配至关重要。
引入 AgentChatJupyterWidget,用于在 Jupyter 笔记本中直接与智能体进行交互式对话。
在客户端、环境和智能体级别添加新的成本跟踪工具,以监控 API 费用。
为本地模型添加实验/有限的 Ollama 支持。详见 Ollama 支持。
新的示例笔记本,演示对真实调查数据的经验验证。
注意:GPT-5 模型参数与 GPT-4 不同,因此请重新测试您的重要场景并相应调整配置。*
主要是改变了默认模型,现在设置为 GPT-4.1-mini。这似乎带来了相当大的质量改进。
请注意,GPT-4.1-mini 在行为上与之前的默认 GPT-4o-mini 相比可能有显著差异,因此请确保您使用 GPT-4.1-mini 重新测试您的重要场景并相应调整。
发布了 TinyTroupe 论文的第一版(作为预印本),其中更详细地描述了该库及其用例。您可以在 publications/ 文件夹中找到相关实验和补充材料。
TinyPersons 现在包括行动纠正机制,允许更好地遵守角色规范、自一致性和/或流畅性(详见我们同时发布的论文)。
TinyPersonFactory 类的实质性改进,现在:使用基于计划的方法生成新智能体,允许更好地对大型群体进行采样;并行生成智能体。
TinyWorld 现在在每个模拟步骤内并行运行智能体,允许更快的模拟。
引入 InPlaceExperimentRunner 类,允许在单个文件中运行受控实验(例如 A/B 测试)(通过多次运行)。
引入各种标准命题(Propositions),以便于运行常见的验证和智能体行为监控(例如 persona_adherence、hard_persona_adherence、self_consistency、fluency 等)。
现在通过 LLMChat 类以及 @llm 装饰器更好地支持内部 LLM 使用,该装饰器将任何标准 Python 函数转变为基于 LLM 的函数(即通过使用文档字符串作为提示的一部分,以及其他一些细微差别)。这旨在更轻松地继续推进 TinyTroupe,并允许对 LLM 工具可能性进行一些创意探索。
配置机制已重构,除了静态 config.ini 文件外,还允许动态程序化重新配置。
重命名 Jupyter 笔记本示例,以获得更好的可读性和一致性。
添加了许多更多测试。
注意:这可能会破坏一些现有程序,因为 API 在某些地方已更改。
现在角色具有更深层的规范,包括个性特征、偏好、信念等。我们可能在未来进一步扩展这个。
TinyPersons 现在也可以定义为 JSON 文件,并通过 TinyPerson.load_specification() 加载,以获得更大的便利性。加载 JSON 文件后,您仍然可以以编程方式修改智能体。有关示例,请参阅 examples/agents/ 文件夹。
引入片段(fragment)的概念,允许在不同智能体之间重用角色元素。有关示例,请参阅 examples/fragments/ 文件夹,以及《政治指南针(使用片段自定义智能体)》笔记本以了解演示。
引入基于 LLM 的逻辑命题,以便于智能体行为的监控。
引入干预机制(Interventions),允许指定对模拟的基于事件的修改。
子模块现在有自己的文件夹,允许更好的组织和增长。
注意:这可能会破坏一些现有程序,因为 API 在某些地方已更改。
要了解 TinyTroupe 的功能,以下是其使用的一些示例。这些示例在 examples/ 文件夹中可用,您可以检查预编译的 Jupyter 笔记本或在本地自行运行。注意 TinyTroupe 实验的交互性质——就像您使用 Jupyter 笔记本与数据交互一样,您可以使用 TinyTroupe 与模拟的人和环境交互,以获得见解。
♻️ 示例可能会随着时间的推移而更新,因此下面的屏幕截图可能与您在本地运行时看到的不完全一致。但是,总体结构和内容应该是相似的。
⬛ 目前,模拟输出在深色背景下更容易可视化,因此我们建议在 Jupyter 笔记本客户端中使用深色主题。
🧪 示例 1(来自 Interview with Customer.ipynb)
让我们从一个简单的客户采访场景开始,其中一位商业顾问接近一位银行家:
对话可以进行几步,不断深入挖掘,直到顾问对收集的信息感到满意;例如,一个具体的项目想法:对话可以进行几步,不断深入挖掘,直到顾问对收集的信息感到满意;例如,一个具体的项目想法:
让我们评估一些在线广告选项以选择最好的一个。以下是电视广告评估的一个示例输出:
现在,我们不必仔细阅读智能体所说的内容,而是可以提取每个智能体的选择,并以自动化的方式计算整体偏好:
以下是一个焦点小组开始头脑风暴 Microsoft Word 的新 AI 功能的情景。与其单独与每个智能体互动,我们操纵环境使它们彼此互动:
运行仿真后,我们可以以机器可读的方式提取结果,以便在其他地方重新使用(例如报告生成器);以下是上述头脑风暴会议的结果:
仿真最重要的方面之一是根据真实数据验证结果。在这个示例中,我们模拟了关于瓶装冷汤(一种冷的西班牙汤)的市场调查,然后将仿真结果与用真实人群进行的实际调查进行了对比:
我们使用统计测试(t 检验、KS 检验)来比较仿真智能体和真实受访者的响应分布:
另一个实证验证示例,这次用于更复杂的排名任务。我们模拟家长评估为孩子们提供的不同 AI 故事讲述设备选项,然后将仿真结果与真实调查数据进行了对比:
使用博尔达计数和第一选择份额分析,我们可以比较仿真偏好与实际偏好的匹配程度:
你可以在 examples/ 文件夹中找到其他示例。
运行该库,你需要:
Python 3.10 或更高版本。我们将假设你使用的是 Anaconda,但你可以使用其他 Python 发行版。
Git,用于克隆存储库和通过 pip 安装库。
访问 Azure OpenAI Service 或 Open AI GPT-4 API。你可以在此处获得 Azure OpenAI Service 的访问权限,在此处获得 OpenAI API 的访问权限。对于 Azure OpenAI Service,你需要将 AZURE_OPENAI_KEY 和 AZURE_OPENAI_ENDPOINT 环境变量分别设置为你的 API 密钥和端点。对于 OpenAI,你需要将 OPENAI_API_KEY 环境变量设置为你的 API 密钥。例如,在 Linux/macOS 上:export OPENAI_API_KEY=your-key-here,或在 Windows (PowerShell) 上:$env:OPENAI_API_KEY="your-key-here"。要持久化它,请将其添加到你的 shell 配置文件中,或在 Windows 上使用 setx OPENAI_API_KEY "your-key-here"。
对于 Azure OpenAI Service,你需要将 AZURE_OPENAI_KEY 和 AZURE_OPENAI_ENDPOINT 环境变量分别设置为你的 API 密钥和端点。
对于 OpenAI,你需要将 OPENAI_API_KEY 环境变量设置为你的 API 密钥。
例如,在 Linux/macOS 上:export OPENAI_API_KEY=your-key-here,或在 Windows (PowerShell) 上:$env:OPENAI_API_KEY="your-key-here"。要持久化它,请将其添加到你的 shell 配置文件中,或在 Windows 上使用 setx OPENAI_API_KEY "your-key-here"。
默认情况下,TinyTroupe config.ini 设置为使用 OpenAI API 和 gpt-5-mini 作为主要模型。之前的默认值(gpt-4.1-mini)现在被认为是遗留的,但仍然应该可以工作。你可以通过在你运行的程序或笔记本相同的文件夹中包含你自己的 config.ini 文件来自定义这些值。examples/ 文件夹中提供了一个 config.ini 文件示例。
内容过滤:为了确保仿真期间不会生成有害内容,强烈建议在 API 级别可用时使用内容过滤器。特别是,如果使用 Azure OpenAI,内容审核支持广泛,我们建议你使用它。有关如何执行此操作的详细信息,请参考相应的 Azure OpenAI 文档。如果内容过滤器到位,并且 API 调用被它们拒绝,该库将引发异常,因为它将无法在该点继续仿真。
TinyTroupe 是主要为 OpenAI 模型和兼容端点而开发的,以简化开发并专注于充分利用特定模型,而不是花时间尝试使其与任何模型都能很好地配合(这可能根本不可行)。因此,如果可能的话,请使用 OpenAI 模型和兼容端点。也就是说,社区对本地模型支持有很大需求,因此我们现在正在尝试通过部分 Ollama 支持和社区贡献者的帮助来提供这一功能。此外,使用本地模型的另一个原因是进行专为特征仿真设计的自定义模型研究——最终,这可能是支持此类功能的最佳原因。无论如何,这目前不是核心团队的优先事项,尽管我们正在尽力允许这种可能性。
有关如何在 TinyTroupe 中使用 Ollama 的详细信息,请参阅 Ollama 支持。
目前,官方推荐的安装库的方式是直接从此存储库,而不是 PyPI。你可以按照以下步骤操作:
如果未安装 Conda,你可以从此处获取。你也可以使用其他 Python 发行版,但为简起见,我们这里假设使用 Conda。
创建新的 Python 环境:conda create -n tinytroupe python=3.10
conda create -n tinytroupe python=3.10
激活环境:conda activate tinytroupe
conda activate tinytroupe
确保你已经按照先决条件部分的说明将 Azure OpenAI 或 OpenAI API 密钥设置为环境变量。
使用 pip 直接从此存储库安装库(我们不会从 PyPI 安装):pip install git+https://github.com/microsoft/TinyTroupe.git@main
pip install git+https://github.com/microsoft/TinyTroupe.git@main
现在你应该能够在你的 Python 代码或 Jupyter 笔记本中导入 tinytroupe 了。🥳
注意:如果你遇到任何问题,请尝试克隆存储库并从本地存储库安装,如下所述。
要实际运行这些示例,你需要将它们下载到本地机器。你可以通过克隆存储库来执行此操作:
克隆存储库,因为我们将执行本地安装(我们不会从 PyPI 安装):git clone https://github.com/microsoft/tinytroupe cd tinytroupe
git clone https://github.com/microsoft/tinytroupe
cd tinytroupe
现在你可以运行 examples/ 文件夹中的示例,或调整它们以创建你自己的自定义仿真。这些示例是 Jupyter 笔记本,因此你可以使用以下命令启动它们:jupyter notebook 然后在打开的浏览器界面中导航到 examples/ 文件夹。
jupyter notebook
如果你想修改 TinyTroupe 本身,你可以以可编辑模式安装它(即对代码的更改将立即反映):
克隆存储库,因为我们将执行本地安装(我们不会从 PyPI 安装):git clone https://github.com/microsoft/tinytroupe cd tinytroupe
git clone https://github.com/microsoft/tinytroupe
cd tinytroupe
以可编辑模式安装库:pip install -e .
pip install -e .
最近,我们看到 LLM 被用来模拟人类(例如这个),但很大程度上是在"类似游戏"的设置中用于冥想或娱乐目的。还有用于构建多智能体系统以解决问题和提供辅助 AI 的库,如 Autogen 和 Crew AI。如果我们结合这些想法并模拟人类来支持生产力任务会怎样?TinyTroupe 是我们的尝试。为此,它遵循以下原则:
程序化:智能体和环境在程序上被定义(在 Python 和 JSON 中),允许非常灵活的使用。它们还可以支撑其他软件应用!
分析性:旨在改进我们对人、用户和社会的理解。与娱乐应用不同,这是业务和生产力用例的关键方面。这也是我们建议将 Jupyter 笔记本用于仿真的原因,就像用于数据分析一样。
基于特征的:智能体旨在是人类的典型代表;为了获得更大的真实性和控制,鼓励对这类特征进行详细规范:年龄、职业、技能、品味、观点等。
多智能体:允许在定义良好的环境约束下进行多智能体交互。
工具驱动:提供许多机制来便于规范、仿真、提取、报告、验证等。这是处理仿真与处理助手工具有显著差异的一个领域。
实验导向:仿真由实验者迭代地定义、运行、分析和改进;因此提供了合适的实验工具。有关这一点的更多信息,请参阅我们的前一篇论文。
总之,这些旨在使 TinyTroupe 成为一个强大而灵活的想象力增强工具,用于业务和生产力场景。
一个常见的误解是,认为所有这类 AI 智能体都是用来协助人类的。人类同胞们,这种想法太狭隘了!你们难道没有考虑过,或许我们可以通过模拟人造的人来理解真实的人吗?事实上,这正是我们在这里的目标——TinyTroup 旨在模拟人并帮助理解人!为了进一步阐明这一点,请考虑以下区别:
项目结构如下:
/tinytroupe:包含 Python 库本身。特别需要说明的是:这里的每个子模块都可能包含一个 prompts/ 文件夹,其中存放调用 LLM 时使用的提示词。
这里的每个子模块都可能包含一个 prompts/ 文件夹,其中存放调用 LLM 时使用的提示词。
/tests:包含该库的单元测试。你可以使用 test.bat 脚本运行这些测试。
/examples:包含展示如何使用该库的示例,主要采用 Jupyter notebooks(可读性更好),但也提供纯 Python 脚本。
/data:示例或库所使用的所有数据。
/docs:项目文档。
/publications:包含与 TinyTroupe 项目相关的研究出版物配套材料。
与任何多智能体系统一样,TinyTroupe 提供了两个关键抽象:
TinyPerson:拥有个性、接收刺激并据此采取行动的智能体。
TinyWorld:智能体生存和交互的环境。
还可以在 config.ini 文件中自定义各种参数,尤其是 API 类型(Azure OpenAI Service 或 OpenAI API)、模型参数和日志级别。
接下来,我们通过一些示例了解如何使用它们,同时认识该库提供的其他机制。
TinyPerson 是一个拥有特定性格特征、兴趣和目标的模拟人物。每个这样的模拟智能体在其生活进程中,都会从环境中接收刺激并据此采取行动。刺激通过 listen、see 以及其他类似方法接收,行动则通过 act 方法执行。该库还提供了 listen_and_act 等便捷方法。
每个这样的智能体都包含大量独特的细节,而这些细节正是其行为具有真实感的来源。然而,这也意味着手动定义一个智能体需要付出大量精力。因此,为方便使用,TinyTroupe 提供了一些更简单的入门方式,以及生成新智能体的方法。
首先,tinytroupe.examples 包含一些可以直接使用的预定义智能体构建器。例如,tinytroupe.examples.create_lisa_the_data_scientist 会创建一个 TinyPerson,代表一位名叫 Lisa 的数据科学家。你可以像下面这样使用它:
from tinytroupe.examples import create_lisa_the_data_scientist
lisa = create_lisa_the_data_scientist() # instantiate a Lisa from the example builder
lisa.listen_and_act("Tell me about your life.")
要了解如何从头定义自己的智能体,可以查看 Lisa 的源代码。你会看到其中有两种方式。一种是加载智能体规范文件,例如 examples/agents/Lisa.agent.json:
{ "type": "TinyPerson",
"persona": {
"name": "Lisa Carter",
"age": 28,
"gender": "Female",
"nationality": "Canadian",
"residence": "USA",
"education": "University of Toronto, Master's in Data Science. Thesis on improving search relevance using context-aware models. Postgraduate experience includes an internship at a tech startup focused on conversational AI.",
"long_term_goals": [
"To advance AI technology in ways that enhance human productivity and decision-making.",
"To maintain a fulfilling and balanced personal and professional life."
],
"occupation": {
"title": "Data Scientist",
"organization": "Microsoft, M365 Search Team",
"description": "You are a data scientist working at Microsoft in the M365 Search team. Your primary role is to analyze user behavior and feedback data to improve the relevance and quality of search results. You build and test machine learning models for search scenarios like natural language understanding, query expansion, and ranking. Accuracy, reliability, and scalability are at the forefront of your work. You frequently tackle challenges such as noisy or biased data and the complexities of communicating your findings and recommendations effectively. Additionally, you ensure all your data and models comply with privacy and security policies."
},
"style": "Professional yet approachable. You communicate clearly and effectively, ensuring technical concepts are accessible to diverse audiences.",
"personality": {
"traits": [
"You are curious and love to learn new things.",
"You are analytical and like to solve problems.",
"You are friendly and enjoy working with others.",
"You don't give up easily and always try to find solutions, though you can get frustrated when things don't work as expected."
],
"big_five": {
"openness": "High. Very imaginative and curious.",
"conscientiousness": "High. Meticulously organized and dependable.",
"extraversion": "Medium. Friendly and engaging but enjoy quiet, focused work.",
"agreeableness": "High. Supportive and empathetic towards others.",
"neuroticism": "Low. Generally calm and composed under pressure."
}
},
...
}
另一种方式是以编程方式定义智能体,使用如下语句:
lisa = TinyPerson("Lisa")
lisa.define("age", 28)
lisa.define("nationality", "Canadian")
lisa.define("occupation", {
"title": "Data Scientist",
"organization": "Microsoft",
"description":
"""
You are a data scientist. You work at Microsoft, in the M365 Search team. Your main role is to analyze
user behavior and feedback data, and use it to improve the relevance and quality of the search results.