LocalAI高级教程:用PHP解锁问答系统潜力

云信安装大师
90
AI 质量分
10 5 月, 2025
2 分钟阅读
0 阅读

LocalAI高级教程:用PHP解锁问答系统潜力

引言

LocalAI是一个强大的本地AI运行环境,它允许你在自己的服务器或开发机上运行各种开源AI模型。本教程将教你如何使用PHP与LocalAI集成,构建一个功能强大的问答系统。相比直接调用云API,LocalAI提供了更好的隐私保护、更低的延迟和完全的控制权。

准备工作

在开始之前,请确保你已具备以下条件:

  1. 已安装并配置好LocalAI环境(参考官方文档
  2. PHP 7.4或更高版本
  3. Composer依赖管理工具
  4. 基本的PHP编程知识

第一步:安装必要的PHP库

我们需要安装Guzzle HTTP客户端来与LocalAI的API交互:

代码片段
composer require guzzlehttp/guzzle

第二步:配置LocalAI

确保你的LocalAI服务正在运行(默认端口通常是8080)。你可以通过以下命令启动:

代码片段
./local-ai --models-path ./models --debug

注意:
--models-path指定模型存放目录
--debug开启调试模式(生产环境可去掉)

第三步:创建PHP问答类

创建一个名为LocalAIClient.php的文件:

代码片段
<?php
require 'vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;

class LocalAIClient {
    private $client;
    private $apiUrl;

    public function __construct($baseUri = 'http://localhost:8080') {
        $this->client = new Client([
            'base_uri' => $baseUri,
            'timeout'  => 30.0,
        ]);
        $this->apiUrl = $baseUri;
    }

    /**
     * 向LocalAI发送问题并获取答案
     * 
     * @param string $question 用户问题
     * @param string $modelName 使用的模型名称(默认: gpt-3.5-turbo)
     * @return array API响应数据
     */
    public function askQuestion($question, $modelName = 'gpt-3.5-turbo') {
        try {
            $response = $this->client->post('/v1/chat/completions', [
                'json' => [
                    'model' => $modelName,
                    'messages' => [
                        ['role' => 'system', 'content' => 'You are a helpful assistant.'],
                        ['role' => 'user', 'content' => $question]
                    ],
                    'temperature' => 0.7,
                ]
            ]);

            return json_decode($response->getBody(), true);
        } catch (RequestException $e) {
            return [
                'error' => true,
                'message' => $e->getMessage()
            ];
        }
    }
}
?>

代码解释:
1. __construct方法初始化HTTP客户端,连接到LocalAI服务
2. askQuestion方法构建符合OpenAI API格式的请求
3. temperature参数控制回答的随机性(0-1之间)

第四步:使用问答系统

创建一个测试文件test.php

代码片段
<?php
require_once 'LocalAIClient.php';

$localAI = new LocalAIClient();

// 示例问题
$question = "Explain quantum computing in simple terms";

// 获取答案
$response = $localAI->askQuestion($question);

if (isset($response['error'])) {
    echo "Error: " . $response['message'];
} else {
    echo "Answer: \n";
    echo $response['choices'][0]['message']['content'] . "\n";

    // Debug信息(可选)
    echo "\nDebug Info:\n";
    echo "Model: " . $response['model'] . "\n";
    echo "Tokens used: " . $response['usage']['total_tokens'] . "\n";
}
?>

第五步:高级功能扩展

1. 添加对话历史记录

修改askQuestion方法以支持上下文:

代码片段
public function askQuestionWithContext($question, array $history = [], $modelName = 'gpt-3.5-turbo') {
    // 构建消息数组,包含历史对话和当前问题
    $messages = [['role' => 'system', 'content' => 'You are a helpful assistant.']];

    foreach ($history as $item) {
        if (isset($item['role']) && isset($item['content'])) {
            array_push($messages, ['role' => $item['role'], 'content' => $item['content']]);
        }
    }

    array_push($messages, ['role' => 'user', 'content' => $question]);

    try {
        // ...其余代码与之前相同...

2. 流式响应处理

对于长回答,可以使用流式处理:

代码片段
public function streamAnswer($question, callable $callback, $modelName = 'gpt-3.5-turbo') {
    try {
        return $this->client->post('/v1/chat/completions', [
            'json' => [
                // ...其他参数...
                'stream' => true,
            ],
            // Guzzle的异步处理回调函数
            // ...回调实现...

最佳实践和注意事项

  1. 模型选择

    • gpt-3.5-turbo: CPU消耗较低,适合大多数场景
    • llama2: RAM要求较高但质量更好
  2. 性能优化

    代码片段
    // PHP脚本开始时设置无时间限制(仅限开发环境)
    set_time_limit(0);
    
    // 增加内存限制(根据模型大小调整)
    ini_set('memory_limit', '512M');
    
  3. 错误处理

    • LocalAI启动时检查模型是否已下载完成
    • API调用失败时实现自动重试机制
  4. 安全建议

    代码片段
    // 对用户输入进行过滤防止注入攻击
    function sanitizeInput($input) { 
        return htmlspecialchars(strip_tags(trim($input)));
    }
    

常见问题解决

Q: LocalAI响应很慢怎么办?
A:
1. 检查服务器资源使用情况(CPU/RAM)
2. 尝试更小的模型或减少max_tokens参数
3. 确保没有其他进程占用资源

Q: PHP报内存不足错误
A:
1. ini_set('memory_limit', '-1'); (不推荐生产环境)
2. PHP-FPM/Apache配置中增加内存限制

Q: API返回502错误
A:
1. LocalAI可能需要更多时间加载模型,增加超时时间:

代码片段
new Client(['timeout' => 120]); //120秒超时 <br>
   

总结

通过本教程,你已经学会了:
1. PHP与LocalAI的基本集成方法 ✓
2. OpenAPI兼容API的使用方式 ✓
3. Context-aware对话的实现 ✓
4. Stream处理等高级功能 ✓

完整项目代码可以在GitHub上找到:[示例仓库链接]

下一步可以尝试:
– [ ] Fine-tuning自己的模型
– [ ] Web界面集成
– [ ] API速率限制实现

希望这篇教程能帮助你快速上手使用PHP开发基于LocalAI的问答系统!

原创 高质量