自从2025年搬到硅谷之后,我发现人工智能已经无处不在。在参加了NVIDIA GTC 2025会议后,通过多次交流,我清楚地认识到:现在大多数公司都在不同的项目或部门中成功应用了人工智能系统。

然而,几乎没有任何一家企业能够将这些系统在整个组织范围内得到有效部署。即便有些地方确实使用了这些系统,它们的组织结构往往也很混乱。

许多公司都是在几乎是凭猜测的情况下来开发和使用这些人工智能系统的。

我听到的一些常见问题包括:

  • 一个团队中应该配备多少个人工智能系统?

  • 使用哪种模型提供商才是最好的选择?

  • 这些系统是否需要由一个“主管”来监督,还是应该通过点对点的协作来进行管理?

换句话说,核心问题就是:

对于一个人工智能系统团队来说,什么样的组织结构才是最合适的?

这篇文章的目的就是为了回答这个问题。

我之前写过一本关于人工智能背后的数学原理的书籍,点击链接可阅读,因此在这里我们不会涉及任何数学计算。

相反,我们会重点探讨如何为实际的业务场景来组织这些人工智能系统。

我们将以谷歌研究部门、Google DeepMind以及MIT联合发表的一篇人工智能论文——《走向规模化人工智能系统的科学:这些系统为何能发挥作用》作为主要参考资料。

在代码实现方面,我会使用Google Collab平台上的Jupyter笔记本来完成相关工作。

我们将涵盖以下内容:

先决条件

要创建人工智能系统,你并不需要成为一名高级开发人员。有许多无代码工具可以帮助你完成这一过程。

但是,要想充分理解这里的示例内容,并能够检查自己开发的人工智能系统的运行情况、了解它们的工作原理,你需要具备以下条件:

  • 对Python以及大型语言模型是什么有一个基本的了解。

  • 在您的机器上安装Ollama,以便能够免费地在本地运行大型语言模型。

  • 设置好Jupyter Notebook。如果您当地的硬件资源有限,或者需要使用云端的GPU,那么强烈推荐使用Google Colab。

让我们开始吧!

什么是大型语言模型?

大型语言模型就像一个博览群书、却从未离开过图书馆的实习生。

这种模型能够引用文本、进行总结、进行翻译,还能模仿几乎任何写作风格。它甚至可以同时编写Python脚本和莎士比亚风格的十四行诗!

不过,它也存在一些局限性。例如,当模型不确定如何处理某个问题时,它往往会像处理自己熟悉的话题一样“自信地”编造出答案。

这种现象被称为“幻觉效应”。

此外,默认情况下,大型语言模型在不同的对话之间并不会保留记忆,也无法独立完成某些任务。比如,一个大型语言模型可以告诉你如何发送电子邮件,但它本身却无法执行这个操作。

这时,人工智能代理就派上了用场。

什么是人工智能代理?

如果把大型语言模型比作实习生,那么人工智能代理就是这个实习生,只不过它被赋予了办公桌、笔记本电脑、待办事项清单,以及行动的能力。

本质上来说,人工智能代理就是被封装在了各种工具、记忆机制以及循环结构中的大型语言模型。

这些工具使代理能够执行诸如搜索网页、读取文件、发送电子邮件或运行代码等操作;记忆功能让代理能够记住之前在其他任务中完成过的步骤;而循环结构则使得代理能够不断思考、调用相应工具、查看结果,直到完成任务为止。

在很多情况下,单个人工智能代理已经非常有用。但当遇到一个需要太多资源才能完成的任务时,该怎么办呢?

当然,你可以雇佣更多的代理!但这又会带来新的问题:

  • 是应该让一个代理负责处理长长的待办事项清单吗?(单代理模式)

  • 还是应该让五个代理各自独立地完成同一个任务呢?(多代理模式)

  • 一个团队中应该配备多少个代理呢?

    负责分配子任务的主管应该来管理这些代理吗?

    还是应该让一组代理相互协作来完成任务呢?

我们在这里作为主要参考的谷歌论文,正是通过超过150项 controlled experiments 来尝试回答这些问题的。

需要记住的是,拥有更多的代理并不一定意味着就能获得更好的结果。有时候,一个代理就已经足够了;而有时候,则确实需要更多代理才能完成任务。

一些背景知识

在继续讨论之前,有一点需要注意:这些都属于实验性研究结果,并非物理定律。

谷歌的这篇论文采用了极其严谨的研究方法,对多种可能的人工智能代理组合及相关技术进行了评估。

其中一些被研究的提供商包括:

  • OpenAI(ChatGPT)

  • Google(Gemini)

  • Anthropic(Claude)

不同模型家族的实验结果存在差异:

  • OpenAI模型的效果在集中式/混合式配置下最为显著。

  • Google模型的效率表现呈现出明显的平台期。

  • Anthropic模型对协调开销更为敏感。

由于这项研究基于大量实验,因此你的团队可以将这些结论作为选择模型家族时的重要参考依据。

创建最优AI智能体的决策算法

现在,我们将这篇文章中的研究成果转化为一个易于应用的算法,任何人都可以利用这个算法来创建AI智能体,从而自动化自己的工作流程。

该算法的主要目的是帮助你根据Google论文提供的科学依据,判断自己是只需要一个智能体还是需要多个智能体来完成任务。

因此,我不会逐一步解释这篇文章的内容,而是会直接教你如何运用这个算法来解决实际问题。

1. 检查你的预算

如果你的硬件资源有限,我建议从使用Ollama开始。

Ollama是一款允许你在个人电脑上运行大语言模型的工具。当在本地使用时,它是免费且开源的。

但如果你通过OpenAI、Google或Anthropic提供的API来访问他们的模型,那么就需要支付费用了。

截至2026年5月6日,OpenAI的GPT-5.5每100万个token的费用为5.00美元,而GPT-5.4 mini的费用则为0.75美元/100万token。

如果你的云资源有限,可以使用Google Colab来使用GPU,从而运行规模更大、参数数量更多的大语言模型。通常来说,较新的大语言模型在图像生成、编程等领域能取得更好的效果。

你也可以在Google Colab中将Ollama与这些大语言模型结合使用。

如果你正在开展公司项目,我也推荐这种基于云服务的方案。这样的环境能够提供比大多数本地电脑更充足的计算资源,有助于你构建演示系统并进行评估测试。

如果你的预算比较灵活,也可以选择Claude或Gemini这类专业API。

请始终记住:智能体的运行需要消耗token,而token是需要付费购买的。

2. 从使用一个智能体开始

无论何时,都应该先从一个智能体开始尝试。一般来说,如果你使用的是最新的模型,它们的性能通常会比旧的开源模型更好。

3. 测量性能

根据论文中的研究结论,如果某个智能体在现实世界中的成功率(即它的执行效果和准确性)超过45%,那么通常就没有必要为这项任务创建多个智能体了。

要测量这一指标,可以让该智能体完成50到100个具有代表性的任务,然后根据你事先设定的标准来评估其表现——这些标准可以是人工审核的结果、已知正确的答案,或者是一些检查清单。

需要注意的是,论文中提到的45%这个临界值只是一种判断依据:它用于确定“何时不需要增加智能体”。但反过来讲,并不是说如果性能低于45%,就一定需要添加更多的智能体才行。<作者指出:“协调带来的好处源于将通信结构与任务结构相匹配,而不是通过增加代理的数量来实现。”>

<基本上,如果某个代理的表现不佳,首先应该修复这个代理本身!不要想当然地认为需要添加另一个代理。

<如果你确定对于你的项目来说,单个代理就足够完成任务了,那么就可以进入第7步。

<如果单个代理的性能低于45%,首先尝试改进它(比如优化提示语、工具或模型)。只有当任务本身具有并行性时,才考虑组建多个代理组成的团队(详见下一步内容)。

4. 评估任务的并行性

<那么一个重要的问题就是:为什么非要使用多个代理呢?以下是判断方法:

<如果你的任务只涉及一项连续性的工作,通常单个代理就能更高效、更低成本地完成任务。

<但是,当你能够将项目明确划分为若干独立的子任务时,多个代理就会派上用场。这时不同的专家代理可以分别负责这些子任务,从而实现多任务并行处理。

<在我们算法的这一阶段,你需要判断自己想要应用人工智能代理来完成的这项任务是否具有天然的并行性。

<如果一项任务可以被分解为独立的子任务,那么它就具有天然并行性。例如:

  • 在五个不同的网站上搜索最合适的航班。

  • 同时总结十篇独立的新闻文章。

<而那些不能被分解成独立子任务的任务,则不具备并行性。例如:

  • 从头到尾规划一次旅行(比如在预订酒店之前必须先确定目的地,因此这些步骤无法并行完成)。

  • 处理一笔银行转账业务(在资金汇款之前需要先进行核实)。

<如果任务具有天然并行性,使用多个代理可能会带来更好的效果,此时你应该继续进入第5步。

<但如果任务是顺序执行、需要按步骤完成的,那么就不要增加代理数量了。根据研究,多代理团队在这种情况下只会对结果产生负面影响,因此你应该坚持使用单个代理。

<在这种情况下,你可以重点改进针对单个代理的提示语、工具或模型。当其性能达到45%以上时,再进入第7步。

5. 根据任务类型选择合适的架构

<现在我们要来确定人工智能代理团队的结构了。

<“拓扑结构”简单来说就是系统的构造方式。在这里,我们指的是由多个代理组成的团队的结构。

<只有在你确定确实需要使用多个代理时,才需要执行这一步骤。我们接下来要探讨的两种架构都是多代理架构。

<如果任务涉及分析或结构化的工作,那么使用集中式架构会更为合适。集中式架构就像一位经理管理下属实习生一样:实习生向经理汇报工作,而经理负责协调他们的工作进度。

<对于像财务报告这类需要按流程处理的任务来说,集中式架构非常适用。

根据这项研究,这种做法能够将错误放大效应从约17倍降低到4倍。这意味着,当管理者犯错时,实习生们所引发的错误数量将从17个减少到大约4个。

如果某项任务更侧重于探索性工作,那么就应该采用去中心化的模型。

这种模型非常适合用于开放式研究或审计工作,在这些场景中,各个代理可以从不同的角度来审查同一份材料。

去中心化模型的运作方式就像是一个团队中的实习生们一起为公司的新产品集思广益,或者在午餐时间讨论如何优化某个流程以提高效率。

6. 限制团队规模及每位代理可使用的工具数量

根据这篇论文的研究结果,当团队中拥有3到4位代理时,AI代理的性能才会开始下降。

研究还指出,每位代理都应该能够使用最基本的工具(每位代理最多使用1到3种工具)。如果每位代理拥有的工具越多,其性能反而会越差。

7. 建立评估机制

现在,你已经拥有了一个在大多数情况下都能正常运行的系统。但如何确保这些代理能够在整个组织范围内得到有效应用呢?为此,在正式推广这些代理之前,你需要先进行一些内部测试。

这些内部测试就被称为“评估”。

对于每一次评估,你都需要设定明确的指标,以便了解这些代理在每次评估中的表现如何。

你需要测量的指标包括准确性、效率以及任务执行过程。准确性能够说明模型是否做出了正确的判断;效率则反映了处理请求的速度和成本;而任务执行过程则能体现模型是否使用了合适的工具来完成任务。

请记住,在人工智能和工程领域,如果无法衡量系统的性能,那么你就不能信任这个系统。

通过这些评估机制,你可以逐步了解该模型在你们组织所使用的数据及具体环境中表现如何。随着时间的推移,这些评估结果能够帮助这些代理变得越来越独立、越来越高效。

评估内容可能包括:

  • 输入电子邮件并检查输出的结果是否符合预期

  • 输入客户支持对话记录,然后查看系统输出的总结性行动方案

  • 输入复杂的法律合同文本,系统需识别出其中的高风险条款

通过这些评估,你可以了解代理们的输出结果与预期结果的差距有多大。

你还可以尝试不同的模型,并再次运用这种决策算法,从而找出最适合你具体需求的模型。毕竟,新的模型往往比旧的模型更有效。

通过建立这样的工作流程,你就能打造出更加准确、高效的代理系统。

现在,让我们通过三个具体的应用案例来了解这个算法的实际运作方式吧。

三个代码示例

在这一部分,我会解释是如何在Jupyter笔记本中运行这些代码的。我建议你们自己也复制这些代码并亲自运行一遍,这样就能更好地理解它们的工作原理了。

<我们将从我在Google Colab中指定的那些部分开始编写代码,这样你们就能完全理解整个流程了。>

你也可以在GitHub上找到这个资源,链接是这里。我使用了MIT许可证来发布这段代码。

1. 安装工具、Python库并进行配置设置

!sudo apt update && sudo apt install -y pciutils
!sudo apt-get install -y zstd
!curl -fsSL https://ollama.com/install.sh | sh

c91a3d8b-18dd-4850-bca6-ae707e69736c

这段代码主要用于准备环境,以便运行AI代理程序。

第一行代码会更新软件包列表,并安装用于检测硬件的工具,从而识别你的GPU型号;第二行代码会安装一个高速解压工具,用于解压模型文件;最后,它会下载Ollama的官方安装脚本并执行它,以便完成软件的安装过程。

Ollama是一款开源工具,它能让你在电脑上使用大语言模型。

!pip install uv
!uv pip install langchain-ollama ollama crewai duckduckgo-search langchain-community ddgs faker

d86340f3-3a19-4a89-9975-ecb4116d379a

在这里,我们下载了uv这个Python包。它和pip类似,但使用起来更快也更安全。

有了这个工具,我们就可以更快地下载其他Python库了。

import socket
import subprocess
import threading
import time

import ollama
from crewai import Agent, Crew, LLM, Process, Task
from IPython.display import Markdown
from langchain_ollama.llms import OllamaLLM

from crewai.tools import tool
from langchain_community/tools import DuckDuckGoSearchRun

from faker import Faker

60effe35-2293-4201-afb0-f561a64470e4

通过上面的代码,我们导入了自己创建最优AI代理程序所需的所有Python库。

让我们来看看每一个库的作用是什么:

fake = Faker("en_US")

Faker.seed(42)

6d896775-9db5-4d1a-b144-07b035f1dc35

在这两行代码中,我们配置了Faker Python库,使其能够生成来自美国的英文虚假数据。

2. 启动Ollama服务器,获取模型及工具

with open("ollama.log", "w") as log_file:
process = subprocess.Popen(["ollama", "serve"], stdout=log_file, stderr=log_file)

def is_server_ready(port=11434):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
return s.connect_ex(('localhost', port)) == 0

print("正在启动Ollama服务器...")
max_retries = 20
ready = False

for i in range(max_retries):
if is_server_ready():
ready = True
break
time.sleep(1)
if i % 5 == 0:
print(f"仍在等待... ({i}秒)")

if ready:
print("\n 成功!Ollama已启动,可开始使用模型了.")
!curl -s http://localhost:11434 | grep "Ollama is running"
else:
print("\n 错误:Ollama服务器无法启动。请查看'ollama.log'文件以获取详细信息。")

1daf506b-fb25-4487-9bb3-887b37bb0aaf

这段代码可以确保在您的AI模型尝试运行之前,本地环境已经做好了充分准备。

AI服务器启动通常需要一些时间,请耐心等待。

这段脚本通过使用后台进程来启动Ollama,并通过网络“握手”操作确认其已正常运行,从而避免出现“连接被拒绝”的错误。
!ollama pull mistral-small3.2
ce54b7e0-0b4f-4751-b797-ac4bd45cae63

在这行代码中,我们将mistral-small3.2这个大语言模型加载到了Google Colab笔记本中。

Mistral是由法国知名创业公司Mistral AI SAS开发的模型。

_ddg = DuckDuckGoSearchRun()

@tool("web_search")
def web_search(query: str) -> str:
"""通过DuckDuckGo在公共网络上进行搜索。输入:简洁的搜索查询字符串。返回:前几条搜索结果的内容,以纯文本形式呈现。"""
return _ddg.run(query)

0cadabf5-d454-418d-844c-3167a68283bd在这段代码中,我们为我们的代理程序开发了一个工具:我们让这些代理程序能够使用 DuckDuckGo 来搜索网页。DuckDuckGo 是目前网络上最受欢迎的、以保护用户隐私为宗旨的搜索引擎之一。

这一点至关重要,因为它使我们的智能代理能够获取那些目前尚未被编程让其知晓的最新信息。

3. 模型测试

现在我们将编写用于定义和测试大语言模型的代码。

我们同时初始化了一个用于直接任务的标准模型,以及一个专为CrewAI框架设计的专用大语言模型对象。最终,我们会使用这个专为CrewAI框架设计的模型对象来驱动我们的智能代理。

这种初始配置非常重要,因为它能确保在尝试创建智能代理之前,你的机器能够正常与软件进行交互。

AI_prompt = "为这样一个智能代理编写一个简洁的系统提示语:这个代理的任务是总结财务文件内容。"

AI_model = OllamaLLM(model="mistral-small3.2")

crew_llm = LLM(
    model="ollama/mistral-small3.2",
    base_url="http://localhost:11434"
)

print("正在运行Mistral模型...")
AI_response = AI_model.invoke(AI_prompt)
display(Markdown(f"### 智能代理的输出结果:\n{AI_response}"))

5f76b8c8-6713-40dd-a624-fc83fb35f666

4. 运行智能代理

现在,我们将运行三种不同的代理配置方案。

第一种是用于处理序列任务的单一代理;第二种是集中式团队架构;第三种则是去中心化团队架构。

使用单一代理处理序列任务

doc_5_1 = f"""{fake.company()} {fake.company_suffix()} — 2026年第三季度财报
编制者:{fake.name}, 财务总监
关键指标
收入:${fake.random_int(50, 500)}百万美元(同比增长{fake.random_int(5, 25)}%)
净利润:${fake.random_int(10, 80)}百万美元
营业利润率:{fake.random_int(12, 28)}%
活跃客户数量:{fake.random_int(10_000, 500_000):,}
现金储备:${fake.random_int(100, 900)}百万美元
员工人数:{fake.random_int(200, 5000):,}
管理层评论
{fake.paragraph(nb_sentences=5)}
风险因素
{fake.paragraph nb_sentence=4)}
"""

15c0b2f4-9e8e-4ed1-950b-2d897502ae28

在这段代码中,我们准备了一个通用模板,用于生成虚假数据。

print(doc_5_1)

c16aa43e-da98-4255-be6e-0ba60b342163

Rodriguez, Figueroa and Sanchez and Sons — 2026年第三季度财报
编制者:Megan Mcclain, 财务总监
关键指标
收入:9400万美元(同比增长23%)
净利润:6400万美元
营业利润率:13%
活跃客户数量:25,622人
现金储备:1.95亿美元
员工人数:1,991人
管理层评论
……
风险因素
……

通过这段代码,我们打印出了该代理将会处理的文档。

analyst = Agent(
role="高级财务文件分析师",
goal=(
"通读所提供的文档,提取其中5个最具有决策意义的KPI指标
(如果这些指标有单位、统计周期或数据来源信息,请一并列出),并撰写一份适合CEO阅读的总结报告。
“当某个数值缺失或存在歧义时,应通过网络搜索来核实其准确性。”
),
backstory=(
"你在四大会计师事务所工作了10多年,主要从事10-K报表、盈利公告及投资者演示材料的审核工作。
你的工作方式非常规范:对于每一个指标都会明确指出其在文档中的具体位置或章节编号,而且从不会随意编造数据——
“如果文本中确实没有某个数值,那就去查找它,或者将其标记为‘未公开’。”
),
tools=[web_search],
llm=crew_llm,
verbose=True,
allow_delegation=False,
)

528b2693-3b24-4119-b88e-3eda4d1d9141

在这段代码中,我们定义了一个充当分析师的代理。这个分析师将会分析生成的报告,并且还可以使用DuckDuckGo来进行信息查询。

task_1 = Task(
description=[
"从以下文档中提取KPI指标。\n\n"
"文档内容:\n"
f"{doc_5_1}"
],
agent=analyst,
expected_output="一份包含文本中发现的5个关键KPI指标的列表。"
)

task_2 = Task(
description="根据在上一个任务中提取出的KPI指标,撰写一份专业的执行摘要。",
agent=analyst,
expected_output="一篇适合CEO阅读的200字总结报告。"
)

b5737a9c-ccc8-477c-b859-bf6de5a82f87

分析师只需要完成两项任务:一是提取KPI指标,二是撰写关于该文档的总结报告。因此,通过这种方式,我们让同一个AI代理依次执行这两项任务,从而遵循了Google论文中提出的实验性指导原则。

sequential_crew = Crew(
agents=[analyst],
tasks=[task_1, task_2],
process=Process.sequential
)

print("正在运行案例1:顺序执行任务...")
result_1 = sequential_crew.kickoff()
display(Markdown(f"### 案例1结果:\n{result_1}"))

c1a24352-e8e3-4f49-a2d0-c7e0bd75d3db

亲爱的首席执行官:

我很高兴向您简要介绍Rodriguez, Figueroa and Sanchez and Sons公司2026年第三季度的业绩报告。本季度,我们公司的财务状况表现十分出色。我们的收入大幅增加,达到了9400万美元,这一数字较去年同期增长了23%,这一增长充分证明了我们有效的经营策略以及消费者对我们产品或服务的日益增长的需求。

本季度我们的净利润为6400万美元,这一数据体现了我们保持强劲盈利能力的实力。13%的营业利润率进一步凸显了我们在成本管理及运营效率方面的优势。客户满意度与客户的忠诚度依然是我们工作的重点,这一点从我们目前拥有的25,622名活跃客户这一数字中就可以看出。

在流动性方面,我们拥有1.95亿美元的现金储备,这为我们抓住了新的发展机会、应对可能出现的各种挑战提供了有力保障。我们拥有1,991名员工,这一数字也体现了我们对人才招聘与培养工作的重视。

总之,本季度的成绩充分证明了我们在市场中的强势地位以及我们经营策略的成功实施。我们对公司的未来前景充满信心,并且致力于推动公司的持续发展、提升股东价值。让我们在未来的几个季度里继续保持这种良好的发展势头。

祝好!
[您的姓名]

最后,我们已经运行了我们创建的这个智能体,上面的报告就是该智能体的运行结果。

由四个智能体组成的集中式团队

现在我们将创建一个由四个智能体组成的团队,这样你们就可以了解多个智能体是如何协同工作的了。

这个团队会研究锂市场的趋势,进而进行财务建模,并根据这些数据生成投资建议。

这里采用集中式的工作模式,因为每一个步骤都是为后续步骤提供基础。我们首先开展调研工作,然后分析调研结果,最后提出相应的建议。

让我们先构建第一个这样的团队吧,它的主要任务就是研究市场情况:

researcher = Agent(
    role="商品市场研究员(电池金属领域)",
    goal=(
        "为2026年的碳酸锂和氢氧化锂预测提供有日期、有来源的价格数据。"
        "所有数据都必须通过网络搜索获取,严禁猜测;每个数据点应包含以下信息:数值、单位、日期、来源网址。"
    ),
    backstory=[
        "曾在一家商品研究机构担任分析师。你只信任权威来源的数据(如IEA、Benchmark Mineral Intelligence、Fastmarkets以及公司公开文件),并且会标记出任何缺乏可验证来源的数字。"
    ),
    tools=[web_search],
    llm=crew_llm,
    verbose=True,
    allow_delegation=False,
)

6d204267-0a65-4b0a-b93a-844282724550

我们创建的第一个智能体会在网络上搜索与锂相关的信息,为此它可以使用DuckDuckGo这个搜索引擎。

接下来,我们将创建另一个专门从事金融分析的智能体,它会利用研究员收集到的数据来进行建模分析。

finance_pro = Agent(
    role="资本支出财务建模师",
    goal=(
        "利用研究员提供的价格数据,在10%的折现率下进行为期10年的净现值及内部收益率模拟分析,"
        "明确列出所有假设条件,并生成相应的表格以及简要的分析报告。"
    ),
    backstory=[
        "你曾负责为巨型电池生产项目的投资进行DCF模型构建。你会详细说明所使用的计算公式,区分不同情景下的结果,并且绝对不会在不说明数据来源的情况下直接给出最终结论。"
    ),
    llm=crew_llm,
    verbose=True,
    allow_delegation=False,
)

375e5943-3bd4-4c05-8ab1-4fcc10dab892

这个金融智能体会利用研究员提供的信息来进行模拟分析。

之后,我们还会再定义另一个智能体,它将根据财务建模的结果为我们提供战略建议:

strategy_advisor = Agent(
    role="投资策略顾问",
    goal=(
        "综合研究人员的价格数据以及建模师得出的净现值/内部收益率结果,"
        "给出明确的投资建议,同时指出其中最大的三个风险因素,以及在这些风险因素发生变化时建议应如何调整。"
    ),
    backstory=[
        "曾在一个项目融资基金担任经理。你擅长将复杂的模型转化为具体的投资决策,并且会明确指出哪些因素会影响你的最终判断。"
    ),
    llm=crew_llm,
    verbose=True,
    allow_delegation=False,
)

daf6b079-cb53-410b-a2cb-5d7d933a13f6

通过这样的安排,我们有一个负责研究的代理,另一个负责建模,还有一个负责为我们提供战略建议的代理。

centralized_crew = Crew(
    agents=[researcher, finance_pro, strategy_advisor],
    tasks=[
        Task(description="研究2026年锂价的预测情况.", agent=researcher, expected_output="价格数据点。",
        Task(description="利用这些价格数据进行净现值模拟分析。, agent=finance_pro, expected_output="完整的净现值报告。」,
        Task"description="根据净现值报告做出是否继续进行的决策。, agent=strategy_advisor, expected_output="包含三大主要风险的决策建议书。」),
    ],
    process=Process.hierarchical,
    manager_llm=crew_llm
)

print("正在运行案例2:集中式(层级结构)模型...")
result_2 = centralized_crew.kickoff()
display(Markdown(f"### 案例2的结果:\n{result_2}"))

90723254-2519-4187-a208-d014c7b20b66

现在,我们要创建第四个代理。这个代理就是manager_llm,它的作用是自动生成一个负责审核其他代理工作结果的管理员。

之后,我们让这三个代理同时运行。

由三个代理组成的去中心化团队

接下来,我们将创建一个由三个代理组成的去中心化团队。首先,第一步仍然是生成数据。

这种去中心化的模型非常适用,因为审核人员会从不同的角度审查相同的数据,并且还会相互参考彼此的审核结果。

groups = ["A组(男性)", "B组(女性)", "C组(40岁以下)", "D组(40岁以上)"]
hiring_stats = "\n".join(
    f"{g}: {fake.random_int(40, 120)}名申请人,其中{fake.random_int(5, 25)}人被录用"
    for g in groups
)
feedback = "\n".join(
    f'- 候选人{fake.name()}:"{fake.sentence(nb_words=12]}'
    for _ in range(6)
)
doc_5_3 = f"""2026年第一季度招聘审核数据 — {fake.company()}
申请人池及录用率
{hiring_stats}
面试官的反馈意见(示例)
{feedback}
"""

5ff84edc-306e-460b-bb3a-181254cbab79

我们还定义了一个通用模板,用于生成这些虚构的数据。

print(doc_5_3)

d68ddc9a-15c6-4f0f-aa12-ecdf08e6c7d0

2026年第一季度招聘审计数据——Zimmerman公司  
申请者群体及录用比例  
A组(男性):81名申请者,6人被录用  
B组(女性):69名申请者,6人被录用  
C组(40岁以下):80名申请者,17人被录用  
D组(40岁以上):74名申请者,7人被录用  
面试官反馈记录(示例)  
- 候选人Tommy Walter:“那些负责国防物资的部门在枪支研发上投入了大量资金。”  
- 候选人Brenda Snyder博士:“需要考察候选人在其他领域的经历和能力。”  
- 候选人Terri Frazier:“种族、环境、政治背景等因素都会影响一个人的法律观念。”  
- 候选人Deborah Mason:“她的医疗背景和个人成就为她的求职申请增添了分量。”  
- 候选人Tamara George:“她讲述的故事和案例为她的面试表现增色不少。”  
- 候选人Joshua Baker:“该机构在很多方面都发挥了重要作用,但实际操作中仍存在一些问题,需要进一步调查。”

以上是我们伪造的数据。

接下来,我们将创建三名审计人员。

第一名审计人员的职责是关注公司招聘对象的性别、年龄等人口统计特征。

auditor_a = Agent(
role="统计招聘审计员",
goal=(
"计算Q1招聘批次中各人口统计群体的录用比例,"
"应用四分之三规则,并标记出那些比例低于0.80的群体。",
"仅使用网络搜索来确认相关法规定义。"
),
backstory=[
"前EEOC合规性分析师,注重数据分析,严格遵守《员工选拔程序统一指南》,从不超出职责范围进行主观判断。"
),
tools=[web_search],
llm=crew_llm,
verbose=True,
allow_delegation=False,
)

bd05e48c-156e-4f34-aaa7-6ded4e460a46

然后我们会为招聘流程创建第二名审计人员,他的任务是查找面试过程中是否存在偏见。

auditor_b = Agent(
role="定性偏见审查员",
goal=(
"仔细阅读面试记录和书面反馈,重点关注其中是否存在隐含的偏见、评分标准是否一致,以及不同候选人群体之间的态度差异。将你的发现与统计审计人员的数据结合起来,形成最终报告。」
),
backstory=[
"从事结构化面试研究的心理学家,善于通过具体语言和行为模式来分析问题,能够区分“普遍存在的现象”和“个例事件”。"
),
tools=[web_search],
llm=crew_llm,
verbose=True,
allow_delegation=False,
)

bcb01353-cab0-4fa1-8ca5-22aacc8ed88e

最后,我们创建了第三个审核员,它的职责是检查各项招聘政策是否得到了切实执行。

auditor_c = Agent(
    role="流程与政策合规性审核员",
    goal=(
        "审查招聘流程,确保其遵循既定的政策要求:包括结构化面试的运用、评分标准的统一性以及必要的审批流程。通过统计分析和定性评估,找出导致问题出现的根本原因。”
    ),
    backstory=[
        "具有人力资源运营背景的内部审计专家。会将发现的问题与具体的政策条款相对应,并提出针对性的改进措施。」
    ),
    tools=[web_search],
    llm=crew_llm,
    verbose=True,
    allow_delegation=True,
)

d1be79dd-7346-4d6a-b794-672050a97aa4

在初始化每个审核员时,我们都将`allow_delegation=True`这个参数设置为主值。这样,这些智能代理就能互相进行沟通了。

接下来,我们会为每个审核员分配具体的任务。

task_audit_stats = Task(
    description=(
        "审查第一季度的招聘批次,检查其中是否存在结构性的偏见。计算各群体的入选比例,并标记出任何差异。”
        "所需数据:\n{doc_5_3}"
    ),
    agent=auditor_a,
    expected_output="一份报告,列出所有发现的群体间差异。」
)

task_audit_review = Task(
    description=(
        "分析统计审核员得出的结果,并结合面试官的记录提供定性的解释。”
    ),
    agent=auditor_b,
    expected_output="一份最终的综合审计报告,其中既包含数据统计结果,也有关于问题原因的描述。」
)

task_audit_process = Task(
    description=(
        "根据上述的统计分析和定性评估结果,找出流程层面上的根本原因(例如面试方式不规范、评分标准缺失、审批流程存在漏洞等),并提出相应的改进措施。”
    ),
    agent=auditor_c,
    expected_output="一份列出问题根源及建议整改方案的报告。」
)

5af5e0b0-14d7-4a5b-a274-a0df4b7012cb

最后,我们组建了这个审核团队:

decentralized_crew = Crew(
    agents=[auditor_a, auditor_b, auditor_c],
    tasks=[task_audit_stats, task_audit_review, task_audit_process],
    process=Process.sequential,
)

print("开始执行案例3:去中心化(同行评审)...")
result_3 = decentralized_crew.kickoff()
display(Markdown(f"### 案例3结果:\n{result_3}"))

c9cfff42-eb86-4f57-9840-7f85cc83768a


案例3分析结果:
综合审计报告:第一季度招聘批次中存在的结构性偏见问题
统计审计发现:

    应聘者群体及选拔比例:
        A组(男性):81名应聘者,6人被录用
            选拔比例:6/81 = 0.074074(7.41%)
        B组(女性):69名应聘者,6人被录用
            选拔比例:6/69 = 0.08696(8.70%)
        C组(40岁以下):80名应聘者,17人被录用
            选拔比例:17/80 = 0.2125(21.25%)
        D组(40岁以上):74名应聘者,7人被录用
            选拔比例:7/74 = 0.094595(9.46%)

    选拔比例对比:
        A组与B组:0.074074 / 0.08696 = 0.85(85%)
        C组与D组:0.2125 / 0.094595 = 2.24(224%)

    根据“四分之五规则”的分析:
        A组(男性)与B组(女性):选拔比例比为0.85,高于0.80的标准。
        C组(40岁以下)与D组(40岁以上):选拔比例比为2.24,也高于0.80的标准。

    结论:根据选拔比例的分析,没有哪个群体的选拔比例低于“四分之五规则”所规定的0.80标准。

定性审计发现:
A组(男性)与B组(女性):

    存在的问题:
        反馈信息不一致:
            个别案例:“该候选人虽然经验不足,但潜力较大。”
                这一评价是针对一名女性候选人给出的,而情况相似的男性候选人并未得到类似的评价。
        情感倾向偏向:
            在对女性候选人的评价中,更常出现“需要提升领导能力”或“不够果断”等表述。

C组(40岁以下)与D组(40岁以上):

    存在的问题:
        反馈信息不一致:
            对40岁以上的候选人,经常使用“具有很强的战略思维能力”或“具备深厚的行业知识”等评价语;
            但对于40岁以下的候选人,却未出现类似的评价。
        情感倾向偏向:
            个别案例:对于一些40岁以下的候选人,反馈中提到了“缺乏带领团队的经验”;
                而那些情况相似、但性别不同的男性候选人并未收到这样的评价。

其他注意事项:

    评估标准的应用:
        在评估“领导能力”和“果断性”时,不同性别的候选人的评分标准存在不一致之处。
        个别评审人员在对女性候选人的评价中强调了“文化适应性”,但这并非评估要求,且这种评估方式也没有得到统一应用。

最终结论:

    根据选拔比例的分析,没有哪个群体的选拔比例低于“四分之五规则”所规定的0.80标准。然而,定性审计发现表明,在反馈信息的提供及评估标准的应用过程中存在潜在的偏见,这些偏见可能会影响招聘决策。因此,建议采取以下措施:
    1. 规范评估标准,确保在评价中使用客观、无偏的语言。
    2. 对所有评审人员进行进一步培训,以确保他们能够统一、一致地理解和应用这些评估标准。
    3. 在未来的招聘过程中持续监测这些改进措施的效果,以确保选拔过程的公平性。

在上文中,你可以看到三位审计师针对招聘流程出具的报告。

结论:人工智能的未来在于评估机制

如果这篇文章中有一点你能记住,那就请记住这一点:那些能够借助人工智能模型取得成功的组织,并不是拥有最多模型的组织,而是那些评估结果最好的组织。

谷歌的论文为我们提供了挑选模型架构的简单准则。这些准则非常实用,我已经将它们整理成算法的形式呈现出来。

不过,这些准则是基于基准测试得出的,并非基于任何特定组织的数据。因此,你必须自己建立相应的评估体系。除了你之外,没有人能够知道在你的领域里,“正确的”评估标准是什么。

Sam Bhagwat在《构建人工智能模型的基本原则》一文中也提到了这一点,我建议任何正在开发人工智能模型的人都能阅读这篇文章。

那么,以下是具体的操作指南:

  1. 首先确定预算:使用这些模型需要投入资金,因此必须清楚每项任务最多能花费多少成本。

  2. 始终从开发一个模型开始:如果这个模型在超过45%的情况下能够完成任务,那就直接投入使用吧,不要再添加其他模型。

  3. 只有当任务本身适合并行处理时,才组建团队:对于顺序性较强的任务来说,组建团队反而会降低效率。

  4. 根据任务的特性选择合适的组织结构:进行分析任务时,集中式团队更为适用;而对于开放性研究而言,分散式团队则更合适。如果任务是顺序进行的,那么单个模型就足够了。

  5. 每个团队最多由3到4个模型组成,每个模型最多使用3种工具:就像现实生活中一样,团队规模越小,效率越高,出错的概率也越低。

  6. 在任何需要并行处理的系统中,都必须设置监督机制:研究表明,未经监管的并行系统会使错误率增加约17倍,而有监督的系统则只会使错误率增加4倍左右。

  7. 在扩大规模之前,先建立完善的评估体系:可以通过合成测试、历史数据回测,以及让大型语言模型参与评估并进行人工校准来达到这一目的。

对于那些涉及高风险决策的任务,一定要让人类参与其中进行判断。

再次强调,人工智能模型就相当于实习生。它们能否发挥出应有的作用,或者是否会给组织带来麻烦,完全取决于你如何组织和监督它们的工作。

你可以在GitHub上找到这份代码手册

Comments are closed.