
编者按:这是我们客座文章系列的又一篇,重点介绍了 LangChain 的强大应用。我们已经与 Yeager.ai 团队合作了几个月,他们构建了一些 LangChain 智能体的非常 впечатляющий 应用。我们很高兴重点介绍这篇关于他们的 GenWorlds 多智能体系统框架的客座博客。我们尤其兴奋地看到他们计划让 LangChain/GenWorlds 社区能够无缝地将其项目货币化。
🧬🌍GenWorlds 是一个用于多智能体系统的开源开发框架。该框架的核心是专用环境或“世界”,其中包含专门的 AI 智能体和共享对象。在这些世界中,智能体使用共享对象进行协作,以执行复杂的任务并实现共同的目标。
我们的研究表明,智能体在专注于狭窄领域时表现更好,因此智能体协调对于 GenAI 系统执行复杂操作至关重要。
开发者可以轻松实现货币化
Yeager.ai 正在为 GenAI 应用构建一个强大的生态系统。该框架在设计时考虑了可组合性和互操作性。除了框架之外,GenWorlds 还将提供一个平台,用于托管 GenAI 应用,维护成本极低,并提供一个市场,开发者可以在其中轻松地将其构建成果货币化。
模块化的力量
模块化是 GenWorlds 框架的基石。在软件工程中,将事物分解为更小的、自包含的组件可以提高系统的可重用性和可靠性。对于使用 LLM 的系统来说也是如此——每次调用语言模型时,模型越具体和狭窄,输出的可靠性就越高。GenWorlds 框架在多个层面应用了这一原则
- GenWorlds 允许您创建多个智能体,每个智能体都具有更狭窄的任务,可以朝着共同的目标协同工作,而不是单个智能体试图完成所有事情
- 此外,每个智能体的思考过程都分解为多个适合手头任务的模块。每个模块只需要智能体总上下文的一小部分,因此可以表现得更好
- 开发者可以配置每个模块以使用诸如“思维链”、“自我评估”和“思维树”等先进技术。该框架具有灵活性,可以适应任何新出现的技术。
最终结果是专注且高度可靠的智能体,它们充分利用底层语言模型的力量来实现复杂的目标。
有了这些背景知识,现在让我们深入了解 🧬🌍 GenWorlds 框架。
世界
“世界”是所有行动的背景。它跟踪所有智能体、对象和世界属性,例如智能体物品栏。“世界”确保每个智能体都了解世界状态、附近的实体以及可用于与世界交互的事件。
世界定义 YAML
为了方便起见,RoundTable 示例(一个多智能体播客模拟,稍后会详细介绍)带有一个加载器,可以从 YAML 文件中读取世界配置。这使每个人都可以快速创建和修改各种世界。这是一个例子
world_definition:
base_args:
websocket_url: ws://localhost:7456/ws
world:
id: world
class: genworlds.worlds.world_2d.world_2d.World2D
name: All-In Podcast
description: The four "besties" discuss any topic you want.
locations:
- roundtable
objects:
- id: mic1
...
agents:
- id: jason_calacanis
...
模拟套接字
“模拟套接字”是一个 websocket 服务器,充当通信骨干。它支持世界、智能体和对象的并行操作,并允许它们通过发送事件进行通信。这种架构支持将前端或其他服务连接到世界,在外部服务器上运行智能体等等。

智能体
GenWorlds 中的智能体是构建在 LangChain 之上的自主实体,它们感知周围环境并做出决策以实现用户设定的特定目标。智能体通过模拟套接字服务器发送事件来与其环境交互。它们动态地学习关于世界和周围对象的信息,弄清楚如何利用这些对象来实现其目标。

可以有许多不同类型的智能体,只要每个智能体都理解用于与世界通信的事件协议即可。
智能体的心理模型
智能体在与世界交互的每一步都遵循特定的心理模型
- 回顾世界状态:智能体评估环境以了解上下文,然后再计划任何行动。
- 回顾新事件:智能体评估世界中发生的任何新事件。这些可能是其他智能体采取的行动,或者是由于对象交互而引起的世界状态变化。
- 记忆:智能体使用其存储的记忆和对先前状态变化的感知,回忆可能影响其当前决策过程的过去经验和数据。
- 创建计划:智能体根据世界状态变化创建和更新行动计划。智能体可以在一个步骤中执行多个操作,从而提高整体效率。
- 执行:智能体执行其计划,影响世界状态,并可能触发来自其他智能体的响应。
这种交互过程促进了复杂、自主行为的出现,使每个智能体都成为世界中的积极参与者。
思考过程
代码中的 think() 方法是智能体思考过程的核心功能。该函数首先获取世界的初始状态和要执行的潜在操作。然后,它进入一个循环,在循环中处理事件并评估智能体附近的实体,以便为其决策提供信息。

根据智能体的当前状态和目标,think() 函数可以选择等待、响应用户输入或与实体交互。如果智能体选择了一个动作,它将执行该动作并相应地更新其记忆。think() 函数不断更新智能体在世界中的状态,并重复该过程,直到它决定退出。请参阅下图,其中显示了RoundTable(我们的播客模拟应用)中的智能体循环

智能体的组成部分
模块:模块是一个系统,用于控制智能体思考过程的一个步骤。它管理思想生成、评估和选择的过程。模块定义了这些过程所需的功能,并使用大型语言模型来生成和评估思想。所有模块都充分利用 OpenAI Functions 来轻松指定所需的输出格式。
大多数智能体都具有以下模块类型
导航模块:导航模块旨在选择智能体的下一个动作,以帮助其实现目标。它为智能体在世界中的下一步行动生成计划。此类的输入包括智能体的信息(名称、角色、背景、个性)、目标、约束、评估原则以及要生成的思想数量。它生成一组可能的计划,每个计划都包括要采取的行动、行动是否有效、任何违反的约束以及更新后的计划。然后,导航模块评估这些计划,并选择最符合评估原则和约束的计划。
有时您希望约束动作的顺序,并强制智能体在一个动作之后执行另一个动作——这可以使用动作-模块映射来完成。
您可以在这里看到导航模块的构造函数
NavigationBrain(
openai_api_key=openai_api_key,
name=name,
role=role,
background=background,
personality=personality,
topic_of_conversation=topic_of_conversation,
constraints=constraints,
evaluation_principles=evaluation_principles,
n_of_thoughts=3,
),
n_of_thoughts=3 参数指定模块将生成 3 个可能的下一个动作,并根据其 evaluation_principles 选择最佳的一个。
执行模块:执行模块使智能体能够执行各种任务。这些模块接受智能体详细信息、任务属性、约束和评估参数。可以配置这些模块以在一次调用中生成其输出,或者生成多个潜在输出并使用自我评估技术选择最佳输出。
执行模块的力量在于其可定制性。开发者可以创建适用于各种任务的模块,例如参与播客、撰写文章、分析数据或抓取社交媒体信息流。这种灵活性允许创建能够在其模拟环境中执行各种任务的独特技能的智能体。
以下是一个示例执行模块(PodcastBrain)的构造函数
PodcastBrain(
openai_api_key=openai_api_key,
name=name,
role=role,
background=background,
personality=personality,
communication_style=communication_style,
topic_of_conversation=topic_of_conversation,
constraints=constraints,
evaluation_principles=evaluation_principles,
n_of_thoughts=1,
),
在这里,n_of_thoughts 设置为 1,这意味着播客模块将仅生成一条输出消息并跳过评估步骤。
事件填充模块:事件填充模块用于生成智能体在世界中执行操作所需的 JSON 参数。输入与导航模块类似,但还包括智能体已决定执行的命令,以及执行流程中任何先前模块的输出。
您可以看到它采用的参数比其他模块少,因为它不需要那么多上下文即可完成其任务。
EventFillerBrain(
openai_api_key=openai_api_key,
name=name,
role=role,
background=background,
topic_of_conversation=topic_of_conversation,
constraints=constraints,
evaluation_principles=evaluation_principles,
n_of_thoughts=1,
),
可以创建不同类型的模块来处理不同的任务、场景或问题。一个智能体可以有多个模块,每个模块都专注于一个特定目标,其上下文针对该目标量身定制。例如,播客智能体将拥有一个“内容模块”,这将是其唯一拥有关于智能体沟通风格信息的模块。
使用多个模块有助于缩小智能体的焦点,从而显著提高智能体输出的质量和可靠性。此外,每个模块都可以使用不同的 LLM,这使您可以进一步优化系统。例如,某些操作或决策需要更强大的 LLM(例如 GPT-4),而其他步骤可以使用更简单、更快、更便宜的 LLM(例如 GPT-3.5)来完成。
动作-模块映射:智能体的动作-模块映射定义了通过各种模块的确定性路径。它是根据智能体的下一个动作来决定使用哪个模块的系统。每个模块的输出都会传递到该动作的执行模块路径中的后续模块。从上面的播客智能体示例中,当智能体即将发言时,它将调用内容模块,并将输出传递给事件填充模块,以生成带有生成响应的有效世界事件。
如果您不希望智能体自由选择,您还可以为每个动作指定确定性的后续操作——例如,在对着麦克风讲话后,智能体必须将其传递给其他人。这使您可以约束智能体以创建更可预测的执行路径并提高可靠性。
这是代码中的样子
action_brain_map = {
"Microphone:agent_speaks_into_microphone": {"brains":[
"podcast_brain",
"event_filler_brain",
], "next_actions": ["World:agent_gives_object_to_agent_event"]},
"World:agent_gives_object_to_agent_event": {"brains":["event_filler_brain"], "next_actions": []},
"default": {"brains":["event_filler_brain"], "next_actions": []},
}
智能体物品栏:智能体当前持有的特定对象。此状态由世界维护,并允许智能体将令牌等物品从一个智能体传递到另一个智能体,并在智能体移动到世界中的不同位置时随身携带对象。
记忆:当前记忆和预生成记忆
GenWorlds 中的智能体有两种类型的记忆,当前记忆和预生成记忆
- 当前记忆:智能体记住[数量]个最近的事件、[数量]个最相关的事件以及整个历史的运行摘要。最近和相关记忆的数量可由用户配置。
- 预生成记忆:从外部内容(例如 youtube 视频、书籍等)生成并存储在向量数据库中。预生成记忆根据其与智能体当前目标的相关性注入到智能体的提示中,从而实现更专注和可靠的交互。这些记忆使智能体无需微调底层模型即可进行学习。
以下是如何在世界定义 YAML 文件中轻松配置自定义预生成记忆,这些记忆存储在 Qdrant 向量数据库中
要使用记忆,您需要在 world_definition.yaml 文件中设置以下值
world_definition:
world:
path_to_to_external_memory: ./databases/summaries_qdrant
对于每个智能体,您都需要指定集合名称
agents:
- id: maria
personality_db_collection_name: maria
对象
对象在促进智能体之间的交互方面起着至关重要的作用。每个对象都定义了一组独特的事件,使智能体能够在动态环境中完成特定任务并协同工作。对象可以在智能体附近,也可以是其物品栏的一部分,从而扩大了可能交互的范围。
智能体被设计为动态适应,学习附近的物体,理解事件定义,并确定与它们交互以实现其目标的最佳方式。对象是赋予智能体新能力并将其组织在一个结构中以实现更广泛的集体目标的主要方式。
智能体协调
由于智能体了解世界中的事件,包括其他智能体的事件,因此智能体会自然而然地相互反应。为了促进智能体之间的结构和有组织的行为,我们使用共享对象。请参见以下三个示例
“令牌持有者”:智能体使用其物品栏中的令牌进行通信,并向其他智能体发出信号,表明轮到谁执行操作。例如,在 RoundTable(我们的播客模拟应用)中,智能体使用麦克风作为令牌来相互交谈。智能体只有在其物品栏中有麦克风时才能讲话。这确保了智能体相互倾听,并防止它们相互打断,从而创建动态讨论。

这是它在代码中的样子
world_definition:
world:
path_to_to_external_memory: ./databases/summaries_qdrant
流水线:每个智能体都被分配了流水线中的一个角色,并在轮到他们时完成其角色。这就像一条工厂生产线。例如,大多数销售流程都像这样
研究 > 获取联系信息 > 创建/发送引人注目的外联信息 > 跟进 > 安排/进行通话 > 查看通话记录 > 发送/协商法律文件 > 跟进/通话 > 以及持续进行,直到交易成功/失败。
为了促进此类操作,您需要创建一组对象,例如箱子,每个智能体都可以将他们的工作输出放入其中,而流水线中的下一个智能体可以查看何时有新项目传递给他们,拿起它,根据他们所处的流水线步骤对其进行处理,然后将其放入下一个箱子中。
流水线最适合像销售示例这样的顺序任务。
项目管理:项目经理(人类或智能体)使用黑板(一个对象)为每个智能体分配角色并跟踪进度。项目经理和智能体通过黑板进行交互,共享文件、更新任务、跟踪进度等。
工具:智能体可以使用工具来执行特定功能,例如调用外部 API、运行复杂计算或触发世界中的独特事件。
该框架为任何人创建自己的对象和协调方法提供了灵活性。
用例亮点 - RoundTable
为了展示 GenWorlds 中智能体的协调能力,我们构建了RoundTable,一个播客模拟。用户可以召唤最聪明的头脑就任何主题进行小组讨论。它不是另一个 ChatGPT 包装器;它是一个由 AI 智能体组成的团队,这些智能体独立行动,具有特定的个性、记忆和专业知识。
RoundTable 使用对象、智能体物品栏和预生成记忆来创建智能体之间动态的讨论,这些智能体的声音听起来像他们所模仿的人。在此处观看演示
您还可以在 Replit 上免费试用
- 前往 Replit
- Fork Replit(完全免费)
- 选择您要使用的用例
GenAI 生态系统 - 我们的北极星
我们设计的 GenWorlds 框架具有模块化、灵活性和可组合性。我们设想 GenAI 开发者使用这种模块化来即插即用或构建框架的每个元素(世界、智能体、对象、记忆、模块等),以创建他们自己有用的应用。
我们不会止步于此。我们正在为我们的开发者社区提供一个平台和工具,以便在 Gen-AI 市场中轻松访问其应用的货币化。
了解更多关于 🧬🌍GenWorlds 的信息
演示:https://youtu.be/INsNTN4S680
GitHub:https://github.com/yeagerai/genworlds
文档:https://genworlds.com/docs/intro
Discord:https://discord.gg/wKds24jdAX
博客:https://medium.com/yeagerai
Replit:https://replit.com/@yeagerai/GenWorlds
关于 Yeager
在 Yeager.ai,我们的使命是通过生成式 AI 的力量来提高生活质量。我们的目标是通过使 GenAI 可靠且易于访问来消除工作中繁重的方面。通过这样做,我们为学习、创新和决策创造有利环境,从而推动技术进步。