本文目录导读:

- 方案一:基于规则和关键词的简单“伪智能”助手(适合新手/小型项目)
- 方案二:接入大模型API(真正的AI智能助手,推荐)
- 方案三:多轮对话与工作流(进阶,用于复杂业务流程)
- 关键技术选型建议
- 总结:最小可行的“智能助手”上线步骤(推荐方案二)
在PHP项目中实现智能助手可以有不同的复杂度和实现方式,取决于你的需求(是简单的规则对话,还是接入大模型实现复杂的AI问答)。
以下从最简单到最复杂的路径,给出几种实现方案及核心代码示例:
基于规则和关键词的简单“伪智能”助手(适合新手/小型项目)
原理:通过正则匹配或关键词数组,回复预设答案,不需要外部API。
适用场景:FAQ问答、客服快捷回复、机器人引导。
实现步骤:
- 创建一个助手类(Assistant.php)
<?php
class SimpleAssistant {
// 定义规则:关键词 => 回复
private array $rules = [
'你好' => '你好!很高兴为你服务。',
'时间' => '当前服务器时间是:' . date('Y-m-d H:i:s'),
'帮助' => '我目前可以回答:你好、时间、天气(需要API)、联系方式等问题。',
'联系方式' => '你可以通过 email: admin@example.com 联系我。',
'天气' => '抱歉,天气查询需要接入外部天气API。',
];
// 默认回复
private string $defaultReply = '抱歉,我暂时无法理解这个问题,你可以试试说"帮助"查看我能做什么。';
/**
* 处理用户消息
* @param string $userMessage 用户输入的文本
* @return string 助手的回复
*/
public function handleMessage(string $userMessage): string {
$userMessage = trim($userMessage);
// 1. 精确匹配
if (array_key_exists($userMessage, $this->rules)) {
return $this->rules[$userMessage];
}
// 2. 关键词模糊匹配
foreach ($this->rules as $keyword => $reply) {
// 如果用户消息中包含某个关键词
if (mb_strpos($userMessage, $keyword) !== false) {
return $reply;
}
}
// 3. 没有匹配,返回默认回复
return $this->defaultReply;
}
}
- 在控制器/路由中使用
// Laravel 路由或简单 index.php require_once 'SimpleAssistant.php'; $assistant = new SimpleAssistant(); $userInput = $_GET['q'] ?? ''; // 假设通过 GET 参数传递 $reply = $assistant->handleMessage($userInput); echo json_encode(['reply' => $reply]);
接入大模型API(真正的AI智能助手,推荐)
原理:调用 OpenAI(ChatGPT)、通义千问(阿里)、文心一言(百度)或 Claude 等大语言模型的API。
适用场景:需要理解复杂语义、上下文对话、生成内容、代码辅助等。
实现步骤(以 OpenAI ChatGPT 为例):
- 安装 HTTP 客户端库(推荐 Guzzle)
composer require guzzlehttp/guzzle
- 创建AI助手类(AiAssistant.php)
<?php
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
class AiAssistant
{
private string $apiKey;
private string $model;
private Client $httpClient;
// 存储对话历史(可选,实现上下文记忆)
private array $messages = [];
public function __construct(string $apiKey, string $model = 'gpt-4o-mini')
{
$this->apiKey = $apiKey;
$this->model = $model;
// 初始化系统角色(可选,定义助手人格)
$this->messages[] = [
'role' => 'system',
'content' => '你是一个专业的PHP技术助手,回答要简洁、准确,必要时提供代码示例。'
];
$this->httpClient = new Client([
'base_uri' => 'https://api.openai.com',
'timeout' => 30.0,
]);
}
/**
* 向AI提问(支持流式/非流式)
* @param string $userMessage 用户问题
* @param bool $stream 是否使用流式响应(SSE)
* @return string 助手的回答
* @throws GuzzleException
*/
public function ask(string $userMessage, bool $stream = false): string
{
// 将用户消息加入历史
$this->messages[] = [
'role' => 'user',
'content' => $userMessage
];
$payload = [
'model' => $this->model,
'messages' => $this->messages,
'temperature' => 0.7,
// 'stream' => $stream // 如果需要流式输出,请在此启用并处理响应
];
// 发送请求
$response = $this->httpClient->post('/v1/chat/completions', [
'headers' => [
'Authorization' => 'Bearer ' . $this->apiKey,
'Content-Type' => 'application/json',
],
'json' => $payload,
]);
$body = json_decode($response->getBody(), true);
$reply = $body['choices'][0]['message']['content'] ?? '抱歉,没有获取到回复。';
// 将助手的回复加入历史(实现上下文记忆)
$this->messages[] = [
'role' => 'assistant',
'content' => $reply
];
// 可选:限制历史长度,防止 token 过多
if (count($this->messages) > 20) {
// 保留系统消息和最近10轮对话
$systemMessage = array_shift($this->messages); // 取出系统消息
$this->messages = array_slice($this->messages, -20); // 保留最后20条
array_unshift($this->messages, $systemMessage); // 再将系统消息放回头部
}
return $reply;
}
// 支持记忆会话ID,用于多轮对话(将 messages 存入数据库/Redis)
public function setConversationHistory(array $history): void
{
$this->messages = $history;
}
public function getConversationHistory(): array
{
return $this->messages;
}
}
- 使用示例(Laravel/Slim/原生PHP)
// 初始化(将 API key 放入 .env 或配置中)
$apiKey = 'sk-xxxxxxxxxxxxxxxxxxxxxxxx';
$ai = new AiAssistant($apiKey);
// 用户发送消息
$userInput = $_POST['message'] ?? '用PHP写一个冒泡排序';
// 获取AI回复
try {
$reply = $ai->ask($userInput);
echo json_encode(['success' => true, 'reply' => $reply]);
} catch (Exception $e) {
echo json_encode(['success' => false, 'error' => $e->getMessage()]);
}
多轮对话与工作流(进阶,用于复杂业务流程)
当助手需要执行具体操作(如:查询数据库、创建订单、发送邮件)时,需要结合 Function Calling(函数调用)。
原理:AI负责理解用户意图,然后将特定任务(如搜索用户、计算价格)交给PHP函数执行,最后AI将函数的结果组织成自然语言回复。
- 定义可调用的函数(Tools):
public function getOrderStatus(string $orderId): string {
// 真实场景:查询数据库
if ($orderId === '12345') {
return json_encode(['status' => '已发货', 'tracking' => 'SF123456']);
}
return json_encode(['status' => '未找到订单']);
}
- 在 API 调用中声明 function:
$payload['tools'] = [
[
'type' => 'function',
'function' => [
'name' => 'getOrderStatus',
'description' => '查询订单物流状态',
'parameters' => [
'type' => 'object',
'properties' => [
'orderId' => [
'type' => 'string',
'description' => '订单号'
]
],
'required' => ['orderId']
]
]
]
];
- 处理 AI 返回的函数调用请求:
当AI判断需要查订单时,不会直接回复文字,而是返回一个tool_calls,PHP需要执行该函数,再将结果返回给AI进行二次生成。
此模式推荐使用成熟的PHP AI SDK,如:openai-php/client。
关键技术选型建议
| 场景 | 推荐工具/框架 |
|---|---|
| 简单关键词/规则 | 自己写类(如上面方案一) |
| 调用通用大模型 | OpenAI PHP SDK:openai-php/client |
| 调用国内大模型 | 阿里通义千问DashScope SDK、百度文心一言 SDK |
| 自建本地模型 | 使用 llama-cpp-python 或 ollama 启动服务,PHP 通过 HTTP 调用 |
| 流程自动化+函数调用 | OpenAI Function Calling / LangChain PHP 移植版 |
| 流式输出(打字机效果) | SSE(Server-Sent Events)+ 流式API |
最小可行的“智能助手”上线步骤(推荐方案二)
- 注册一个 AI API 账号(推荐OpenAI、通义千问或DeepSeek,国内生态选DeepSeek/通义成本低)。
- 安装 HTTP 客户端(如 Guzzle)。
- 复制上述
AiAssistant类,填入你的 API Key。 - 在前端写一个聊天界面(HTML + JavaScript + SSE或普通POST)。
- 部署到服务器(注意:API Key 放在服务端 .env 文件中,不要暴露给前端)。
这样,你就能在 PHP 项目中拥有一个真正理解语意的智能助手。
如果需要针对某个具体框架(如Laravel、ThinkPHP)或具体API(如通义千问、百度文心)的实现代码,可以告诉我,我可以提供对应的适配代码。