LLPHANT: EL FRAMEWORK DE PHP PARA DESARROLLAR APLICACIONES DE IA GENERATIVA

LLPhant es un framework de PHP diseñado específicamente para facilitar la creación de aplicaciones basadas en inteligencia artificial generativa. Permite a los desarrolladores PHP integrar de forma nativa los principales modelos de lenguaje sin necesidad de abandonar el ecosistema PHP. Instalación sencilla mediante Composer:

composer require theodo-group/llphant

Xaracterísticas de LLPhant

  • RAG (Retrieval-Augmented Generation) Avanzado
    • Ingesta y división de documentos (PDF, Word, texto, etc.)
    • Generación de embeddings con múltiples modelos
    • Soporte para una amplia variedad de Vector Stores:
      • Doctrine (PostgreSQL + pgvector)
      • Redis, Elasticsearch, MongoDB
      • Qdrant, Milvus, Pinecone, ChromaDB, AstraDB, OpenSearch, Typesense y más
    • Estrategias avanzadas de recuperación:
      • Multi-Query Query Transformation
      • RetrievedDocumentsTransformer y Reranking
      • Small to Big Retrieval
    • Clase QuestionAnswering que automatiza todo el flujo RAG
    • Integración de Tools dentro del QuestionAnswering
  • Function Calling y Tools
    • Permite que los LLMs llamen a funciones PHP definidas por el desarrollador
    • Creación sencilla de herramientas como clases PHP
    • Ideal para construir agentes que interactúen con APIs externas, bases de datos o realicen acciones
  • Agentes (Agents) y AutoPHP
    • Soporte para agentes autónomos estilo ReAct / AutoGPT
    • Paquete complementario AutoPHP para tareas complejas e iterativas
    • Razonamiento paso a paso combinado con uso de herramientas
  • Guardrails y Seguridad
    • Sistema integrado de Guardrails para validar salidas
    • Detección de Prompt Injections
    • Validación de formato JSON, cumplimiento de políticas y seguridad
  • Memoria y Conversaciones Contextuales
    • Chat Memory / Chat Session para mantener el historial de conversación
    • Memoria persistente según la implementación
    • Interacciones multi-turno con contexto
  • Capacidades Multimodales
    • Análisis de visión e imágenes (Image Understanding)
    • Speech to Text (conversión de audio a texto)
    • Traducción de audio (no inglés a inglés)
  • Otras Características Avanzadas
    • Streaming de respuestas en tiempo real
    • Tracking detallado de consumo de tokens
    • Evaluación de resultados (scoring, A/B testing, validación)
    • Personalización profunda de prompts y transformers
    • Integración nativa y fluida con Laravel y Symfony

Ideas para Usar LLPhant en Proyectos Reales

LLPhant permite a los desarrolladores PHP crear aplicaciones de inteligencia artificial generativa de forma sencilla y potente. A continuación, una lista de ideas prácticas organizadas por nivel de complejidad y tipo de aplicación:

Ideas Básicas (Fáciles de implementar)

  • Chatbot simple – Asistente conversacional con respuestas en tiempo real usando streaming.
  • Generador de contenido – Crear descripciones de productos, artículos de blog, emails o resúmenes automáticos.
  • Clasificador de texto – Analizar comentarios, tickets de soporte o reseñas (positivo/negativo, urgente, etc.).
  • Traducción y resumen – Resumir documentos largos o traducir texto manteniendo el contexto.

Ideas Intermedias (Recomendadas – Usando RAG)

  • “Chat with your documents”
    • Chatear con PDFs, manuales, contratos o documentación interna de la empresa.
    • Chat con la documentación técnica de Symfony o Laravel.
    • Búsqueda semántica en catálogos de productos o películas.
  • Búsqueda semántica avanzada – Mejorar el buscador de un sitio web o e-commerce para que entienda el significado de las consultas.
  • Asistente de atención al cliente – Bot que responde basándose en FAQs, manuales y tickets anteriores.
  • Recomendador inteligente – Recomendaciones de productos, películas, libros o cursos usando embeddings.

Ideas Avanzadas (Usando Agents + Tools)

  • Agentes autónomos con AutoPHP
    • Agente que realiza tareas complejas de forma iterativa (búsqueda + procesamiento + generación de informes).
    • “Personal shopper” para e-commerce.
    • Automatización de flujos internos (procesar tickets de soporte, extraer datos de facturas, etc.).
  • Function Calling integrado – Conectar el LLM con APIs, bases de datos o sistemas externos para que pueda realizar acciones reales (consultar stock, reservar citas, enviar emails, etc.).
  • Análisis multimodal – Combinar texto + imágenes (análisis de capturas de pantalla, PDFs escaneados o fotos de productos).

Ideas por Tipo de Proyecto

  • En Laravel o Symfony
    • Asistente IA integrado en el panel de administración.
    • Chatbot para el frontend de un sitio web.
    • Herramienta interna para equipos de desarrollo (explicar código, generar migraciones, etc.).
  • E-commerce
    • Generación automática de descripciones de productos.
    • Chatbot de ventas y recomendaciones personalizadas.
    • Búsqueda semántica en el catálogo completo.
  • Educación y Knowledge Base
    • Plataforma donde los estudiantes chatean con los materiales del curso.
    • Asistente inteligente para documentación técnica.
  • Productividad interna
    • Resumen automático de reuniones o informes largos.
    • Análisis de logs o errores del sistema.
    • Extracción inteligente de información de documentos escaneados.

Consejos para Empezar

  • Comenzar con un RAG simple usando Ollama (modelos locales gratuitos) + Redis o Elasticsearch.
  • Utilizar guardrails para mantener las respuestas seguras en producción.
  • Aprovechar la integración nativa con Laravel y Symfony.
  • Para proyectos más ambiciosos, explora el paquete AutoPHP para agentes autónomos.

Ejemplo de un chat con ficheros pdy y gemini

require_once __DIR__ . '/vendor/autoload.php';

use LLPhant\Chat\GeminiChat;
use LLPhant\Chat\GeminiConfig;
use LLPhant\Embeddings\EmbeddingGenerator\OpenAIEmbeddingGenerator;
use LLPhant\Embeddings\VectorStores\Redis\RedisVectorStore;
use LLPhant\DocumentLoader\FileDataReader;
use LLPhant\DocumentSplitter\DocumentSplitter;
use LLPhant\Query\SemanticSearch\QuestionAnswering;

// ===================== CONFIGURACIÓN =====================

$config = new GeminiConfig();
$config->apiKey = $_ENV['GEMINI_API_KEY'] ?? 'tu-gemini-api-key-aqui';
$config->model = 'gemini-1.5-pro';   // Recomendado para mejor calidad

$chat = new GeminiChat($config);

$embeddingGenerator = new OpenAIEmbeddingGenerator([
    'model' => 'text-embedding-3-small'
]);

$vectorStore = new RedisVectorStore(
    host: '127.0.0.1',
    port: 6379
);

// ===================== 1. CARGAR MÚLTIPLES PDFs =====================

function ingestMultiplePDFs($folderPath, $vectorStore, $embeddingGenerator)
{
    echo "Cargando todos los PDFs de la carpeta: $folderPath\n";

    // ← Aquí está la clave: pasar una carpeta en lugar de un solo archivo
    $loader = new FileDataReader($folderPath);
    $documents = $loader->getDocuments();   // Carga todos los PDFs de la carpeta

    // Dividir en chunks
    $splitter = new DocumentSplitter(chunkSize: 800, chunkOverlap: 100);
    $chunks = $splitter->splitDocuments($documents);

    // Indexar en el vector store
    $vectorStore->addDocuments($embeddingGenerator, $chunks);

    echo "Indexación completada: " . count($chunks) . " chunks de " . count($documents) . " documentos.\n";
}

// === Ejecuta esto UNA SOLA VEZ (o en un comando Artisan) ===
$carpetaPDFs = __DIR__ . '/documentos/';   // ← Crea esta carpeta y pon todos tus PDFs aquí
// ingestMultiplePDFs($carpetaPDFs, $vectorStore, $embeddingGenerator);

// ===================== 2. CHAT CON TODOS LOS PDFs =====================

$qa = new QuestionAnswering(
    vectorStore: $vectorStore,
    embeddingGenerator: $embeddingGenerator,
    chat: $chat
);

$qa->systemMessageTemplate = "
Eres un asistente experto que responde basándose **únicamente** en los documentos PDF cargados.
Responde siempre en español, de forma clara, estructurada y profesional.
Si no tienes suficiente información en los documentos, indícalo con honestidad.

Contexto relevante:
{context}
";

echo "Chat con múltiples PDFs listo. Escribe 'salir' para terminar.\n\n";

while (true) {
    echo "Tu pregunta: ";
    $pregunta = trim(fgets(STDIN));

    if (in_array(strtolower($pregunta), ['salir', 'exit', 'q'])) {
   echo "¡Hasta luego!\n";
   break;
    }

    try {
   $respuesta = $qa->answerQuestion($pregunta);
   echo "\n Respuesta:\n" . $respuesta . "\n\n";
    } catch (Exception $e) {
   echo " Error: " . $e->getMessage() . "\n\n";
    }
}