更新:几位读者指出,“认知架构”一词在神经科学和计算认知科学领域有着丰富的历史。根据维基百科,“认知架构”既指关于人类大脑结构的理论,也指此类理论的计算实例”。该定义(以及与此主题相关的研究和文章)比我在这里尝试提供的任何定义都更全面,因此这篇博客应被视为我过去一年在构建和帮助构建基于 LLM 的应用程序的过程中,将我的经验映射到这一研究领域的尝试。
过去六个月里我经常使用的一个短语(而且以后可能会更多地使用)是“认知架构”。我第一次听到这个词是从Flo Crivello那里听到的——想到这个词的功劳归他所有,我认为这是一个非常棒的词。那么,我到底指的是什么呢?
我所说的认知架构是指你的系统如何思考——换句话说,就是将用户输入进行操作或生成响应的代码/提示/LLM 调用流程。
我喜欢“认知”这个词,因为自主系统依赖于使用 LLM 来推断该做什么。
我喜欢“架构”这个词,因为这些自主系统仍然涉及大量类似于传统系统架构的工程工作。
将自主性级别映射到认知架构
如果我们回到这张幻灯片(最初来自我的 TED 演讲),了解 LLM 应用程序中不同级别的自主性,我们可以看到不同认知架构的示例。
首先是代码——一切都硬编码。甚至算不上真正的认知架构。
接下来是单个 LLM 调用。之前和/或之后有一些数据预处理,但单个 LLM 调用构成了应用程序的大部分内容。简单的聊天机器人可能属于此类。
接下来是 LLM 调用的链。此序列可以是将问题分解成不同的步骤,或者仅仅服务于不同的目的。更复杂的 RAG 管道属于此类:使用第一个 LLM 调用生成搜索查询,然后使用第二个 LLM 调用生成答案。
之后,是路由器。在此之前,您提前知道应用程序将执行的所有步骤。现在,您不再知道。LLM 决定采取哪些操作。这增加了一点随机性和不可预测性。
下一级是我所说的状态机。这是将 LLM 执行一些路由与循环相结合。这更不可预测,因为通过将路由器与循环相结合,系统(理论上)可以调用无限数量的 LLM 调用。
自主性的最终级别是我所说的代理,或者更确切地说是“自主代理”。对于状态机,仍然限制了可以采取哪些操作以及在采取该操作后执行哪些流程。对于自主代理,这些限制被取消了。系统本身开始决定可以采取哪些步骤以及指令是什么:这可以通过更新用于为系统提供支持的提示、工具或代码来实现。
选择认知架构
当我谈论“选择认知架构”时,我指的是选择要采用的这些架构中的哪一个。这些架构中没有哪一个是严格意义上的“更好”——它们都针对不同的任务具有自己的用途。
在构建 LLM 应用程序时,您可能希望像尝试提示一样频繁地尝试不同的认知架构。我们正在构建LangChain和LangGraph来实现这一点。我们过去一年的大部分开发工作都投入到构建低级别、高度可控的编排框架(LCEL 和 LangGraph)中。
这与早期的 LangChain 有所不同,早期的 LangChain 侧重于易于使用的现成链。这些对于入门非常棒,但难以自定义和试验。这在早期是可以的,因为每个人都只是想入门,但随着领域的成熟,这种设计很快达到了其极限。
我非常自豪我们在过去一年中所做的更改,使 LangChain 和 LangGraph 变得更加灵活和可自定义。如果您只通过高级包装器使用过 LangChain,请查看低级部分。它们更具可自定义性,并且可以让您真正控制应用程序的认知架构。
如果您正在构建简单的链和检索流程,请查看 LangChain 的Python和JavaScript版本。对于更复杂的自主工作流,请尝试使用 LangGraph 的Python和JavaScript版本。