如何在 VPS 上从零构建 AI Agent
了解 AI agent 的核心循环:模型决定操作,代码执行工具并返回结果。本文介绍在 VPS 上实现工具调用、MCP、记忆与安全机制。
AI agent 的实际含义
AI agent 是围绕语言模型运行的循环。模型读取当前情况,决定执行一个操作;您的代码执行该操作;结果返回给模型;循环继续运行,直到任务完成。这就是全部原理。普通聊天机器人只回答一次,然后停止。agent 会在每次自身运行之间执行实际操作,并持续运行,直到达到您指定的目标。这个循环很小,您一个下午就能自行编写。因此,从零开始分阶段学习 agent会先从这里开始,再逐步加入工具、记忆和安全机制。
操作是关键。语言模型本身只能生成文本。它无法读取文件、调用 API 或运行命令。agent 为模型提供一组允许使用的工具,以及请求使用这些工具的方式。当模型需要搜索 Web 或写入文件时,它不会自行完成这些工作。它会生成结构化请求,您的代码运行相应工具,工具返回的结果会作为模型下一次读取的内容。模型负责判断,您的服务器负责执行。
并非所有任务都需要 agent,默认优先使用 agent 是常见错误。如果步骤已预先确定,普通脚本更简单、更快,也更可靠。“每小时获取此页面并通过电子邮件将价格发给我”属于计划任务,不是 agent。只有在执行路径无法预先固定、模型必须查看结果并决定下一步操作时,才应构建 agent。agent 的代价是不可预测性,因此只有在灵活性确实有价值时才承担这一代价。
工具:智能体如何执行操作
工具是你提供给模型的任何能力,并且描述得足够清楚,让模型知道何时使用它。读取文件、运行 shell 命令、查询数据库、发送消息,都可以作为工具。每个工具都有名称、简短描述和输入列表。工具由你定义,模型决定何时调用。网页搜索通常是最值得添加的第一个工具。如果你已经运行自己的 SearXNG 实例,也可以将其用作智能体的搜索后端,无需为商业搜索 API 付费。
无论使用哪种模型,机制都相同。模型返回一个结构化请求,其中指定工具名称并填写输入参数。你的代码读取该请求,运行匹配的函数,然后在下一轮将结果发送回模型。模型读取结果后,会继续调用其他工具,或编写最终答案。函数调用是所有智能体的底层连接机制,而驱动这一过程的循环只需几行普通代码。
控制权也在这里。模型可以请求运行命令,但在你的代码决定执行之前,任何命令都不会运行。你可以在这一环节加入危险操作的审批提示、限制工具可访问的范围,以及记录智能体所有操作的日志。智能体的安全性取决于你提供的工具,以及你在工具前设置的检查机制。
MCP:连接工具的标准方式
手动为每项服务编写新的集成,很快就会变得繁琐。Model Context Protocol(MCP)是一种开放标准,可以解决这个问题。您无需分别为文件、数据库和问题跟踪器编写新工具,只需让代理连接到一个已经将这些系统作为工具提供的 MCP 服务器。代理只需使用一种协议,服务器负责与实际系统通信。
这样做的优势是可以复用。其他人为您使用的服务编写的 MCP 服务器,无需新的集成代码即可供代理使用;您编写的服务器也可供所有支持该协议的代理使用。一些自托管应用现在也提供自己的 MCP 服务器:openGym,一款训练记录器提供只读 MCP 服务器,因此代理可以回答有关您训练历史的问题,但无法修改任何记录。在 VPS 上,这一点很重要,因为您可以将 MCP 服务器作为独立的小型服务运行在代理旁边,并且只授予每个服务器所需的访问权限。如果这些服务器后面的系统位于 VPS 无法直接访问的网络中,例如家中或办公室的数据库,则可以通过使用子网路由器将该网络发布到您的 tailnet,让代理通过私有地址访问这些系统,而无需将任何内容暴露到公网。我在在 VPS 上运行 MCP 服务器中介绍具体配置。
记忆与检索
语言模型在不同调用之间没有自身的记忆。每一轮都必须向它提供当前任务所需的全部信息。对于短任务,这没有问题,因为整个对话都能放入一次请求中。具体能放入多少内容取决于上下文窗口。通过 Ollama 提供服务的自托管模型通常使用较小的默认上下文窗口,并会静默丢弃最早的对话轮次。因此,在指责代理遗忘之前,最好先将 num_ctx 设置为匹配循环生成的流量。对于更长的任务,您必须自行管理记忆。有两种模式值得了解。
第一种是暂存文件。为代理提供一个可读写的文件,并要求它在工作过程中记录所学内容。在下一轮或下一次会话中,代理重新读取该文件,然后从上次中断处继续。这种记忆以普通文档的形式存在。它之所以有效,是因为代理会将文件视为另一个工具。
第二种是检索。当代理需要从大量文档中获取知识,而这些文档不可能全部放入一次请求时,您可以将文档存储为可搜索的形式,并在需要时仅将相关内容提取到模型的上下文中。这种模式称为检索增强生成,即 RAG。代理提出问题,您的代码查找少量匹配的段落,然后只将这些段落发送给模型。存储区位于您的服务器上,因此私有文档不会离开服务器。
多个代理,一个协调器
一个代理配合多个工具可以完成大多数任务。当任务规模较大,或本身可以自然拆分为多个部分时,采用另一种结构会更合适:由协调器代理委派工作给专用子代理。协调器将目标拆分为多个部分,把每一部分交给针对相应工作类型构建的子代理,再汇总结果。委派需要在各部分之间建立通信渠道,而最简单的方式已经存在于您的服务器上:同一台 VPS 上的两个 Claude Code 会话可以相互发送消息。在自行构建协调机制前,这是一种低成本的方式,可用于了解任务交接的实际效果。
这样做的优势是专注。职责范围较窄、工具集较小的子代理,比同时处理所有事项的通用代理更容易做出正确决策;相互独立的部分还可以并行运行。代价是需要进行协调,而且这种代价确实存在,因此在任务明确需要更多代理前,应保持使用单个代理。先从简单方案开始,只有当单个代理明显难以应对时,才增加代理。
自托管还是托管:由哪种模式运行您的代理
模型是代理中唯一不必由您自行运行的部分,而选择模型的运行位置是您需要做出的最大决定。通过 API 访问的托管模型无需您维护任何组件,却能提供最强的推理能力:您发送文本,它返回文本。自托管模型运行在您自己的服务器上,可以确保每个请求保持私密,按固定成本运行而不是按 token 付费,也不依赖其他服务持续在线。代价在于能力和维护工作量。最强的托管模型领先于您自行运行的模型,而自行运行模型则需要提供足够的内存来容纳它。
最后一点是实际限制。模型必须装入服务器的内存;如果使用 GPU,还必须装入其显存。硬件无法容纳的模型将无法加载。在规划自托管代理之前,请确认目标模型是否适合现有机器:
如果这些数值不匹配,您有三种选择:选择更小的模型,使用更激进的量化来缩小模型,或者使用托管 API 执行推理,仅将工具和数据保留在服务器上。许多自托管代理会先通过 VPS 上的 Ollama 使用本地模型,并在最复杂的步骤中回退到托管 API。
服务器才是危险所在
能够执行 shell 命令和写入文件的代理功能强大,也正因如此,它很危险。模型的判断力不错,但并不完美;错误的指令、软件缺陷或恶意输入,都可能让原本有帮助的代理删除错误内容或泄露机密。安全工作不是可选项,在服务器上更是最重要的部分。
少数几个习惯可以解决大部分问题。让代理以专用的非特权用户运行,绝不要使用 root,这样即使出错,影响范围也有上限;相关理由也见让服务以非特权用户运行。将 API 密钥等机密信息保存在代码之外,并且只允许该用户读取。还要隔离会访问系统的工具,使代理只能访问实际需要的内容。如果您不想手动编写所有检查,值得安装的 DeepSeek Harness 插件提供了可直接使用的组件,涵盖相同的安全范围:工具权限规则、提示词注入扫描,以及代理停止前可消耗资源的上限。有关加固真实自托管代理的完整示例,请参阅在 VPS 上安全运行 OpenClaw。如果您更愿意使用托管模型提供智能能力,配套指南在 VPS 上使用 Claude 构建代理采用相同思路,并将其应用于指定模型。
完整示例见构建类似 OpenClaw 的个人代理,其中应用了这些组件。如果您更愿意直接运行已经完成的代理,可以先阅读在 VPS 上自托管 Hermes Agent或在自己的服务器上运行 Agent Zero;2026 年最佳自托管 AI 代理则会并列比较本文介绍的所有现成选项。
FAQ
AI agent 与 chatbot 有什么区别?
chatbot 回答一条消息后就停止。agent 会运行一个循环:模型决定执行的操作,您的代码执行该操作,结果返回给模型,然后重复这一过程,直到任务完成。区别在于,agent 会在每次交互之间执行实际操作,通过调用工具读取文件、运行命令或查询服务,而不只是生成文本。
在 VPS 上运行 AI agent 需要 GPU 吗?
只有在您自行托管模型时才需要。agent 循环、工具和记忆都是普通代码,在没有 GPU 的常规 VPS 上也能正常运行。只有当您要在自己的硬件上运行语言模型时,GPU 才会发挥作用,因为模型必须装入内存。如果您通过 API 使用托管模型,计算负载会在其他位置完成,配置一般的 VPS 就足够了。
什么是 MCP?构建 agent 时必须使用它吗?
MCP(Model Context Protocol)是一项用于将 agent 连接到工具和数据源的开放标准。严格来说,您不需要它,因为可以手动编写每个工具。MCP 通过让您复用适用于常见服务的现有服务器,并让您只需为自己的系统提供一次接口,即可供任意 agent 使用,从而减少这部分工作。随着集成数量增加,MCP 作为便利工具会越来越有价值。
允许 AI agent 访问我的服务器安全吗?
如果做好隔离,可以安全使用。能够运行命令的 agent 是否安全,取决于它运行所使用的账户以及您允许它使用的工具。应使用非特权用户运行 agent,避免其接触密钥,对访问文件系统的工具进行沙箱隔离,并要求对难以撤销的操作进行审批。应将 agent 视为不受信任但具有较强能力的代码,只授予它完成任务所需的权限。