
PHP AI 进阶·第一层模型调用——从「调 API」到「优雅切换」
“进阶路线图系列 · 第 1 篇总进度:第 1-2 周 | 每天 30-45 分钟
这一层学完你能做什么
- 用 OpenAI / Claude / DeepSeek 等 2-3 个模型的 API 写代码
- 实现结构化输出(JSON mode),不再解析残缺响应
核心能力:不再被任何一家模型绑定,做到「模型无关」——这也是后续 Agent / RAG / 编排三层的基础。
开始之前,先把本层用到的资源统一放在这里,学到哪里翻到哪里:
| | |
|---|
| | |
| | Agent / Tool / Embedding / RAG 全览 |
| openai-php/client GitHub[3] | | |
| | OpenAI / Claude / Gemini 统一调用 |
为什么第一层是根基
场景 A:硬编码——直接调 REST API
// 每个调用处都要写一遍完整的请求组装functioncallOpenAI(string $prompt): string{ $ch = curl_init('https://api.openai.com/v1/chat/completions'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('OPENAI_KEY'),'Content-Type: application/json', ], CURLOPT_POSTFIELDS => json_encode(['model' => 'gpt-4o','messages' => [['role' => 'user', 'content' => $prompt]], ]), CURLOPT_RETURNTRANSFER => true, ]); $result = json_decode(curl_exec($ch), true);return $result['choices'][0]['message']['content'];}// 换 Claude 时,URL、Header、请求体结构、响应解析路径全部不同functioncallClaude(string $prompt): string{ /* 重新写一套 */ }
每个调用处都这么写,换模型要把所有调用点全改一遍。
场景 B:模型无关——Laravel AI SDK
// 配置文件改一行'default_provider' => 'deepseek',// 所有业务代码统一写法$result = agent()->prompt('用 PHP 写一个快速排序');// 底层自动路由到配置的 provider,调用方无需感知
第一层的通关标志:不再被具体模型绑定,切换只需改配置。这也是后面三层的基础。
14 天学习路径
第 1-2 天:跑通第一个 Chat API
目标:用 OpenAI PHP SDK 调通 /v1/chat/completions
composer require openai-php/client
$client = OpenAI::client(getenv('OPENAI_API_KEY'));$response = $client->chat()->create(['model' => 'gpt-4o','messages' => [ ['role' => 'system', 'content' => '你是 PHP 技术专家。'], ['role' => 'user', 'content' => 'PHP 8.4 最有用的新特性是什么?'], ],]);echo $response->choices[0]->message->content;
关键概念:
| |
|---|
model | 模型版本:gpt-4o / claude-sonnet-4 / deepseek-chat |
messages | system 设定角色,user 用户输入,assistant 历史回复 |
choices[0] | |
常见错误:401 → API Key 错误;429 → 触发限流,需加重试。
第 3-4 天:Prism 统一接口
目标:理解「一次编写,多模型切换」
Prism 用统一接口封装 OpenAI / Claude / Gemini 的调用差异:
usePrism\Prism;// 换 provider 即可切换模型$response = Prism::text() ->using('gpt-4o', 'openai') // → claude-sonnet-4:anthropic ->withSystemPrompt('你是 PHP 架构师。') ->withPrompt('解释 Laravel 的服务容器') ->asText();// JSON mode$response = Prism::structured() ->using('gpt-4o', 'openai') ->withPrompt('列出 PHP 8 的主要版本号') ->withSchema(['type' => 'array','items' => ['type' => 'object','properties' => ['version' => ['type' => 'string'],'year' => ['type' => 'integer'], ], ], ]);
对比:
第 5-7 天:Laravel AI SDK
目标:掌握 agent() helper 和 Provider 配置
安装(需 Laravel 13+):
composer require laravel/framework:^13.0php artisan vendor:publish --tag=ai-config
config/ai.php 配置多个 Provider:
'providers' => ['openai' => ['api_key' => env('OPENAI_API_KEY'),'default_model' => 'gpt-4o', ],'anthropic' => ['api_key' => env('ANTHROPIC_API_KEY'),'default_model' => 'claude-sonnet-4', ],'deepseek' => ['api_key' => env('DEEPSEEK_API_KEY'),'default_model' => 'deepseek-chat', ],],
使用:
// 默认模型$result = agent()->prompt('用 PHP 写一个快速排序');// 指定模型$result = agent() ->using('claude-sonnet-4', 'anthropic') ->prompt('比较 PHP 和 Go 的协程实现');// 链式调用$result = agent() ->using('gpt-4o', 'openai') ->prompt('用中文解释什么是 AST') ->response() ->text();
第 8-10 天:JSON mode + SSE 流式响应
目标:掌握两个生产必备技能
JSON mode —— LLM 输出结构化 JSON,前端直接消费:
$response = agent() ->using('gpt-4o', 'openai') ->withStructuredOutput('json') ->prompt('分析代码,返回 { "issues": [...], "suggestions": [...] }') ->response();
SSE 流式 —— 逐字输出,打字机效果:
$stream = agent() ->using('gpt-4o', 'openai') ->withStream() ->prompt('写一篇 PHP 协程的介绍,500 字');foreach ($stream as $chunk) {echo $chunk->text; ob_flush(); flush(); usleep(10000);}
要点:
| | |
|---|
| | 需模型支持(gpt-4o-2024-08-06+) |
| | |
| | |
第 11-14 天:实战项目——多模型翻译工具
需求:翻译 API,输入中文输出英文,支持切换 OpenAI / Claude / DeepSeek,支持 JSON mode 和流式输出。
classTranslateService{publicfunctiontranslate( string $text, string $targetLang = 'en', string $provider = 'openai', bool $stream = false, ): \Generator|string{ $prompt = "将以下中文翻译成{$targetLang}。只返回翻译结果。\n\n{$text}";if ($stream) {return$this->streamTranslate($prompt, $provider); }return agent() ->using($this->modelFor($provider), $provider) ->prompt($prompt) ->response() ->text(); }privatefunctionmodelFor(string $provider): string{return match ($provider) {'openai' => 'gpt-4o','claude' => 'claude-sonnet-4','deepseek' => 'deepseek-chat',default => 'gpt-4o', }; }privatefunctionstreamTranslate(string $prompt, string $provider): \Generator{ $stream = agent() ->using($this->modelFor($provider), $provider) ->withStream() ->prompt($prompt);foreach ($stream as $chunk) {yield $chunk->text; } }}
完成此项目后你将理解:
关键代码速查
// 方案 A:原生 OpenAI PHP SDK$client = OpenAI::client($apiKey);$response = $client->chat()->create(['model' => 'gpt-4o','messages' => [ ['role' => 'system', 'content' => '你是翻译专家。'], ['role' => 'user', 'content' => '把这句话翻译成英文:PHP 正在进化。'], ],]);// 方案 B:Prism 统一接口$response = Prism::text() ->using('gpt-4o', 'openai') ->withPrompt('PHP 8.4 的新特性有哪些?') ->asText();// 方案 C:Laravel AI SDK 配置驱动$response = agent() ->using('claude-sonnet-4', 'anthropic') ->prompt('用 PHP 写一个快速排序');
常见问题
Q:项目只用 OpenAI,需要上 Prism / Laravel AI SDK 吗?A:建议上。客户可能要求换国产模型,提前做抽象避免后期大改。
Q:第一层需要学 LangChain 吗?A:不需要。那是 Python 生态的。PHP 用 Prism 和 Laravel AI SDK,更轻量。
Q:Laravel AI SDK 不用 Laravel 能用吗?A:可单独拆用,但最佳体验在 Laravel 项目——配置、队列、缓存无缝对接。
Q:流式响应费资源吗?A:不费。SSE 是单向通道,逐块推送,比等完整响应再返回更快。
下一步
第一层打通后,进入第二层:Agent 构建——从「回答问题」到「完成任务」。
进阶路线图系列:
[1] Laravel AI SDK 官方中文文档: https://laravel.net.cn/docs/13.x/ai-sdk
[2] Laravel AI SDK 发布详解: https://segmentfault.com/a/1190000047596150
[3] openai-php/client GitHub: https://github.com/openai-php/client
[4] Prism 官网: https://prism-php.com