怎样在PHP项目中实现智能助手?

wen java案例 1

本文目录导读:

怎样在PHP项目中实现智能助手?

  1. 方案一:基于规则和关键词的简单“伪智能”助手(适合新手/小型项目)
  2. 方案二:接入大模型API(真正的AI智能助手,推荐)
  3. 方案三:多轮对话与工作流(进阶,用于复杂业务流程)
  4. 关键技术选型建议
  5. 总结:最小可行的“智能助手”上线步骤(推荐方案二)

在PHP项目中实现智能助手可以有不同的复杂度和实现方式,取决于你的需求(是简单的规则对话,还是接入大模型实现复杂的AI问答)。

以下从最简单到最复杂的路径,给出几种实现方案及核心代码示例:


基于规则和关键词的简单“伪智能”助手(适合新手/小型项目)

原理:通过正则匹配或关键词数组,回复预设答案,不需要外部API。

适用场景:FAQ问答、客服快捷回复、机器人引导。

实现步骤

  1. 创建一个助手类(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;
    }
}
  1. 在控制器/路由中使用
// 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 为例)

  1. 安装 HTTP 客户端库(推荐 Guzzle)
composer require guzzlehttp/guzzle
  1. 创建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;
    }
}
  1. 使用示例(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将函数的结果组织成自然语言回复。

  1. 定义可调用的函数(Tools)
public function getOrderStatus(string $orderId): string {
    // 真实场景:查询数据库
    if ($orderId === '12345') {
        return json_encode(['status' => '已发货', 'tracking' => 'SF123456']);
    }
    return json_encode(['status' => '未找到订单']);
}
  1. 在 API 调用中声明 function
$payload['tools'] = [
    [
        'type' => 'function',
        'function' => [
            'name' => 'getOrderStatus',
            'description' => '查询订单物流状态',
            'parameters' => [
                'type' => 'object',
                'properties' => [
                    'orderId' => [
                        'type' => 'string',
                        'description' => '订单号'
                    ]
                ],
                'required' => ['orderId']
            ]
        ]
    ]
];
  1. 处理 AI 返回的函数调用请求

当AI判断需要查订单时,不会直接回复文字,而是返回一个tool_calls,PHP需要执行该函数,再将结果返回给AI进行二次生成。

此模式推荐使用成熟的PHP AI SDK,如:openai-php/client


关键技术选型建议

场景 推荐工具/框架
简单关键词/规则 自己写类(如上面方案一)
调用通用大模型 OpenAI PHP SDK:openai-php/client
调用国内大模型 阿里通义千问DashScope SDK、百度文心一言 SDK
自建本地模型 使用 llama-cpp-pythonollama 启动服务,PHP 通过 HTTP 调用
流程自动化+函数调用 OpenAI Function Calling / LangChain PHP 移植版
流式输出(打字机效果) SSE(Server-Sent Events)+ 流式API

最小可行的“智能助手”上线步骤(推荐方案二)

  1. 注册一个 AI API 账号(推荐OpenAI、通义千问或DeepSeek,国内生态选DeepSeek/通义成本低)。
  2. 安装 HTTP 客户端(如 Guzzle)。
  3. 复制上述 AiAssistant,填入你的 API Key。
  4. 在前端写一个聊天界面(HTML + JavaScript + SSE或普通POST)。
  5. 部署到服务器(注意:API Key 放在服务端 .env 文件中,不要暴露给前端)。

这样,你就能在 PHP 项目中拥有一个真正理解语意的智能助手。

如果需要针对某个具体框架(如Laravel、ThinkPHP)或具体API(如通义千问、百度文心)的实现代码,可以告诉我,我可以提供对应的适配代码。

抱歉,评论功能暂时关闭!