17611538698
info@21cto.com

Python靠边儿,PHP才是AI代理领域的沉睡巨人

编程语言 0 12 1小时前
图片

我使用 PHP 编程已经超过 20 年了。我亲眼目睹它至少被宣布消亡十几次。但是每一次,它都继续在互联网上发挥着越来越重要的作用。

所以当人工智能开始进入项目需求时,我并没有选择Python。我也没有购买任何工作流构建设备或参加任何课程。我只是打开了我现有的代码库,编写了一个服务,然后调用了API。

就是这样。这就是全部的解锁方法——你不需要花哨的图形用户界面或复杂的系统。 

无人质疑的假设


Python 在人工智能领域独占鳌头,这是众所周知的事实。无论你是训练模型、构建研究流程,还是从事任何数据科学相关的工作,Python 都是最佳选择。这一点绝对毋庸置疑。

但大多数团队没有问的问题是:你们是在训练模型吗?还是只是在调用 API?

因为这是截然不同的问题。如今大多数构建“AI功能”的企业都在处理后者。他们向Claude、GPT或Gemini发送提示,然后利用响应进行一些有用的操作。这就是REST调用。

REST 调用与编程语言无关。

而且,早在大多数人工智能初创公司成立很久之前,PHP 就已经开始进行 REST 调用了。

通常来说,最适合这项工作的工具就是已经在生产环境中运行的工具。


您所拥有的技术堆栈


根据W3Techs 的数据,在所有已知服务器端编程语言的网站中,超过 71% 的网站都使用 PHP 构建。仅 WordPress 就占了整个网站的 42%。再加上 Laravel、Symfony、Magento、Craft CMS 以及数千个自定义代码库,你就能大致了解生产环境中的网络软件究竟运行在哪里了。顺便一提,我还记得 PHP 诞生的那一刻,当时我正沉迷于 Perl,但从那以后我就一直坚持使用 PHP! 


对于内容管理系统网站,我几年前就开始使用 WordPress,但后来转向了其他平台。不过,像AI Engine(拥有超过 8 万个活跃安装量,完全支持 MCP 服务器,并内置了 Claude 和 GPT 集成)以及 Automattic 的 AI Building Blocks 项目推出的官方WordPress MCP Adapter这样的插件,正在将 WordPress 打造成一个名副其实的智能体平台。这不容忽视。

而生产环境的Web软件正是人工智能代理需要运行的地方。

人工智能行业不会告诉你的是:大多数“智能体”其实就是传统的服务。真的。抛开营销噱头,典型的AI智能体就是一个类,它接收输入、调用外部API、应用一些逻辑,然后返回输出。我们从2000年初就开始编写这类服务了。 

代理封装层在此基础上增加了规划、内存管理和工具调用功能。这确实存在,而且至关重要。但其底层模式对于任何使用过 MVC 框架的人来说都不陌生。

想想代理在应用层实际执行的操作。它会从数据库读取数据,调用外部 API,处理表单提交,触发 Webhook,将任务加入队列,写回存储并返回响应。

PHP 已经完成了所有这些工作 30 年。你的身份验证系统已经存在。你的数据库连接已经存在。你的业务逻辑已经存在。

那么,为什么要启动一个 Python 微服务来与你的 PHP 应用程序并排运行,跨进程边界复制你的数据上下文,并引入一个全新的运行时来维护,仅仅为了向 LLM 发出一个 HTTP 请求呢?

其实,算了。我知道为什么了。因为所有的教程都用的是 Python。因为 LangChain 就是 Python。因为人工智能领域的讨论主要集中在那些机器学习工程师主导的平台上,而他们很少接触日常的内容管理系统。

过度杀伤问题


我见过一些团队为了汇总支持工单而使用 AWS Bedrock。我也见过一些团队为了完成一个实际上只需要调用一次 API 并添加一些条件逻辑的功能,而搭建了 14 个节点的 n8n 工作流。Make.com 是一个无需编写代码即可连接 SaaS 应用的出色工具,但它并非将 AI 功能嵌入到您已掌控的生产环境 PHP 应用中的最佳方案。

这些平台的存在自有其道理,但它们解决的是另一个问题。当你需要整合第三方服务而没有后端团队时,或者当你使用 Node/React 技术栈且 JS 是你的主要语言时(虽然这并非我的专长,但在那里确实可行),它们就很有意义。

但如果你是一名 PHP 开发者,能够编写出这样的代码,那么它们就毫无意义了:

$client new \GuzzleHttp\Client();$response $client->post('https://api.anthropic.com/v1/messages', [                  'headers' => ['x-api-key'=> $_ENV['ANTHROPIC_API_KEY'],                  'anthropic-version' => '2023-06-01',  // required header -- tells the API which response schema                  // to use                  'content-type' => 'application/json',            ],            'json'=> ['model'=> 'claude-haiku-4-5-20251001',            'max_tokens' => 1024,            'messages' => [                  ['role' => 'user''content' => 'Your prompt here!']            ],      ],]);$data json_decode($response->getBody(), true);$reply $data['content'][0]['text'];

当然,这是 API 调用,不是人工智能代理。但它是一个可用的 Claude 集成。无需平台,无需月租,无需新的基础设施。只需 Composer、Guzzle 和一个 API 密钥,即可完全上线。

生产环境需要在此基础上添加错误处理、速率限制感知和重试逻辑,但这在任何语言中都是如此,而且都不需要新的堆栈。

复杂性应该由实际应用场景来决定。大多数基于 Web 的代理用例都无法证明这一点。

那么,这和真正的智能体有什么区别呢?API 调用会等待响应并返回结果。而智能体则会决定下一步该做什么,调用工具,检查自身的输出,并循环执行直到任务完成。上面 Guzzle 的代码片段就是一个坚实的基础。 

究竟发生了哪些变化?


关键之处在于:PHP 对此的准备不仅仅体现在 REST 调用上。这门语言本身也已经发生了显著的变化。

PHP 8.x 引入了纤程(Fiber)、类型化属性、命名参数、匹配表达式和枚举。纤程支持在单个进程内进行协作调度,这虽然有用,但并不能替代真正的并发。对于并行代理任务,使用 Supervisor 或基于 Redis 的库对工作进程进行排队才是更实际的解决方案,这种模式在 PHP 中早已经成熟。

最重要的是,这一切都不需要更改你的技术栈。标准的 LEMP 架构可以轻松处理 LLM API 调用、排队的代理任务和 Webhook 驱动的工作流。目前大多数生产环境的 PHP Web 应用都使用相同的技术栈,对于大多数代理应用场景来说绰绰有余。

如果还想更进一步,FrankenPHP和 RoadRunner 都提供了长生命周期工作模式,可以消除每次请求的启动开销,这对于持久代理循环至关重要。但这只是一种优化,并非必要条件。先构建代理。如果工作负载需要(这种情况很少见),再优化运行时。 

此外还有 MCP。Anthropic 的模型上下文协议 (MCP) 现已捐赠给 Linux 基金会,并由 Agentic AI 基金会管理。MCP 拥有由 PHP 基金会维护的官方 PHP SDK。它支持 SSE 或 HTTP 协议,可以将 PHP 应用程序的工具暴露给任何支持 MCP 的 AI 客户端。这意味着 PHP 应用程序可以直接将工具暴露给 AI 系统,而无需通过 Python 封装或中间件层。

PHP代理生态系统


那么,目前 PHP AI 工具的实际发展状况如何呢?

Neuron AI是 PHP 领域最成熟的专用代理框架。它由 Inspector.dev 的原班人马打造,提供代理基类、工具调用、红黄绿 (RAG) 支持、多代理编排和内置监控功能。它可与 Laravel、Symfony、WordPress 和精简的 PHP 框架兼容,且不会造成框架锁定。

模式如下:一个代理类,附带一个工具。这个工具使其区别于普通的 API 调用:代理决定何时调用它,而不是你的代码:

namespace App Neuron;use NeuronAI Agent Agent;use NeuronAI Agent SystemPrompt;use NeuronAI Chat Messages UserMessage;use NeuronAI Providers AIProviderInterface;use NeuronAI Providers Anthropic Anthropic;use NeuronAI Tools PropertyType;use NeuronAI Tools Tool;use NeuronAI Tools ToolProperty;class FitnessAgent extends Agent{  protected function provider ():AIProviderInterface    {        return new Anthropic (            key :  $_ENV['ANTHROPIC_API_KEY'],            model'claude-haiku-4-5-20251001',        );    }  protected function instructions (): string    {        return (stringnew SystemPrompt (            background : ['You are a knowledgeable fitness assistant.'],steps:['Use available tools to look up workout plans before answering questions about them.'],            output:  ['Give clear, practical guidance based on the workout data returned.']        );    }  protected function tools () : array    {        return [            Tool ::make (                'get_workout''Look up a workout plan by name or muscle group.')                ->addProperty (                    new ToolProperty (                        name:'workout_name',                        type:     PropertyType ::STRING,                        description'The name or muscle group of the workout to retrieve.',                        required:   true          )        )        ->setCallable (function (string $workout_name) {                    // Your existing workout DB or API call here                    $pdo new PDO ($_ENV['DB_DSN'], $_ENV['DB_USER'], $_ENV['DB_PASS']);                    $stmt $pdo->prepare ("SELECT exercises, sets, reps FROM workouts WHERE name = "                    "?");                    $stmt->execute ([$workout_name]);                    $row $stmt->fetch (\PDO::FETCH_ASSOC);                    return $row json_encode ($row) : 'Workout not found.';                }),    ];    }}$reply= FitnessAgent ::make ()  ->chat (new UserMessage (    'How many sets should I do for a beginner chest workout?'))       ->getMessage ()  ->getContent ();echo $reply;

代理接收到问题后,判断需要使用get_workout工具,调用工具并传入提取出的肌肉群或训练计划名称,然后将结果整合到响应中。这一切都无需您手动编写逻辑。这就是从 API 封装器到代理的转变

除了 Neuron 之外,整个生态系统发展迅速。LLPhant提供了一种受 LangChain 启发的方法。Prism作为 Laravel 项目的简洁且提供商无关的接口,正逐渐受到关注。Symfony AI则将第一方集成引入到 Symfony 生态系统中。 

值得注意的是:这一切都不需要庞大的框架。像 Slim、Flight、F3、Phalcon 和 CodeIgniter 这样的轻量级 PHP 框架能够以极低的开销简洁地集成代理服务。如果你的技术栈已经很精简,那么添加代理层并不会改变这一点。

PHP 中的 RAG:比你想象的要简短


检索增强生成听起来很吓人,其实不然。它的核心在于四个步骤:将内容分块、生成嵌入、检索最相关的块,并将它们注入到提示中。

像 Qdrant、Pinecone 和 Weaviate 这样的向量数据库都提供了 HTTP API。PHP 会调用 HTTP API。所以,下面这样做没有问题:

$openAiClient = OpenAI::client ($_ENV['OPENAI_API_KEY']);$guzzle new \GuzzleHttp\Client ();$userQuery $_POST['question'] ? ? '' ;// 1. Generate embedding via OpenAI$embedding $openAiClient -> embeddings () -> create ([  'model' = > 'text-embedding-3-small',  'input' = > $userQuery,]) -> embeddings[0] -> embedding;// 2. Query Qdrant for nearest neighbors$results $guzzle -> post ('http://qdrant:6333/collections/docs/points/search', [  'json'= >[      'vector' = > $embedding,      'limit' = > 5,      'with_payload' = > true,    ],]);// 3. Inject retrieved context into your prompt$hits json_decode ($results -> getBody (), true)['result'];$chunks array_map (fn ($hit) = > $hit['payload']['text'], $hits);$context implode ("\n\n"$chunks);$prompt "Answer using this context:\n\n { $context }\n\nQuestion : { $userQuery }";

没有Python,没有编排层,只有HTTP和一些底层实现。

Python 的王国,PHP 的领地


我想澄清一点,本篇文章并不是在论证PHP应该取代Python用于人工智能领域。这也不是重点。

在模型训练、机器学习研究、数据科学流程、计算机视觉以及任何涉及笔记本和数值计算的领域,Python 都完胜。毋庸置疑。用 Python 就对了。

但 PHP 的优势在于生产环境的 Web 层。而大多数 AI 代理实际上都会在生产环境的 Web 层中运行:例如 CRM 系统、仪表盘、电子商务平台、CMS 系统、管理面板和业务流程工具等。

那一层已经是用 PHP 写的了,代理程序也应该用 PHP 来写。

这根本不需要动脑子


我曾为医疗保健、法律、智能制造和电子商务等行业的客户构建过基于 PHP 的生产系统。添加 AI 功能时,反复出现的挑战并非功能本身,而是上下文。您的代理需要访问已认证的用户会话、数据库架构、业务规则和缓存层。

将所有这些迁移到外部 Python 服务不仅仅是增加开销,更是一种技术债务。

PHP 将代理程序放在应用程序内部,这才是它应该在的位置。上下文已经存在。身份验证已经存在。你维护多年的部署管道也已经存在。

坦白说,互联网上的大部分内容也是如此。你不需要 Bedrock,不需要 n8n,也不需要团队简历上添上一门新语言。你只需要一个 API 密钥、一个服务类,以及你可能已经在生产环境中运行的 PHP 代码库。

巨人从未睡着。其他人只是闭上了眼睛。

作者:洛逸

评论

我要赞赏作者

请扫描二维码,使用微信支付哦。

分享到微信