mirror of
https://github.com/symfony/ai.git
synced 2026-03-23 23:42:18 +01:00
64 lines
2.3 KiB
PHP
64 lines
2.3 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of the Symfony package.
|
|
*
|
|
* (c) Fabien Potencier <fabien@symfony.com>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
use Symfony\AI\Agent\Agent;
|
|
use Symfony\AI\Agent\Bridge\SimilaritySearch\SimilaritySearch;
|
|
use Symfony\AI\Agent\Toolbox\AgentProcessor;
|
|
use Symfony\AI\Agent\Toolbox\Toolbox;
|
|
use Symfony\AI\Fixtures\Movies;
|
|
use Symfony\AI\Platform\Bridge\OpenAi\PlatformFactory;
|
|
use Symfony\AI\Platform\Message\Message;
|
|
use Symfony\AI\Platform\Message\MessageBag;
|
|
use Symfony\AI\Store\Bridge\Sqlite\Store;
|
|
use Symfony\AI\Store\Document\Metadata;
|
|
use Symfony\AI\Store\Document\TextDocument;
|
|
use Symfony\AI\Store\Document\Vectorizer;
|
|
use Symfony\AI\Store\Indexer\DocumentIndexer;
|
|
use Symfony\AI\Store\Indexer\DocumentProcessor;
|
|
use Symfony\Component\Uid\Uuid;
|
|
|
|
require_once dirname(__DIR__).'/bootstrap.php';
|
|
|
|
// initialize the store — file-based SQLite for persistence
|
|
$pdo = new PDO('sqlite:'.__DIR__.'/var/vectors.db');
|
|
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
|
$store = new Store($pdo, 'movies');
|
|
$store->setup();
|
|
|
|
// create embeddings and documents
|
|
$documents = [];
|
|
foreach (Movies::all() as $i => $movie) {
|
|
$documents[] = new TextDocument(
|
|
id: Uuid::v4(),
|
|
content: 'Title: '.$movie['title'].\PHP_EOL.'Director: '.$movie['director'].\PHP_EOL.'Description: '.$movie['description'],
|
|
metadata: new Metadata($movie),
|
|
);
|
|
}
|
|
|
|
// create embeddings for documents
|
|
$platform = PlatformFactory::create(env('OPENAI_API_KEY'), http_client());
|
|
$vectorizer = new Vectorizer($platform, 'text-embedding-3-small', logger());
|
|
$indexer = new DocumentIndexer(new DocumentProcessor($vectorizer, $store, logger: logger()));
|
|
$indexer->index($documents);
|
|
|
|
$similaritySearch = new SimilaritySearch($vectorizer, $store);
|
|
$toolbox = new Toolbox([$similaritySearch], logger: logger());
|
|
$processor = new AgentProcessor($toolbox);
|
|
$agent = new Agent($platform, 'gpt-5-mini', [$processor], [$processor]);
|
|
|
|
$messages = new MessageBag(
|
|
Message::forSystem('Please answer all user questions only using SimilaritySearch function.'),
|
|
Message::ofUser('Which movie fits the theme of the mafia?')
|
|
);
|
|
$result = $agent->call($messages);
|
|
|
|
echo $result->getContent().\PHP_EOL;
|