Chenyj Space
返回博客
·58 分钟

AutoGen 多智能体框架:构建协作式 AI 系统

AutoGen多智能体AI Agent协作系统LLMAI

什么是 AutoGen

AutoGen 是微软开源的多智能体框架,专注于构建多个 AI Agent 协作完成复杂任务的系统。

核心特性:

  • 多智能体对话:多个 Agent 之间进行对话协作
  • 灵活的对话模式:支持双人、群聊、嵌套等多种模式
  • 人类参与:无缝集成人类反馈
  • 代码执行:Agent 可以编写和执行代码
  • 可定制性:高度可定制的 Agent 行为

环境搭建

bash
# 安装 AutoGen
pip install pyautogen

# 安装可选依赖
pip install autogen-agentchat  # AgentChat 组件
pip install autogen-ext  # 扩展组件

# 配置环境变量
export OPENAI_API_KEY="your-api-key"

核心概念

1. Agent(智能体)

python
from autogen import AssistantAgent, UserProxyAgent, ConversableAgent

# 助手 Agent(AI 驱动)
assistant = AssistantAgent(
    name="assistant",
    llm_config={
        "model": "gpt-4o",
        "temperature": 0.7,
        "api_key": "your-api-key"
    },
    system_message="你是一个有用的 AI 助手。"
)

# 用户代理(人类参与)
user_proxy = UserProxyAgent(
    name="user_proxy",
    human_input_mode="ALWAYS",  # 总是请求人类输入
    code_execution_config=False  # 不执行代码
)

# 可对话 Agent(自定义)
custom_agent = ConversableAgent(
    name="custom",
    llm_config={"model": "gpt-4o"},
    system_message="你是一个专业的顾问。",
    human_input_mode="NEVER",  # 不请求人类输入
    max_consecutive_auto_reply=10
)

2. 对话模式

python
from autogen import GroupChat, GroupChatManager

# 双人对话
assistant.initiate_chat(
    user_proxy,
    message="你好,有什么可以帮助你的吗?"
)

# 群聊
agents = [assistant, user_proxy, custom_agent]

group_chat = GroupChat(
    agents=agents,
    messages=[],
    max_round=20,
    speaker_selection_method="round_robin"  # 轮流发言
)

manager = GroupChatManager(
    groupchat=group_chat,
    llm_config={"model": "gpt-4o"}
)

# 启动群聊
user_proxy.initiate_chat(
    manager,
    message="我们需要讨论一下项目计划"
)

Agent 类型

1. AssistantAgent(助手)

python
from autogen import AssistantAgent

# 代码生成助手
code_assistant = AssistantAgent(
    name="coder",
    llm_config={
        "model": "gpt-4o",
        "temperature": 0
    },
    system_message="你是一个 Python 专家。请用 Python 编写代码来解决问题,并确保代码可以运行。"
)

# 文档写作助手
writer_assistant = AssistantAgent(
    name="writer",
    llm_config={"model": "gpt-4o"},
    system_message="""你是一个技术写作专家。
    请用清晰、简洁的语言撰写技术文档。
    使用 Markdown 格式。"""
)

# 审查助手
reviewer_assistant = AssistantAgent(
    name="reviewer",
    llm_config={"model": "gpt-4o"},
    system_message="""你是一个代码审查专家。
    请检查代码的:
    1. 正确性
    2. 可读性
    3. 性能
    4. 安全性
    给出具体的改进建议。"""
)

2. UserProxyAgent(用户代理)

python
from autogen import UserProxyAgent

# 人类参与模式
human_proxy = UserProxyAgent(
    name="human",
    human_input_mode="ALWAYS",
    code_execution_config=False
)

# 自动模式(无人类参与)
auto_proxy = UserProxyAgent(
    name="auto",
    human_input_mode="NEVER",
    code_execution_config={
        "work_dir": "workspace",
        "use_docker": True,
        "timeout": 60,
        "last_n_messages": 3
    }
)

# 终止模式(特定条件下请求人类输入)
terminate_proxy = UserProxyAgent(
    name="terminate",
    human_input_mode="TERMINATE",
    max_consecutive_auto_reply=5,
    code_execution_config=False
)

3. 自定义 Agent

python
from autogen import ConversableAgent

class ResearchAgent(ConversableAgent):
    """研究助手 Agent"""

    def __init__(self, name, llm_config):
        super().__init__(
            name=name,
            llm_config=llm_config,
            system_message="""你是一个研究助手。
            你的任务是:
            1. 分析问题
            2. 搜索相关信息
            3. 综合分析
            4. 生成报告"""
        )
        self.research_results = []

    def generate_reply(self, messages, sender, **kwargs):
        """自定义回复生成"""
        # 分析输入
        last_message = messages[-1]["content"]

        # 执行研究
        research = self.conduct_research(last_message)
        self.research_results.append(research)

        # 生成回复
        reply = self.synthesize_findings(research)

        return reply

    def conduct_research(self, topic):
        """执行研究"""
        # 这里可以集成搜索 API、数据库查询等
        return f"关于 {topic} 的研究结果..."

    def synthesize_findings(self, research):
        """综合研究发现"""
        prompt = f"请综合以下研究发现,生成一个简洁的报告:\n{research}"
        return self.llm.generate(prompt)

代码执行

1. 本地代码执行

python
from autogen import UserProxyAgent

# 配置本地代码执行
code_executor = UserProxyAgent(
    name="executor",
    human_input_mode="NEVER",
    code_execution_config={
        "work_dir": "./workspace",
        "use_docker": False,  # 不使用 Docker
        "timeout": 120,
        "last_n_messages": 3
    }
)

# 让 Agent 执行代码
assistant = AssistantAgent(
    name="coder",
    llm_config={"model": "gpt-4o"}
)

# 启动对话
code_executor.initiate_chat(
    assistant,
    message="请写一个 Python 脚本,计算斐波那契数列的前 20 项"
)

2. Docker 代码执行

python
# 使用 Docker 执行代码(更安全)
code_executor = UserProxyAgent(
    name="executor",
    human_input_mode="NEVER",
    code_execution_config={
        "work_dir": "./workspace",
        "use_docker": "python:3.11-slim",  # 使用 Docker 镜像
        "timeout": 120,
        "docker_network": "bridge",
        "docker_volume": "./workspace:/workspace"
    }
)

3. 代码执行沙箱

python
from autogen.coding import DockerCommandLineCodeExecutor, LocalCommandLineCodeExecutor

# Docker 沙箱
docker_executor = DockerCommandLineCodeExecutor(
    image="python:3.11-slim",
    timeout=60,
    work_dir="./workspace"
)

# 本地沙箱
local_executor = LocalCommandLineCodeExecutor(
    timeout=60,
    work_dir="./workspace"
)

# 使用沙箱
assistant = AssistantAgent(
    name="coder",
    llm_config={"model": "gpt-4o"},
    code_execution_config={"executor": docker_executor}
)

对话流程控制

1. 自定义说话人选择

python
from autogen import GroupChat, GroupChatManager

def custom_speaker_selection(last_speaker, group_chat):
    """自定义说话人选择逻辑"""
    messages = group_chat.messages

    if len(messages) == 0:
        # 第一条消息,选择主持人
        return group_chat.agent_by_name("moderator")

    last_message = messages[-1]["content"]

    # 根据内容选择说话人
    if "代码" in last_message or "实现" in last_message:
        return group_chat.agent_by_name("coder")
    elif "审查" in last_message or "检查" in last_message:
        return group_chat.agent_by_name("reviewer")
    elif "文档" in last_message:
        return group_chat.agent_by_name("writer")
    else:
        # 默认轮询
        current_idx = group_chat.agents.index(last_speaker)
        next_idx = (current_idx + 1) % len(group_chat.agents)
        return group_chat.agents[next_idx]

group_chat = GroupChat(
    agents=[moderator, coder, reviewer, writer],
    messages=[],
    max_round=30,
    speaker_selection_method=custom_speaker_selection
)

2. 终止条件

python
from autogen import GroupChat

# 自定义终止条件
def is_termination_met(messages):
    """检查是否满足终止条件"""
    if len(messages) == 0:
        return False

    last_message = messages[-1]["content"].lower()

    # 检查终止关键词
    termination_keywords = ["完成", "结束", "终止", "done", "finished"]
    for keyword in termination_keywords:
        if keyword in last_message:
            return True

    # 检查消息数量
    if len(messages) > 50:
        return True

    return False

group_chat = GroupChat(
    agents=agents,
    messages=[],
    max_round=100,
    speaker_selection_method="auto",
    is_termination_msg=is_termination_met
)

3. 嵌套对话

python
from autogen import GroupChat, GroupChatManager

# 创建子群组
inner_group = GroupChat(
    agents=[coder, reviewer],
    messages=[],
    max_round=10
)

inner_manager = GroupChatManager(
    groupchat=inner_group,
    name="dev_team",
    llm_config={"model": "gpt-4o"}
)

# 主群组包含子群组的管理器
outer_group = GroupChat(
    agents=[project_manager, inner_manager, writer],
    messages=[],
    max_round=20
)

outer_manager = GroupChatManager(
    groupchat=outer_group,
    llm_config={"model": "gpt-4o"}
)

# 启动嵌套对话
project_manager.initiate_chat(
    outer_manager,
    message="我们需要开发一个新功能"
)

工具集成

1. 函数注册

python
from autogen import register_function

# 定义工具函数
def search_web(query: str) -> str:
    """搜索互联网"""
    # 实际实现
    return f"搜索结果:{query}"

def read_file(file_path: str) -> str:
    """读取文件"""
    with open(file_path, 'r') as f:
        return f.read()

def write_file(file_path: str, content: str) -> str:
    """写入文件"""
    with open(file_path, 'w') as f:
        f.write(content)
    return f"文件 {file_path} 已写入"

# 注册工具
register_function(
    search_web,
    caller=assistant,
    executor=code_executor,
    name="search_web",
    description="搜索互联网获取信息"
)

register_function(
    read_file,
    caller=assistant,
    executor=code_executor,
    name="read_file",
    description="读取文件内容"
)

2. 工具调用

python
from autogen import AssistantAgent, UserProxyAgent

# 创建 Agent
assistant = AssistantAgent(
    name="assistant",
    llm_config={
        "model": "gpt-4o",
        "tools": [
            {
                "type": "function",
                "function": {
                    "name": "search_web",
                    "description": "搜索互联网获取信息",
                    "parameters": {
                        "type": "object",
                        "properties": {
                            "query": {
                                "type": "string",
                                "description": "搜索关键词"
                            }
                        },
                        "required": ["query"]
                    }
                }
            },
            {
                "type": "function",
                "function": {
                    "name": "read_file",
                    "description": "读取文件内容",
                    "parameters": {
                        "type": "object",
                        "properties": {
                            "file_path": {
                                "type": "string",
                                "description": "文件路径"
                            }
                        },
                        "required": ["file_path"]
                    }
                }
            }
        ]
    }
)

executor = UserProxyAgent(
    name="executor",
    human_input_mode="NEVER",
    code_execution_config=False
)

# 注册函数
register_function(search_web, caller=assistant, executor=executor)
register_function(read_file, caller=assistant, executor=executor)

实战案例

1. 软件开发团队

python
from autogen import AssistantAgent, UserProxyAgent, GroupChat, GroupChatManager

class SoftwareDevTeam:
    """软件开发团队"""

    def __init__(self):
        self.agents = self.create_agents()
        self.group_chat = self.create_group_chat()

    def create_agents(self):
        """创建团队成员"""
        # 产品经理
        pm = AssistantAgent(
            name="product_manager",
            llm_config={"model": "gpt-4o"},
            system_message="""你是产品经理。
            负责需求分析和项目规划。
            使用用户故事格式描述需求。"""
        )

        # 架构师
        architect = AssistantAgent(
            name="architect",
            llm_config={"model": "gpt-4o"},
            system_message="""你是软件架构师。
            负责系统设计和技术选型。
            给出清晰的架构图和组件说明。"""
        )

        # 开发者
        developer = AssistantAgent(
            name="developer",
            llm_config={"model": "gpt-4o"},
            system_message="""你是高级开发者。
            负责代码实现。
            编写高质量、可维护的代码。"""
        )

        # 测试工程师
        tester = AssistantAgent(
            name="tester",
            llm_config={"model": "gpt-4o"},
            system_message="""你是测试工程师。
            负责测试策略和质量保证。
            编写测试用例和测试报告。"""
        )

        # 用户代理(项目经理)
        manager = UserProxyAgent(
            name="project_manager",
            human_input_mode="ALWAYS",
            code_execution_config=False
        )

        return [pm, architect, developer, tester, manager]

    def create_group_chat(self):
        """创建群聊"""
        def check_termination(x):
            return "项目完成" in x.get("content", "").lower()

        group_chat = GroupChat(
            agents=self.agents,
            messages=[],
            max_round=50,
            speaker_selection_method="auto",
            is_termination_msg=check_termination
        )

        return GroupChatManager(
            groupchat=group_chat,
            llm_config={"model": "gpt-4o"}
        )

    def develop_feature(self, feature_description: str):
        """开发新功能"""
        return self.group_chat.initiate_chat(
            self.agents[-1],  # 项目经理发起
            message=f"我们需要开发以下功能:{feature_description}"
        )

# 使用示例
team = SoftwareDevTeam()
team.develop_feature("用户登录系统,支持邮箱和手机号登录")

2. 研究助手系统

python
from autogen import AssistantAgent, UserProxyAgent, GroupChat

class ResearchSystem:
    """研究助手系统"""

    def __init__(self):
        self.agents = self.create_agents()

    def create_agents(self):
        """创建研究团队"""
        # 研究主管
        director = AssistantAgent(
            name="research_director",
            llm_config={"model": "gpt-4o"},
            system_message="""你是研究主管。
            负责研究方向把控和进度管理。
            确保研究质量和创新性。"""
        )

        # 文献研究员
        literature_researcher = AssistantAgent(
            name="literature_researcher",
            llm_config={"model": "gpt-4o"},
            system_message="""你是文献研究专家。
            负责文献搜索、阅读和综述。
            提供全面的文献分析。"""
        )

        # 数据分析师
        data_analyst = AssistantAgent(
            name="data_analyst",
            llm_config={"model": "gpt-4o"},
            system_message="""你是数据分析专家。
            负责数据收集、清洗和分析。
            使用统计方法验证假设。"""
        )

        # 论文写手
        writer = AssistantAgent(
            name="paper_writer",
            llm_config={"model": "gpt-4o"},
            system_message="""你是学术写作专家。
            负责论文撰写和修改。
            确保语言规范、逻辑清晰。"""
        )

        # 用户
        user = UserProxyAgent(
            name="researcher",
            human_input_mode="ALWAYS",
            code_execution_config=False
        )

        return [director, literature_researcher, data_analyst, writer, user]

    def conduct_research(self, topic: str):
        """执行研究"""
        group_chat = GroupChat(
            agents=self.agents,
            messages=[],
            max_round=40,
            speaker_selection_method="auto"
        )

        manager = GroupChatManager(
            groupchat=group_chat,
            llm_config={"model": "gpt-4o"}
        )

        return self.agents[-1].initiate_chat(
            manager,
            message=f"请对以下主题进行深入研究:{topic}"
        )

# 使用示例
research = ResearchSystem()
research.conduct_research("大语言模型在教育领域的应用")

3. 内容创作团队

python
class ContentCreationTeam:
    """内容创作团队"""

    def __init__(self):
        self.setup_agents()

    def setup_agents(self):
        """设置 Agent"""
        # 内容策划
        self.planner = AssistantAgent(
            name="content_planner",
            llm_config={"model": "gpt-4o"},
            system_message="""你是内容策划专家。
            负责选题、大纲设计和内容策略。
            确保内容有吸引力且符合目标受众。"""
        )

        # 写手
        self.writer = AssistantAgent(
            name="writer",
            llm_config={"model": "gpt-4o"},
            system_message="""你是专业写手。
            负责内容创作。
            写作风格:清晰、有趣、专业。"""
        )

        # 编辑
        self.editor = AssistantAgent(
            name="editor",
            llm_config={"model": "gpt-4o"},
            system_message="""你是资深编辑。
            负责内容审核和修改。
            关注:语法、逻辑、可读性。"""
        )

        # SEO 专家
        self.seo_expert = AssistantAgent(
            name="seo_expert",
            llm_config={"model": "gpt-4o"},
            system_message="""你是 SEO 专家。
            负责内容优化。
            关注:关键词、标题、元描述。"""
        )

        self.user = UserProxyAgent(
            name="client",
            human_input_mode="ALWAYS",
            code_execution_config=False
        )

    def create_content(self, topic: str, content_type: str = "blog"):
        """创建内容"""
        agents = [self.planner, self.writer, self.editor, self.seo_expert, self.user]

        group_chat = GroupChat(
            agents=agents,
            messages=[],
            max_round=30,
            speaker_selection_method="auto"
        )

        manager = GroupChatManager(
            groupchat=group_chat,
            llm_config={"model": "gpt-4o"}
        )

        return self.user.initiate_chat(
            manager,
            message=f"请创建一篇关于 {topic} 的{content_type}文章"
        )

# 使用示例
team = ContentCreationTeam()
team.create_content("人工智能在医疗领域的应用", "技术博客")

高级特性

1. 嵌套聊天(Nested Chat)

python
from autogen import ConversableAgent

# 定义消息生成函数
def generate_review_message(recipient, messages, sender, config):
    return f"请审查以下代码:\n{messages[-1]['content']}"

# 定义嵌套聊天配置
nested_chat_config = [
    {
        "recipient": reviewer,
        "message": generate_review_message,
        "summary_method": "last_msg",
        "max_turns": 2
    }
]

# 为主 Agent 添加嵌套聊天
assistant = AssistantAgent(
    name="coder",
    llm_config={"model": "gpt-4o"}
)

assistant.register_nested_chats(
    nested_chat_config,
    trigger=code_executor
)

2. 会话持久化

python
import json
from autogen import GroupChat

class PersistentGroupChat(GroupChat):
    """可持久化的群聊"""

    def __init__(self, *args, save_path="chat_history.json", **kwargs):
        super().__init__(*args, **kwargs)
        self.save_path = save_path
        self.load_history()

    def append(self, message, speaker):
        """添加消息并保存"""
        super().append(message, speaker)
        self.save_history()

    def save_history(self):
        """保存聊天历史"""
        history = []
        for msg, speaker in zip(self.messages, self.speakers):
            history.append({
                "content": msg["content"],
                "speaker": speaker.name,
                "role": msg.get("role", "assistant")
            })

        with open(self.save_path, 'w') as f:
            json.dump(history, f, indent=2)

    def load_history(self):
        """加载聊天历史"""
        try:
            with open(self.save_path, 'r') as f:
                history = json.load(f)

            for item in history:
                speaker = self.agent_by_name(item["speaker"])
                self.append(
                    {"content": item["content"], "role": item["role"]},
                    speaker
                )
        except FileNotFoundError:
            pass

3. 流式输出

python
from autogen import AssistantAgent, UserProxyAgent

# 启用流式输出
assistant = AssistantAgent(
    name="assistant",
    llm_config={
        "model": "gpt-4o",
        "stream": True  # 启用流式
    }
)

# 自定义流式处理
def stream_callback(message):
    """流式消息回调"""
    print(message, end="", flush=True)

user_proxy = UserProxyAgent(
    name="user",
    human_input_mode="NEVER"
)

# 启动流式对话
user_proxy.initiate_chat(
    assistant,
    message="请详细解释量子计算",
    callback=stream_callback
)

与其他框架集成

1. LangChain 集成

python
from langchain_openai import ChatOpenAI
from autogen import AssistantAgent

# 使用 LangChain 的 LLM
llm = ChatOpenAI(model="gpt-4o")

# 包装为 AutoGen 配置
llm_config = {
    "config_list": [
        {
            "model": "gpt-4o",
            "api_key": llm.openai_api_key
        }
    ]
}

assistant = AssistantAgent(
    name="assistant",
    llm_config=llm_config
)

2. 工具链集成

python
from autogen import register_function
from langchain.tools import Tool

# LangChain 工具转 AutoGen
langchain_tool = Tool(
    name="search",
    func=search_func,
    description="搜索工具"
)

# 注册到 AutoGen
register_function(
    langchain_tool.func,
    caller=assistant,
    executor=executor,
    name=langchain_tool.name,
    description=langchain_tool.description
)

最佳实践

1. Agent 设计原则

python
# 好的 Agent 设计
good_agent = AssistantAgent(
    name="specialist",
    llm_config={"model": "gpt-4o"},
    system_message="""你是一个特定领域的专家。
    
    你的职责:
    1. 明确的任务边界
    2. 清晰的输出格式
    3. 具体的质量标准
    
    请按照以下格式输出:
    - 结论
    - 证据
    - 建议"""
)

# 避免的设计
bad_agent = AssistantAgent(
    name="generalist",
    llm_config={"model": "gpt-4o"},
    system_message="你是一个全能助手,什么都做。"  # 太模糊
)

2. 对话管理

python
from autogen import GroupChat

def check_termination(message):
    """检查终止条件"""
    content = message.get("content", "").lower()
    return any(keyword in content for keyword in ["完成", "结束", "done"])

def create_managed_group_chat(agents, max_rounds=30):
    """创建有管理的群聊"""
    return GroupChat(
        agents=agents,
        messages=[],
        max_round=max_rounds,
        speaker_selection_method="auto",
        is_termination_msg=check_termination,
        allow_repeat_speaker=False  # 避免重复发言
    )

3. 错误处理

python
from autogen import AssistantAgent, GroupChatManager

class RobustGroupChatManager(GroupChatManager):
    """健壮的群聊管理器"""

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.max_retries = 3

    def generate_reply(self, messages, sender, **kwargs):
        """带重试的回复生成"""
        for attempt in range(self.max_retries):
            try:
                return super().generate_reply(messages, sender, **kwargs)
            except Exception as e:
                if attempt == self.max_retries - 1:
                    return f"抱歉,处理请求时遇到错误:{e}"
                print(f"重试 {attempt + 1}/{self.max_retries}")

总结

AutoGen 核心优势:

  1. 多智能体协作:原生支持多个 Agent 对话
  2. 灵活的对话模式:双人、群聊、嵌套对话
  3. 人类参与:无缝集成人类反馈
  4. 代码执行:内置安全的代码执行环境
  5. 高度可定制:灵活的 Agent 行为定义

AutoGen 适合构建复杂的多 Agent 协作系统,是 LangChain 的有力补充。


延伸阅读