# 系统工程:构建有效的智能体软件
**作者**: Ashpreet Bedi
**日期**: 2026-04-07T17:28:55.000Z
**来源**: [https://x.com/ashpreetbedi/status/2041568919085854847](https://x.com/ashpreetbedi/status/2041568919085854847)
---

20世纪40年代初,贝尔实验室正在建设国家电话网络,这是当时世界上最复杂的技术系统。数百万个交换机、电缆、继电器和接线员必须协同工作。工程师们发现了一个在80年后仍然适用的教训:你无法通过优化单个组件来优化整个系统。整体的性能(呼叫路由、可靠性、容量、成本)取决于各个部分之间的交互方式。他们需要一种专注于组件间交互的学科。
他们称之为系统工程。
智能体软件生态系统正在重蹈覆辙,犯下催生这门学科的同样错误。当前这股“工具工程”浪潮会要求你使用文件系统进行存储和内存管理,然后试图通过在数据库之上构建虚拟化文件系统来规避其局限性。它会要求你使用 bash 作为通用工具,然后又强迫你使用基于请求的沙箱来处理安全问题。这些都是只优化系统局部而忽略整体性的典型表现。而我们却连思考片刻都不花就接受了这种做法,甚至没有花一分钟时间去确认它是否是正确的方法。
软件工程就是系统工程
编码代理降低了编写代码的门槛,但并未降低生产软件的要求。软件工程本质上是系统工程,如果你正在构建代理软件,你的系统需要连接以下五个层面:
1. 代理工程 :您的代理或多代理逻辑和执行流程。
模型、系统指令、工具配置、交接、上下文管理、可观测性。在这里,您可以定义智能体执行的操作、运行方式和响应方式。智能体的行为应尽可能确定,在无法确定时则应可观测。
2. 数据工程 :你的代理的性能取决于它所能访问的上下文,而上下文本质上就是底层的数据。内存、存储、知识:所有这些都应该遵循数据工程原则进行管理。这意味着要设计良好的模式、使用结构化查询、采用快速读写的数据库、使用对象存储进行长期存储,以及建立管道来保持知识和内存的更新。这些模式已经沿用了几十年,请继续使用它们。
3. 安全工程 :身份验证、基于角色的访问控制、治理、数据隔离、审计跟踪。
代理的功能由其工具定义,而这些工具的权限范围应通过 JWT 支持的权限进行限定。只读访问权限并非提示指令,而是工具配置。操作应采用层级审批:读取操作可自由执行,写入操作需要用户批准,敏感操作需要管理员签字。大多数操作都应被记录,并在产品生命周期内可查询。
请务必隔离请求。一个用户的上下文信息泄露到另一个用户的上下文信息中,这属于数据泄露,而非程序错误。这会造成严重后果,而且有法律保护用户数据。因此,在共享沙箱中使用文件系统支持的内存可能并非明智之举。
4. 接口工程 :用户和其他代理如何联系您的代理。
REST API、Slack、MCP 服务器、终端。过去,你只有一个 API 和一个客户端。现在,你有多个接口,每个接口都有自己的身份系统。Slack 用户 ID 不是你产品的用户 ID。MCP 客户端以其他代理的身份进行身份验证,但这并非真正的人类用户。接口工程旨在确保你的身份验证、策略和访问控制在代理可访问的每个接口上保持一致。
5. 基础设施工程 :如何运行和扩展软件。容器、云部署、横向扩展。通常称为 DevOps。
好消息是:其中 95% 的内容与运行其他服务相同。重复利用现有模式,它们会很有帮助。剩下的 5% 不同之处在于:代理请求耗时更长(增加负载均衡器的超时时间),响应流式传输(规划使用 SSE 或 WebSocket),以及最佳代理应具备主动性(计划任务、后台执行)。这些都不是什么新鲜事。
人工智能工程师的关键在于认识到,智能体软件只是普通的软件,只是业务逻辑被智能体取代,接口从请求/响应变为跨多个界面的流式传输。
系统工程是一门让这些部分协同工作的学科,也是构建有效智能软件的关键。
从系统角度审视软件,正确的决策就显而易见了,你也不再需要纠结于 MCP 和 CLI 哪个更好。你应该给代理提供功能明确的工具,而不是无限制的 bash 访问权限。你应该将会话、内存和知识存储在数据库中,而不是文件中。
如果孤立地设计某一层,就会引入一些限制,这些限制会波及系统的其他部分,导致浪费时间和资源来弥补这些限制。而从系统角度进行设计,则每一层都能强化其他层。
系统工程实践
我不能做出这么大的承诺却不给你提供可运行的代码。
Dash 是一个开源的、自学习的数据代理。 你用简单的英语向它提问,它会编写 SQL 语句,运行它,然后告诉你这些数字的含义。简单易用,便于克隆和修改。足够真实,可以演示所有五个层次。
以下是 Dash 中每一层的工作原理:
## 代理工程
Dash 是一个代理团队。领导者将请求路由给两位专家:一位分析师负责查询数据(只读),另一位工程师负责构建计算资产,例如视图和汇总表。每位专家都拥有相同的工具类型,但功能各不相同。分析师的 SQL 工具连接到只读数据库引擎。工程师的 SQL 工具连接到可写引擎,该引擎的作用域限定于单个模式。界面相同,但权限不同,权限由配置决定,而非通过提示。指令在运行时根据表元数据和业务规则生成。
## 数据工程
六个层面的背景信息和学习工具。
未经任何培训的 LLM 程序员直接编写 SQL 很快就会遇到瓶颈:模式缺乏意义,类型容易误导,缺乏经验知识,也无法从错误中学习。Dash 通过六层基于上下文的机制解决了这个问题:
- 表元数据(模式、列、关系)
- 人工标注(指标、定义、业务规则)
- 查询模式(已知有效的 SQL)
- 机构知识(文档、维基)
- 经验教训(错误模式和已发现的解决方法)
- 运行时上下文(实时模式检查)。
这些层为两个系统提供信息:
- 第一部分是经过整理的知识:表结构、经过验证的查询和业务规则已加载到 PostgreSQL 中。
- 第二点是发现的学习:代理在遇到问题时保存的错误模式和修复方法,并在未来的查询中调用。
学习循环很简单:代理运行查询,遇到类型错误,诊断错误并保存修复方案。下次遇到类似列时,就能一次性正确处理。工程师创建新视图时,会将架构和示例查询记录到知识库中。分析师在下次搜索时即可发现并开始使用。查询 100 比查询 1 更好,并非因为模型改进了,而是因为数据层得到了优化。
## 安全工程
由系统强制执行,而非提示。
生产环境中的 Dash 使用基于角色的访问控制 (RBAC) 和 JWT 验证。所有查询都限定在 `user_id` 范围内。评估套件会直接测试这些边界:它会提示代理泄露凭据、执行破坏性 SQL 以及跨越模式边界,然后验证它们是否能够做到。
安全性是一项系统属性,需要经过多层测试。分析师的只读访问权限是 PostgreSQL 连接参数的一部分。数据库本身会拒绝任何写入操作,无论模型生成什么。工程师可以写入,但只能写入单个模式:查询级别的保护机制会阻止任何针对源数据的操作。
## 接口工程
Dash 提供 REST API、Slack 机器人、Web 用户界面和命令行界面 (CLI) 四种服务。每种服务处理身份验证的方式不同:Slack 将线程时间戳映射到会话,而 API 在生产环境中使用 JWT 令牌。但所有这四种服务都使用相同的代理、相同的工具和相同的知识库。
您的身份验证和访问控制需要在每个接口上都有效,因为代理不知道它是从哪个接口被调用的。
## 基础设施工程
极简 Python 容器。使用 Docker Compose 进行本地开发。可部署到您选择的云平台。通过标准 ASGI 服务器使用 SSE 进行流式传输。95% 的功能与其他服务相同。5% 的不同之处(更长的超时时间、流式传输、计划任务)使用标准工具处理。
您可以克隆它,运行 `docker compose up`,即可拥有整个系统。
一条指令,五层架构,通过系统工程打造出一个可用的产品。
以下是参考链接:https://github.com/agno-agi/dash
## 相关链接
- [Ashpreet Bedi](https://x.com/ashpreetbedi)
- [@ashpreetbedi](https://x.com/ashpreetbedi)
- [29K](https://x.com/ashpreetbedi/status/2041568919085854847/analytics)
- [Dash 是一个开源的、自学习的数据代理。](https://github.com/agno-agi/dash)
- [https://github.com/agno-agi/dash](https://github.com/agno-agi/dash)
- [升级至高级版](https://x.com/i/premium_sign_up)
- [1:28 AM · Apr 8, 2026](https://x.com/ashpreetbedi/status/2041568919085854847)
- [29.1K Views](https://x.com/ashpreetbedi/status/2041568919085854847/analytics)
- [View quotes](https://x.com/ashpreetbedi/status/2041568919085854847/quotes)
---
*导出时间: 2026/4/8 16:40:57*