这篇文章是 Aurabase 的 原生 AI 全景的一部分。这两个框架都没有提供与数据库的专有连接器:在这两种情况下,与 Postgres 的连接都是通过通用 SQL 驱动程序(Python 端的 SQLAlchemy)和标准连接字符串进行的。对于 Aurabase 和任何托管 Postgres 都是如此。
- LangChain:通用LLM编排框架(链、工具、内存)。如今,代理是通过
LangGraph构建的,SQL 被视为其中之一的工具包。 - LlamaIndex:为 RAG 和查询结构化源而生的数据框架。本机 SQL 引擎 (
NLSQLTableQueryEngine),通过其Workflows引擎进行代理。 - CrewAI 和 AutoGen 不是 LangChain/LlamaIndex 的替代品:它们是多代理编排层,放置在两者之一(或内部 Python 函数)之上。
- LangChain 和 LlamaIndex 都不提供专有的 Postgres 连接器:两者都使用 SQLAlchemy,与任何托管 Postgres(包括 Aurabase)兼容。
- 迄今为止,这些框架还没有 Aurabase 打包集成。连接是通过每个项目公开的标准 Postgres 连接字符串进行的。
为不同需求而生的两个框架
LangChain和LlamaIndex是在2022年底ChatGPT发布后同一时期出现的,两者的出发点明显不同。 LangChain 将 LLM 应用程序建模为一系列可组合步骤:提示、模型调用、工具、内存,所有这些都通过 LCEL 或 LangGraph图组装。
LlamaIndex 首先对数据进行建模:文档、节点、索引、查询引擎。 VectorStoreIndex 或 SQLDatabase 是一等公民,而不是添加到通用代理的工具。两者都是开源的(MIT 许可证),可在 Python 和 TypeScript 中使用,并且目前涵盖了大部分重叠的范围:代理、RAG、工具调用、SQL 连接。
这种融合使得架构上的比较比功能列表上的比较更有用:两者几乎可以做同样的事情。改变的是如何改变。
每个人如何在没有打包集成的情况下插入 Postgres
在LangChain端,langchain_community.utilities.SQLDatabase模块封装了一个SQLAlchemy引擎。然后 create_sql_agent 代理将其公开为一组工具:列出表、描述模式、执行查询、在执行前检查查询。
在 LlamaIndex 方面,等效的抽象是 llama_index.core.SQLDatabase,也是基于 SQLAlchemy 引擎构建的。 NLSQLTableQueryEngine 查询引擎将自然语言问题转换为 SQL 查询,执行它,然后将结果重新表述为响应。
两种提取物都依赖于 Aurabase。 SQLAlchemy 驱动程序和标准 Postgres 连接字符串就足够了,就像 Supabase、RDS 或自托管实例一样。
LangGraph 与工作流:编排代理的两种方法
LangChain首先提出了经典的代理循环(AgentExecutor,ReAct模式)。此后,该项目将其代理集中到 LangGraph:代理被表示为节点和边的显式图,在两个阶段之间设有检查点和可能的人工干预。
LlamaIndex 以其 Workflows进行响应:一个事件驱动的编排,其中每个步骤都会发出并消耗类型化事件。 SQL 或向量查询引擎作为一个步骤直接插入,无需额外的适配层,因为这些引擎已经是框架的本机基元。
对于查询 Postgres 的代理来说,实际的区别是:LangGraph 提供对 SQL 调用的分支和重试的细粒度控制。当问题首先涉及框架已索引的数据时,LlamaIndex 需要较少的链接代码。
LlamaIndex 向前迈出了历史性的一步
LlamaIndex 从一开始就被设计为将法学硕士连接到数据源,并根据内容类型提供连接器目录 (LlamaHub) 和专门索引。 RAG 仍然是该框架最直接的用例,而不是事后添加的功能。
LangChain 通过其 retrievers 和 fetch 链满足了相同的需求,并同样成熟地集成到 LangGraph 生态系统中。区别不在于容量,而在于业务逻辑所在:在 LlamaIndex 端集成到索引中,在 LangChain 端显式组装在链中。
两者都知道如何使用 pgvector 作为向量基:LlamaIndex 端的 llama-index-vector-stores-postgres,LangChain 端的 langchain-postgres 包的 PGVector 类。在 Aurabase 项目中,pgvector 0.8.6 已存在于 Postgres 租户映像中:两个包都使用相同的连接字符串连接到它,无需单独的激活步骤。
CrewAI 和 AutoGen:当单个代理不再足够时
CrewAI 为每个角色协调多个代理:每个代理接收一个目标、上下文 (backstory) 和工具,并分组到 Crew 中,并按顺序或根据层次结构执行 Task 。它是一个成熟的编排框架,而不是LangChain的扩展。
AutoGen 是 Microsoft 研究项目,采用了不同的方法:代理相互通信(AssistantAgent、 UserProxyAgent、 GroupChat),并且能够在隔离环境中执行代码。协调看起来像一个对话,而不是像 LangGraph 这样的显式状态图。
两者都不会取代数据连接层。需要读取 Postgres 的 CrewAI 或 AutoGen 代理实际上会调用使用 LangChain 或 LlamaIndex 构建的 SQL 工具,或者围绕 psycopg2的简单 Python 函数。 CrewAI 和 AutoGen 回答“谁做什么、按什么顺序”,而不是“如何读取数据库”。
Postgres 数据库本身不具备什么功能
create_sql_agent 和 NLSQLTableQueryEngine 针对提供的连接执行模型生成的查询。既不限制默认返回的行数,也不阻止写入请求:实际的防护是连接字符串中使用的 Postgres 角色,而不是框架选项。
这是与 Aurabase 原生 NL2SQL 的结构差异,后者在服务器端将问题转换为 SQL,验证生成的查询(SQL 解析,拒绝欺骗服务器字段)并在执行前限制 LIMIT。这不是同一块砖:NL2SQL 端点在一轮中响应,平台安装了护栏; LangChain 或 LlamaIndex 代理分几个阶段进行推理,并提供自行组装的保障措施。
在实践中,这两种方法相互补充而不是相互排斥:用于向最终用户公开的简单问题的有界 NL2SQL 端点,以及结合了 SQL 之外的多种工具的多步骤推理代理。
LangChain、LlamaIndex、CrewAI、AutoGen 尽在一张表中
| 主要目标 | 多面手LLM编排 | 数据框架/RAG | 按角色进行多代理编排 | 对话式多代理编排 |
|---|---|---|---|---|
| 原始代理 | LangGraph(状态图) | 工作流程(事件步骤) | 人员/任务/流程 | 助理座席/群聊 |
| 本机 SQL 连接 | SQL数据库 + create_sql_agent | SQL数据库 + NLSQLTableQueryEngine | 无(外部工具) | 无(外部工具) |
| pg向量支持 | langchain-postgres (PGVector) | 骆驼索引矢量存储 postgres | 没有本地人 | 没有本地人 |
| 原生多代理 | 否(多节点 LangGraph) | 否(单代理流程) | 是的 | 是的 |
| 许可证 | 麻省理工学院 | 麻省理工学院 | 麻省理工学院 | 麻省理工学院(微软研究项目) |
| 浪链 | 拉曼指数 | 克鲁瓦伊 | 奥托金 |
将 LangChain 或 LlamaIndex 插入标准 Postgres 后端
无论选择什么框架,三个步骤就足够了,并且它们不依赖于任何特定于平台的连接器。
第三步比框架的选择更重要。仅限于真正必要的权限的 Postgres 角色仍然是针对生成的超出其范围的请求的唯一可靠的保护措施,无论代理执行该请求如何。请参阅 AI 文档,了解可在代理端使用的 Aurabase 原生 LLM 提供程序(OpenAI、Anthropic、Gemini)的配置。
根据您的项目选择哪一种
对于连接到 Postgres 的代理来说,这两个框架都不是绝对优越的。项目的起始背景比功能列表更具决定性。
- LangChain:如果代理必须结合多个异构工具(SQL、外部 API、网络搜索)并通过 LangGraph 对流程进行精细控制,并且团队是否重视市场上最广泛的集成生态系统。
- LlamaIndex:如果项目的核心是 RAG 或已索引数据的查询,强烈需要源连接器和直接适合用例的索引/查询模型。
- CrewAI 或 AutoGen 另外:一旦单个代理不再足够,工作必须在两个数据框架中的一个或另一个之上的几个专门角色之间分配。
两者也可以在同一个项目中共存:LlamaIndex 查询引擎作为 LangGraph 代理中的工具公开是一种常见模式。维护两个框架确实会带来复杂性成本,需要在默认采用之前权衡其收益。