标签: AGI

  • 大型语言模型驱动的智能体:从诞生到社会

    近年来,人工智能领域取得了令人瞩目的进展,其中大型语言模型(LLM)的出现被认为是通向通用人工智能(AGI)的关键一步。LLM 拥有强大的语言理解和生成能力,为构建能够感知环境、做出决策并执行行动的智能体提供了坚实的基础。本文将深入探讨 LLM 驱动的智能体,从其构建、应用到社会模拟等方面展开论述。

    1. 智能体的诞生:LLM 驱动的智能体构建

    LLM 驱动的智能体通常由三个主要部分组成:大脑感知行动

    1.1 大脑:以 LLM 为核心

    LLM 是智能体的大脑,赋予其强大的语言能力,使其能够理解和生成自然语言。

    1.1.1 自然语言交互

    LLM 在自然语言交互方面展现出卓越的能力,包括:

    1.1.2 知识

    LLM 的知识储备是其强大能力的基石,主要来源包括:

    1.1.3 内存

    LLM 的内存能力决定了其记忆和检索信息的能力。

    1.1.4 推理与规划

    LLM 的推理和规划能力是其解决复杂问题、制定行动计划的关键。

    1.1.5 可迁移性和泛化性

    LLM 的可迁移性和泛化性决定了其在不同任务和场景下的适应能力。

    1.2 感知:多模态输入

    LLM 驱动的智能体可以通过多模态感知,获取更丰富的信息。

    1.2.1 视觉

    LLM 可以理解和生成图像信息,例如,Images Speak in Images: A Generalist Painter for In-Context Visual Learning 提出了一个用于上下文视觉学习的通用模型 Painter。

    1.2.2 音频

    LLM 可以理解和生成音频信息,例如,Neural Codec Language Models are Zero-Shot Text to Speech Synthesizers 训练了一个神经编解码语言模型 VALL-E,具备上下文学习能力。

    1.3 行动:扩展行动空间

    LLM 驱动的智能体可以通过工具使用和具身行动,扩展其行动能力。

    1.3.1 工具使用

    LLM 可以使用外部工具来完成任务,例如,ToolLLM: Facilitating Large Language Models to Master 16000+ Real-world APIs 提出了一种通用的工具使用框架 ToolLLM,可以帮助 LLM 使用各种 API。

    1.3.2 具身行动

    LLM 可以控制机器人等具身智能体,在物理环境中执行任务,例如,PaLM-E: An Embodied Multimodal Language Model 提出了一种具身多模态语言模型 PaLM-E,可以进行具身行动。

    2. 智能体在实践中:LLM 驱动的智能体应用

    LLM 驱动的智能体在各个领域展现出巨大的应用潜力。

    2.1 单个智能体的通用能力

    2.1.1 任务导向部署

    LLM 驱动的智能体可以用于完成各种特定任务,例如:

    2.1.2 创新导向部署

    LLM 驱动的智能体可以用于推动创新,例如:

    2.1.3 生命周期导向部署

    LLM 驱动的智能体可以用于模拟生物的生命周期,例如:

    2.2 多个智能体的协调潜力

    2.2.1 合作交互以实现互补

    LLM 驱动的智能体可以协同合作,发挥各自的优势,例如:

    2.2.2 对抗交互以实现进步

    LLM 驱动的智能体可以通过对抗交互,提升各自的能力,例如:

    2.3 人机交互

    2.3.1 指导者-执行者模式

    LLM 驱动的智能体可以作为人类的助手,执行指令,例如:

    2.3.2 平等伙伴模式

    LLM 驱动的智能体可以作为人类的伙伴,进行平等的交流和合作,例如:

    3. 智能体社会:从个体到群体

    LLM 驱动的智能体可以形成社会,模拟人类社会的行为和现象。

    3.1 LLM 驱动的智能体的行为和个性

    3.1.1 社会行为
    3.1.2 个性

    3.2 智能体社会环境

    3.2.1 文本环境

    LLM 驱动的智能体可以在文本环境中进行交互,例如,Hoodwinked: Deception and Cooperation in a Text-Based Game for Language Models 展示了 LLM 在文本游戏中的应用。

    3.2.2 虚拟沙盒环境

    LLM 驱动的智能体可以在虚拟沙盒环境中进行模拟,例如,Generative Agents: Interactive Simulacra of Human Behavior 展示了 LLM 在虚拟环境中的应用。

    3.2.3 物理环境

    LLM 驱动的智能体可以控制机器人等具身智能体,在物理环境中进行交互,例如,RoboAgent: Generalization and Efficiency in Robot Manipulation via Semantic Augmentations and Action Chunking 展示了 LLM 在机器人控制中的应用。

    3.3 基于 LLM 的智能体社会模拟

    LLM 驱动的智能体可以用于模拟人类社会,例如:

    4. 未来展望:机遇与挑战并存

    LLM 驱动的智能体正处于快速发展阶段,其强大的语言能力、知识储备、推理规划能力以及可迁移性和泛化性,使其在各种领域展现出巨大潜力。然而,我们也必须清醒地认识到,这项技术的发展并非一帆风顺,还面临着许多挑战和风险。

    4.1 互相促进:LLM 与智能体研究的双向赋能

    LLM 研究为智能体研究提供了强大的基础模型,例如,LLM 可以帮助智能体进行决策、规划和行动,并有效地处理未见任务。另一方面,智能体研究也为 LLM 研究提出了新的挑战和方向,例如,如何让 LLM 更好地理解环境、学习新的技能以及进行更有效的社会交互。

    4.2 评价体系:多维评估,确保智能体安全可靠

    评估 LLM 驱动的智能体是一个复杂的过程,需要考虑多个维度:

    4.3 安全与信任:防范风险,构建可信赖的智能体

    LLM 驱动的智能体在应用过程中存在着许多潜在风险,例如:

    为了降低风险,我们需要采取措施,例如:

    • 增强鲁棒性: 通过对抗性训练等方法,提升 LLM 的鲁棒性。
    • 提高可信度: 通过思维链等方法,增强 LLM 的可解释性和可信度。
    • 规范使用: 制定相关政策和标准,规范 LLM 驱动的智能体的使用。

    4.4 规模化:构建更复杂、更真实的智能体社会

    随着智能体数量的增加,我们可以构建更复杂、更真实的智能体社会,例如:

    然而,规模化也带来了新的挑战,例如:

    • 计算负担: 智能体数量的增加会带来巨大的计算负担。
    • 协调难度: 协调大量智能体进行有效的合作和交流会非常困难。
    • 信息失真: 智能体数量的增加可能导致信息失真和传播问题。

    4.5 开放问题:探索未知,展望未来

    LLM 驱动的智能体领域还有许多开放问题需要进一步研究,例如:

    • 通向 AGI 的道路: LLM 驱动的智能体是否能成为通向 AGI 的道路?
    • 从虚拟到现实: 如何将 LLM 驱动的智能体从虚拟环境迁移到真实的物理环境?
    • 群体智能: 如何利用 LLM 驱动的智能体社会来探索群体智能的奥秘?
    • 代理即服务: 如何将 LLM 驱动的智能体作为服务提供给用户?

    5. 结语

    LLM 驱动的智能体正在改变着我们对人工智能的理解,也为我们带来了前所未有的机遇和挑战。未来,我们期待着 LLM 驱动的智能体能够在更多领域发挥作用,为人类社会带来更大的福祉。

    参考文献

    [1] The Rise and Potential of Large Language Model Based Agents: A Survey. Zhiheng Xi et al. (2023). https://arxiv.org/abs/2309.07864

    [2] LLM-Agent-Paper-List. https://github.com/WooooDyy/LLM-Agent-Paper-List

    致谢

    感谢复旦大学自然语言处理团队(FudanNLP)的辛勤付出,为我们带来了这篇精彩的综述论文。

  • MetaGPT 教学助手:一键生成技术教程

    在学习新技术时,一份好的教程可以事半功倍。MetaGPT 的教学助手角色,可以帮助你根据简单的描述,自动生成技术教程文档。

    教学助手的功能

    教学助手可以根据用户提供的单句描述,生成一份技术教程文档,并支持自定义语言。

    设计理念

    教学助手的设计思路是:

    1. 使用大型语言模型 (LLM) 生成教程的大纲。
    2. 根据二级标题将大纲分解成多个部分。
    3. 针对每个部分,根据标题生成详细内容。
    4. 最后将标题和内容拼接起来。

    使用分段的方式,可以解决 LLM 模型处理长文本的限制。

    代码实现

    角色定义

    定义教学助手角色类,继承自 Role 基类,并重写 __init__ 初始化方法。__init__ 方法必须包含 nameprofilegoalconstraints 参数。第一行代码使用 super().__init__(name, profile, goal, constraints) 调用父类的构造函数,初始化 Role。使用 self.set_actions([WriteDirectory(language=language)]) 添加初始动作和状态。这里,最初添加了写目录动作。此外,还可以定义自定义参数;这里添加了 language 参数,用于支持自定义语言。使用 self._set_react_mode(react_mode="by_order")set_actions 中的动作执行顺序设置为顺序执行。

    class TutorialAssistant(Role):
        """教学助手,输入一句话生成一份标记格式的教程文档。
    
        Args:
            name: 角色名称。
            profile: 角色简介。
            goal: 角色目标。
            constraints: 角色的约束或要求。
            language: 生成教程文档的语言。
        """
    
        def __init__(
            self,
            name: str = "Stitch",
            profile: str = "教学助手",
            goal: str = "生成教程文档",
            constraints: str = "严格遵循 Markdown 语法,布局整洁规范",
            language: str = "Chinese",
        ):
            super().__init__(name, profile, goal, constraints)
            self.set_actions([WriteDirectory(language=language)])
            self.topic = ""
            self.main_title = ""
            self.total_content = ""
            self.language = language
            self._set_react_mode(react_mode="by_order")

    重写 react 方法

    重写 react 方法。使用 await super().react() 调用 Role 基类的 react 方法。根据 __init__ 方法中设置的 react_mode="by_order",按顺序执行 states 中的每个动作。这里重写的目的是在完成所有动作后执行最终操作,即:将拼接后的教程内容写入 markdown 文件。

    async def react(self) -> Message:
        msg = await super().react()
        root_path = TUTORIAL_PATH / datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
        await File.write(root_path, f"{self.main_title}.md", self.total_content.encode('utf-8'))
        return msg

    重写 _act 方法

    _act 方法负责执行动作。使用 todo = self.rc.todo 从上下文中获取下一个要执行的动作,然后执行动作的 run 方法。这里,它首先通过 WriteDirectory 获取教程目录结构,然后对目录进行分块,为每个块生成一个 WriteContent 动作,并初始化新添加的动作。这里再次调用 await super().react() 是为了从头开始执行所有新添加的 WriteContent 动作。每个动作的结果用于生成一个 Message(content=resp, role=self.profile) 消息,该消息可以放置在上下文记忆 self.rc.memory 中。该角色不需要存储。

    async def _act(self) -> Message:
        todo = self.rc.todo
        if type(todo) is WriteDirectory:
            msg = self.rc.memory.get(k=1)[0]
            self.topic = msg.content
            resp = await todo.run(topic=self.topic)
            logger.info(resp)
            await self._handle_directory(resp)
            return await super().react()
        resp = await todo.run(topic=self.topic)
        logger.info(resp)
        if self.total_content != "":
            self.total_content += "\n\n\n"
        self.total_content += resp
        return Message(content=resp, role=self.profile)
    
    async def _handle_directory(self, titles: Dict) -> Message:
        """处理教程文档的目录。
    
        Args:
            titles: 包含标题和目录结构的字典,
                    例如 {"title": "xxx", "directory": [{"dir 1": ["sub dir 1", "sub dir 2"]}]}
    
        Returns:
            包含目录信息的 Message。
        """
        self.main_title = titles.get("title")
        directory = f"{self.main_title}\n"
        self.total_content += f"# {self.main_title}"
        actions = list()
        for first_dir in titles.get("directory"):
            actions.append(WriteContent(language=self.language, directory=first_dir))
            key = list(first_dir.keys())[0]
            directory += f"- {key}\n"
            for second_dir in first_dir[key]:
                directory += f"  - {second_dir}\n"
        self.set_actions(actions)

    动作定义

    定义动作,每个动作对应一个类对象。继承自 Action 基类,并重写 __init__ 初始化方法。__init__ 方法包含 name 参数。第一行代码使用 super().__init__(name, *args, **kwargs) 调用父类的构造函数,初始化动作。这里,使用 argskwargs 将其他参数传递给父类构造函数,例如 contextllm

    #!/usr/bin/env python3
    # _*_ coding: utf-8 _*_
    """
    @Time    : 2023/9/4 15:40:40
    @Author  : Stitch-z
    @File    : tutorial_assistant.py
    @Describe : Actions of the tutorial assistant, including writing directories and document content.
    """
    
    from typing import Dict
    
    from metagpt.actions import Action
    from metagpt.prompts.tutorial_assistant import DIRECTORY_PROMPT, CONTENT_PROMPT
    from metagpt.utils.common import OutputParser
    
    
    class WriteDirectory(Action):
        """写教程目录的动作类。
    
        Args:
            name: 动作名称。
            language: 输出语言,默认值为 "Chinese"。
        """
    
        def __init__(self, name: str = "", language: str = "Chinese", *args, **kwargs):
            super().__init__(name, *args, **kwargs)
            self.language = language

    重写 run 方法

    run 方法是动作执行的主要函数,使用 self._aask(prompt=prompt) 方法查询 LLM 模型。

    async def run(self, topic: str, *args, **kwargs) -> Dict:
        """执行动作,根据主题生成教程目录。
    
        Args:
            topic: 教程主题。
    
        Returns:
            教程目录信息,包括 {"title": "xxx", "directory": [{"dir 1": ["sub dir 1", "sub dir 2"]}]}。
        """
        prompt = DIRECTORY_PROMPT.format(topic=topic, language=self.language)
        resp = await self._aask(prompt=prompt)
        return OutputParser.extract_struct(resp, dict)

    其他动作的编写类似:

    class WriteContent(Action):
        """写教程内容的动作类。
    
        Args:
            name: 动作名称。
            directory: 要写入的内容。
            language: 输出语言,默认值为 "Chinese"。
        """
    
        def __init__(self, name: str = "", directory: str = "", language: str = "Chinese", *args, **kwargs):
            super().__init__(name, *args, **kwargs)
            self.language = language
            self.directory = directory
    
        async def run(self, topic: str, *args, **kwargs) -> str:
            """执行动作,根据目录和主题写入文档内容。
    
            Args:
                topic: 教程主题。
    
            Returns:
                写入的教程内容。
            """
            prompt = CONTENT_PROMPT.format(topic=topic, language=self.language, directory=self.directory)
            return await self._aask(prompt=prompt)

    角色执行结果

    输入示例

    • MySQL 教程
    • Redis 教程
    • Hive 教程

    执行命令示例

    提供相应的执行命令示例。

    执行结果

    生成的教程文档位于项目的 /data/tutorial_docx 目录中。

    注意:

    该角色目前不支持互联网搜索功能。内容生成依赖于 LLM 大模型训练的数据。

    总结

    MetaGPT 的教学助手角色可以帮助你快速生成技术教程文档,并支持自定义语言。它可以节省你大量时间和精力,让你专注于更重要的工作。

    更多学习资源

人生梦想 - 关注前沿的计算机技术 acejoy.com 🐾 步子哥の博客 🐾 背多分论坛 🐾 借一步网
Page Stats: PV: 2329 | UV: 1245
Last updated: 2025-06-25 21:33:48
沪ICP备2024052574号-1