Laravel 12 AI 功能集成:从理论到实践

摘要

本文详细介绍 Laravel 12 中 AI 相关功能的集成与应用,包括 OpenAI 客户端、向量数据库支持、智能路由生成等。通过实际项目案例,展示如何构建智能应用,如内容生成、用户行为分析、智能客服等,帮助开发者快速掌握 Laravel 12 的 AI 能力。

1. Laravel 12 AI 功能概述

Laravel 12 引入了多项 AI 相关功能和工具,为开发者提供了构建智能应用的强大能力。

1.1 核心 AI 功能

  • OpenAI 客户端:官方集成的 OpenAI API 客户端,支持 GPT 模型调用
  • 向量数据库支持:内置对 Pinecone、Chroma 等向量数据库的支持
  • 智能路由生成:基于 AI 的路由代码生成功能
  • AI 辅助测试:使用 AI 生成测试用例
  • 内容生成器:基于 AI 的内容生成工具

1.2 AI 功能的应用场景

场景应用示例技术方案
内容生成文章摘要、产品描述、邮件模板OpenAI GPT + 提示工程
智能客服聊天机器人、问题回答OpenAI GPT + 上下文管理
推荐系统商品推荐、内容推荐向量数据库 + 相似度搜索
代码生成路由生成、控制器代码OpenAI GPT + 代码提示
数据分析用户行为分析、趋势预测AI 模型 + 数据处理

2. OpenAI 客户端集成

Laravel 12 提供了官方的 OpenAI 客户端,简化了与 OpenAI API 的交互。

2.1 安装与配置

安装依赖

1
composer require laravel/openai

配置 API 密钥

1
2
3
// .env
OPENAI_API_KEY=your-openai-api-key
OPENAI_ORGANIZATION=your-organization-id (可选)

发布配置

1
php artisan vendor:publish --provider="Laravel\OpenAI\OpenAIServiceProvider"

2.2 基本使用

文本生成

1
2
3
4
5
6
7
8
9
10
11
12
use Laravel\OpenAI\Facades\OpenAI;

$response = OpenAI::chat()->create([
'model' => 'gpt-4',
'messages' => [
['role' => 'system', 'content' => 'You are a helpful assistant.'],
['role' => 'user', 'content' => 'Write a short article about Laravel 12 AI features.'],
],
'temperature' => 0.7,
]);

$content = $response->choices[0]->message->content;

图像生成

1
2
3
4
5
6
7
8
9
use Laravel\OpenAI\Facades\OpenAI;

$response = OpenAI::images()->generate([
'prompt' => 'A modern Laravel application with AI features',
'n' => 1,
'size' => '1024x1024',
]);

$imageUrl = $response->data[0]->url;

语音转文本

1
2
3
4
5
6
7
8
use Laravel\OpenAI\Facades\OpenAI;

$response = OpenAI::audio()->transcribe([
'model' => 'whisper-1',
'file' => fopen('/path/to/audio.mp3', 'r'),
]);

$transcription = $response->text;

2.3 高级用法

流式响应

1
2
3
4
5
6
7
8
9
10
11
12
13
use Laravel\OpenAI\Facades\OpenAI;

$stream = OpenAI::chat()->createStreamed([
'model' => 'gpt-4',
'messages' => [
['role' => 'system', 'content' => 'You are a helpful assistant.'],
['role' => 'user', 'content' => 'Write a short story about Laravel.'],
],
]);

foreach ($stream as $response) {
echo $response->choices[0]->delta->content ?? '';
}

函数调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
use Laravel\OpenAI\Facades\OpenAI;

$response = OpenAI::chat()->create([
'model' => 'gpt-4',
'messages' => [
['role' => 'system', 'content' => 'You are a helpful assistant.'],
['role' => 'user', 'content' => 'What is the weather in New York today?'],
],
'functions' => [
[
'name' => 'get_weather',
'description' => 'Get the current weather for a location',
'parameters' => [
'type' => 'object',
'properties' => [
'location' => [
'type' => 'string',
'description' => 'The city and state, e.g., San Francisco, CA',
],
],
'required' => ['location'],
],
],
],
'function_call' => 'auto',
]);

if ($response->choices[0]->finish_reason === 'function_call') {
$functionName = $response->choices[0]->message->function_call->name;
$arguments = json_decode($response->choices[0]->message->function_call->arguments, true);

// 调用函数获取天气
$weather = $this->getWeather($arguments['location']);

// 将函数结果发送回模型
$response = OpenAI::chat()->create([
'model' => 'gpt-4',
'messages' => [
['role' => 'system', 'content' => 'You are a helpful assistant.'],
['role' => 'user', 'content' => 'What is the weather in New York today?'],
['role' => 'assistant', 'content' => null, 'function_call' => [
'name' => 'get_weather',
'arguments' => json_encode(['location' => 'New York']),
]],
['role' => 'function', 'name' => 'get_weather', 'content' => json_encode($weather)],
],
]);

$content = $response->choices[0]->message->content;
}

3. 向量数据库集成

Laravel 12 内置了对向量数据库的支持,为构建推荐系统、相似度搜索等功能提供了便利。

3.1 安装与配置

安装向量数据库客户端

1
2
3
4
5
# 安装 Pinecone 客户端
composer require pinecone-io/pinecone-php

# 或安装 Chroma 客户端
composer require chromadb/chromadb-php

配置向量数据库连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// config/ai.php
'vectors' => [
'default' => env('VECTOR_STORE_DEFAULT', 'pinecone'),

'stores' => [
'pinecone' => [
'driver' => 'pinecone',
'api_key' => env('PINECONE_API_KEY'),
'environment' => env('PINECONE_ENVIRONMENT'),
'index' => env('PINECONE_INDEX'),
],
'chroma' => [
'driver' => 'chroma',
'host' => env('CHROMA_HOST', 'http://localhost:8000'),
'collection' => env('CHROMA_COLLECTION', 'default'),
],
],
],

3.2 基本使用

生成嵌入向量

1
2
3
4
5
6
7
8
9
use Laravel\AI\Facades\AI;

// 生成文本嵌入
$embedding = AI::embeddings()->create([
'model' => 'text-embedding-ada-002',
'input' => 'Laravel is a PHP framework',
]);

$vector = $embedding->embeddings[0]->embedding;

存储向量

1
2
3
4
5
6
7
8
9
10
11
use Laravel\AI\Facades\AI;

// 存储向量到 Pinecone
AI::vectors()->add([
'id' => 'document-1',
'values' => $vector,
'metadata' => [
'title' => 'Laravel Introduction',
'type' => 'document',
],
]);

相似度搜索

1
2
3
4
5
6
7
8
9
10
11
12
13
14
use Laravel\AI\Facades\AI;

// 搜索相似向量
$results = AI::vectors()->search([
'query' => $queryVector,
'topK' => 5,
'filter' => [
'type' => 'document',
],
]);

foreach ($results as $result) {
echo $result['id'] . ': ' . $result['score'] . '\n';
}

3.3 向量数据库的高级应用

构建推荐系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
use Laravel\AI\Facades\AI;

class RecommendationService
{
public function getRecommendations(User $user, int $limit = 10)
{
// 获取用户偏好向量
$userVector = $this->getUserPreferenceVector($user);

// 搜索相似内容
$results = AI::vectors()->search([
'query' => $userVector,
'topK' => $limit,
'filter' => [
'type' => 'content',
'status' => 'published',
],
]);

// 转换为内容模型
return Content::whereIn('id', collect($results)->pluck('id')->all())->get();
}

protected function getUserPreferenceVector(User $user)
{
// 基于用户历史行为生成偏好向量
$history = $user->viewHistory->pluck('content')->implode(' ');

$embedding = AI::embeddings()->create([
'model' => 'text-embedding-ada-002',
'input' => $history,
]);

return $embedding->embeddings[0]->embedding;
}
}

语义搜索

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
use Laravel\AI\Facades\AI;

class SearchService
{
public function semanticSearch(string $query, int $limit = 10)
{
// 生成查询向量
$embedding = AI::embeddings()->create([
'model' => 'text-embedding-ada-002',
'input' => $query,
]);

$queryVector = $embedding->embeddings[0]->embedding;

// 搜索相似文档
$results = AI::vectors()->search([
'query' => $queryVector,
'topK' => $limit,
'filter' => [
'type' => 'document',
'status' => 'published',
],
]);

// 转换为文档模型
return Document::whereIn('id', collect($results)->pluck('id')->all())->get();
}
}

4. 智能路由生成

Laravel 12 提供了基于 AI 的智能路由生成功能,可以根据自然语言描述生成路由代码。

4.1 基本使用

生成路由代码

1
2
# 使用 Artisan 命令生成路由
php artisan route:generate "Create a route for user profile with authentication"

交互式生成

1
2
# 交互式生成路由
php artisan route:generate --interactive

4.2 路由生成示例

生成 RESTful API 路由

1
php artisan route:generate "Create RESTful API routes for posts with index, show, store, update, destroy methods"

生成的路由代码:

1
2
// routes/api.php
Route::apiResource('posts', PostController::class);

生成带中间件的路由

1
php artisan route:generate "Create a route group for admin with auth and role middleware"

生成的路由代码:

1
2
3
4
5
6
// routes/web.php
Route::middleware(['auth', 'role:admin'])->group(function () {
Route::get('/admin/dashboard', [AdminController::class, 'dashboard'])->name('admin.dashboard');
Route::resource('/admin/users', AdminUserController::class);
Route::resource('/admin/posts', AdminPostController::class);
});

4.3 自定义路由生成

配置生成规则

1
2
3
4
5
6
7
8
9
10
11
12
13
// config/ai.php
'route' => [
'generator' => [
'model' => 'gpt-4',
'temperature' => 0.3,
'max_tokens' => 1000,
'rules' => [
'use_resource_controllers' => true,
'prefix_api_routes' => true,
'use_named_routes' => true,
],
],
],

自定义提示模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 自定义路由生成提示
$prompt = "Generate Laravel route code for: {$description}\n\n";
$prompt .= "Follow these rules:\n";
$prompt .= "1. Use named routes\n";
$prompt .= "2. Apply appropriate middleware\n";
$prompt .= "3. Use resource controllers where appropriate\n";
$prompt .= "4. Return only the route code, no explanations\n";

$response = OpenAI::chat()->create([
'model' => 'gpt-4',
'messages' => [
['role' => 'system', 'content' => 'You are a Laravel route generator.'],
['role' => 'user', 'content' => $prompt],
],
]);

$routeCode = $response->choices[0]->message->content;

5. AI 辅助测试

Laravel 12 提供了 AI 辅助测试功能,可以使用 AI 生成测试用例。

5.1 生成测试用例

基本使用

1
2
# 为控制器生成测试
php artisan test:generate App\Http\Controllers\UserController

生成单元测试

1
2
# 为服务类生成单元测试
php artisan test:generate App\Services\UserService --type=unit

5.2 测试生成示例

生成的测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?php

namespace Tests\Feature\Http\Controllers;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;
use App\Models\User;

class UserControllerTest extends TestCase
{
use RefreshDatabase;

/**
* Test index method
*/
public function test_index_returns_all_users()
{
// Create test users
User::factory()->count(3)->create();

// Act
$response = $this->get('/users');

// Assert
$response->assertStatus(200);
$response->assertJsonCount(3);
}

/**
* Test show method
*/
public function test_show_returns_single_user()
{
// Create test user
$user = User::factory()->create();

// Act
$response = $this->get('/users/' . $user->id);

// Assert
$response->assertStatus(200);
$response->assertJson(['id' => $user->id]);
}

/**
* Test store method
*/
public function test_store_creates_new_user()
{
// Arrange
$userData = [
'name' => 'Test User',
'email' => 'test@example.com',
'password' => 'password123',
];

// Act
$response = $this->post('/users', $userData);

// Assert
$response->assertStatus(201);
$this->assertDatabaseHas('users', ['email' => 'test@example.com']);
}
}

6. 内容生成器

Laravel 12 提供了基于 AI 的内容生成工具,可以生成各种类型的内容。

6.1 基本使用

生成文章摘要

1
2
3
4
5
6
7
use Laravel\AI\Facades\AI;

$summary = AI::content()->summarize([
'text' => $longArticle,
'maxLength' => 200,
'format' => 'paragraph',
]);

生成产品描述

1
2
3
4
5
6
7
use Laravel\AI\Facades\AI;

$description = AI::content()->generate([
'prompt' => 'Generate a product description for a wireless headphones with noise cancellation',
'maxLength' => 500,
'tone' => 'professional',
]);

6.2 内容生成的高级应用

多语言内容生成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
use Laravel\AI\Facades\AI;

class ContentGenerator
{
public function translate(string $text, string $targetLanguage)
{
return AI::content()->translate([
'text' => $text,
'targetLanguage' => $targetLanguage,
'sourceLanguage' => 'auto',
]);
}

public function generateMultiLanguageContent(string $prompt, array $languages)
{
$content = [];

foreach ($languages as $language) {
$content[$language] = AI::content()->generate([
'prompt' => $prompt,
'maxLength' => 500,
'language' => $language,
]);
}

return $content;
}
}

SEO 内容优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
use Laravel\AI\Facades\AI;

class SeoService
{
public function optimizeContent(string $content, array $keywords)
{
return AI::content()->optimize([
'content' => $content,
'keywords' => $keywords,
'target' => 'seo',
'maxLength' => 1000,
]);
}

public function generateMetaTags(string $content)
{
return AI::content()->generate([
'prompt' => "Generate SEO meta title and description for: {$content}",
'maxLength' => 300,
'format' => 'json',
]);
}
}

7. 实战案例:构建智能客服系统

以下是一个使用 Laravel 12 AI 功能构建智能客服系统的实战案例:

7.1 系统架构

  • 前端:React 聊天界面
  • 后端:Laravel 12 + OpenAI API
  • 数据存储:MySQL + Redis
  • 向量存储:Pinecone

7.2 核心功能

  • 智能问答:基于 OpenAI GPT 的问题回答
  • 上下文管理:维护对话上下文,提供连贯的回答
  • 知识库集成:使用向量数据库存储和搜索知识库
  • 意图识别:识别用户意图,提供精准回答
  • 多轮对话:支持多轮对话交互

7.3 实现代码

聊天控制器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php

namespace App\Http\Controllers;

use App\Services\ChatService;
use Illuminate\Http\Request;

class ChatController extends Controller
{
protected $chatService;

public function __construct(ChatService $chatService)
{
$this->chatService = $chatService;
}

public function sendMessage(Request $request)
{
$message = $request->input('message');
$userId = $request->user()->id;
$sessionId = $request->input('session_id', uniqid());

$response = $this->chatService->processMessage($message, $userId, $sessionId);

return response()->json([
'message' => $response,
'session_id' => $sessionId,
]);
}
}

聊天服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
<?php

namespace App\Services;

use Laravel\OpenAI\Facades\OpenAI;
use Laravel\AI\Facades\AI;
use Redis;

class ChatService
{
public function processMessage(string $message, int $userId, string $sessionId)
{
// 获取对话历史
$history = $this->getConversationHistory($sessionId);

// 生成回答
$response = $this->generateResponse($message, $history);

// 更新对话历史
$this->updateConversationHistory($sessionId, $message, $response);

return $response;
}

protected function getConversationHistory(string $sessionId)
{
$key = "chat:session:{$sessionId}";
return Redis::get($key) ?: [];
}

protected function updateConversationHistory(string $sessionId, string $userMessage, string $botResponse)
{
$key = "chat:session:{$sessionId}";
$history = $this->getConversationHistory($sessionId);

$history[] = ['role' => 'user', 'content' => $userMessage];
$history[] = ['role' => 'assistant', 'content' => $botResponse];

// 只保留最近 10 条消息
$history = array_slice($history, -10);

Redis::setex($key, 3600, json_encode($history));
}

protected function generateResponse(string $message, array $history)
{
// 构建上下文
$context = array_merge([
['role' => 'system', 'content' => 'You are a helpful customer service assistant for an e-commerce store.'],
], $history, [
['role' => 'user', 'content' => $message],
]);

// 搜索知识库
$knowledge = $this->searchKnowledgeBase($message);
if (!empty($knowledge)) {
$context[] = ['role' => 'system', 'content' => "Knowledge base information: {$knowledge}"];
}

// 调用 OpenAI API
$response = OpenAI::chat()->create([
'model' => 'gpt-4',
'messages' => $context,
'temperature' => 0.7,
]);

return $response->choices[0]->message->content;
}

protected function searchKnowledgeBase(string $query)
{
// 生成查询向量
$embedding = AI::embeddings()->create([
'model' => 'text-embedding-ada-002',
'input' => $query,
]);

$queryVector = $embedding->embeddings[0]->embedding;

// 搜索知识库
$results = AI::vectors()->search([
'query' => $queryVector,
'topK' => 3,
'filter' => [
'type' => 'knowledge',
],
]);

// 提取知识内容
return collect($results)->pluck('metadata.content')->implode(' ');
}
}

8. 最佳实践与注意事项

8.1 API 调用优化

  • 批量请求:合并多个 API 请求,减少调用次数
  • 缓存响应:缓存频繁使用的 AI 响应
  • 异步处理:使用队列处理耗时的 AI 任务
  • 错误处理:实现健壮的错误处理机制

8.2 提示工程

  • 明确指令:提供清晰、具体的指令
  • 示例引导:使用示例引导模型生成期望的输出
  • 上下文管理:合理管理上下文长度,避免超出限制
  • 温度参数:根据任务类型调整温度参数

8.3 成本控制

  • 使用合适的模型:根据任务复杂度选择合适的模型
  • 优化提示:减少提示长度,提高生成效率
  • 缓存策略:缓存重复查询的结果
  • 使用批处理:批量处理多个请求

8.4 安全性

  • 输入验证:验证用户输入,防止提示注入
  • 输出过滤:过滤生成的内容,防止有害输出
  • API 密钥管理:安全存储 API 密钥,使用环境变量
  • 速率限制:实现 API 调用速率限制,防止滥用

9. 总结

Laravel 12 的 AI 功能集成为开发者提供了构建智能应用的强大工具,从 OpenAI 客户端到向量数据库支持,从智能路由生成到内容生成器,这些功能大大简化了 AI 应用的开发流程。

通过本文的介绍,开发者可以快速掌握 Laravel 12 的 AI 能力,并应用到实际项目中,如内容生成、智能客服、推荐系统等场景。同时,通过遵循最佳实践和注意事项,可以确保 AI 应用的性能、成本和安全性。

随着 AI 技术的不断发展,Laravel 也在持续改进其 AI 功能,未来版本可能会引入更多创新的 AI 工具和集成。开发者应该保持关注 Laravel 的更新,及时采用新的 AI 功能,为用户提供更加智能、个性化的应用体验。