LLumiverse es una interfaz universal para interactuar con modelos de lenguaje grandes, para el ecosistema Typescript/Javascript. Proporciona una biblioteca modular liviana para interactuar con varios modelos LLM y plataformas de ejecución.
Se centra únicamente en abstraer los LLM y sus plataformas de ejecución, y no proporciona plantillas rápidas, ni RAG, ni cadenas, lo que le permite elegir la mejor herramienta para el trabajo.
Las siguientes plataformas LLM son compatibles con la versión actual:
Proveedor | Terminación | Charlar | Listado de modelos | Multimodal | Sintonia FINA |
---|---|---|---|---|---|
Base de AWS | ✅ | ✅ | ✅ | ✅ | ✅ |
Azure abierto AI | ✅ | ✅ | ✅ | ✅ | ✅ |
IA de vértice de Google | ✅ | ✅ | N / A | ✅ | A petición |
Groq | ✅ | ✅ | ✅ | N / A | N / A |
Puntos finales de inferencia de HuggingFace | ✅ | ✅ | N / A | N / A | N / A |
IBM WatsonX | ✅ | ✅ | ✅ | N / A | A petición |
Mistral AI | ✅ | ✅ | ✅ | N / A | A petición |
AbiertoAI | ✅ | ✅ | ✅ | ✅ | ✅ |
Reproducir exactamente | ✅ | ✅ | ✅ | N / A | ✅ |
Juntos IA | ✅ | ✅ | ✅ | N / A | A petición |
Se pueden agregar fácilmente nuevas capacidades y plataformas creando un nuevo controlador para la plataforma.
@llumiverse/core
y @llumiverse/drivers
npm install @llumiverse/core @llumiverse/drivers
@llumiverse/core
npm install @llumiverse/core
@llumiverse/core
npm install @llumiverse/core
Primero, debe crear una instancia de controlador para la plataforma LLM de destino con la que también desea interactuar. Cada controlador acepta su propio conjunto de parámetros al crear instancias.
import { OpenAIDriver } from "@llumiverse/drivers" ;
// create an instance of the OpenAI driver
const driver = new OpenAIDriver ( {
apiKey : "YOUR_OPENAI_API_KEY"
} ) ;
En este ejemplo, crearemos una instancia del controlador Bedrock utilizando las credenciales del archivo de credenciales compartidas (es decir, ~/.aws/credentials). Obtenga más información sobre cómo configurar las credenciales de AWS en el nodo.
import { BedrockDriver } from "@llumiverse/drivers" ;
const driver = new BedrockDriver ( {
region : 'us-west-2'
} ) ;
Para que el siguiente ejemplo funcione, debe definir una variable de entorno GOOGLE_APPLICATION_CREDENTIALS
.
import { VertexAIDriver } from "@llumiverse/drivers" ;
const driver = new VertexAIDriver ( {
project : 'YOUR_GCLOUD_PROJECT' ,
region : 'us-central1'
} ) ;
import { ReplicateDriver } from "@llumiverse/drivers" ;
const driver = new ReplicateDriver ( {
apiKey : "YOUR_REPLICATE_API_KEY"
} ) ;
import { TogetherAIDriver } from "@llumiverse/drivers" ;
const driver = new TogetherAIDriver ( {
apiKey : "YOUR_TOGETHER_AI_API_KEY"
} ) ;
import { HuggingFaceIEDriver } from "@llumiverse/drivers" ;
const driver = new HuggingFaceIEDriver ( {
apiKey : "YOUR_HUGGINGFACE_API_KEY" ,
endpoint_url : "YOUR_HUGGINGFACE_ENDPOINT" ,
} ) ;
Una vez que haya creado una instancia de un controlador, podrá enumerar los modelos disponibles. Algunos controladores aceptan un argumento para que el método listModel
busque modelos coincidentes. Algunos controladores, como por ejemplo replicate
, enumeran un conjunto de modelos preseleccionados. Para enumerar otros modelos es necesario realizar una búsqueda dando una consulta de texto como argumento.
En el siguiente ejemplo, asumimos que ya hemos creado una instancia de un controlador, que está disponible como variable driver
.
import { AIModel } from "@llumiverse/core" ;
// instantiate the desired driver
const driver = createDriverInstance ( ) ;
// list available models on the target LLM. (some drivers may require a search parameter to discover more models)
const models : AIModel [ ] = await driver . listModels ( ) ;
console . log ( '# Available Models:' ) ;
for ( const model of models ) {
console . log ( ` ${ model . name } [ ${ model . id } ]` ) ;
}
Para ejecutar un mensaje, necesitamos crear un mensaje en formato LLumiverse y pasarlo al método execute
del controlador.
El formato de solicitud es muy similar al formato de solicitud de OpenAI. Es una matriz de mensajes con un content
y una propiedad role
. Los roles pueden ser cualquiera de "user" | "system" | "assistant" | "safety"
.
La función safety
es similar al system
pero tiene mayor prioridad sobre los demás mensajes. Por lo tanto, anulará cualquier mensaje user
o system
que diga algo contrario al mensaje safety
.
Para ejecutar un mensaje, también necesitamos especificar un modelo de destino, dado un ID de modelo conocido por el LLM de destino. También podemos especificar opciones de ejecución como temperature
, max_tokens
, etc.
En el siguiente ejemplo, nuevamente asumimos que ya hemos creado una instancia de un controlador, que está disponible como variable driver
.
Además, asumimos que el ID del modelo al que queremos apuntar está disponible como variable model
. Para obtener una lista de los modelos existentes (y sus ID), puede enumerar el modelo como mostramos en el ejemplo anterior.
A continuación se muestra un ejemplo de ID de modelo según el tipo de controlador:
gpt-3.5-turbo
arn:aws:bedrock:us-west-2::foundation-model/cohere.command-text-v14
text-bison
meta/llama-2-70b-chat:02e509c789964a7ea8736978a43525956ef40397be9033abf9fd2badfe68c9e3
mistralai/Mistral-7B-instruct-v0.1
aws-mistral-7b-instruct-v0-1-015
import { PromptRole , PromptSegment } from "@llumiverse/core" ;
// instantiate the desired driver
const driver = createDriverInstance ( ) ;
const model = "the-model-id" ; // change with your desired model ID
// create the prompt.
const prompt : PromptSegment [ ] = [
{
role : PromptRole . user ,
content : 'Please, write a short story about winter in Paris, in no more than 512 characters.'
}
]
// execute a model and wait for the response
console . log ( `n# Executing prompt on ${ model } model: ${ prompt } ` ) ;
const response = await driver . execute ( prompt , {
model ,
temperature : 0.6 ,
max_tokens : 1024
} ) ;
console . log ( 'n# LLM response:' , response . result )
console . log ( '# Response took' , response . execution_time , 'ms' )
console . log ( '# Token usage:' , response . token_usage ) ;
En este ejemplo, ejecutaremos un mensaje y transmitiremos el resultado para mostrarlo en la consola tal como lo devuelve la plataforma LLM de destino.
Tenga en cuenta que algunos modelos no admiten transmisión. En ese caso, el controlador simulará una transmisión utilizando un único fragmento de texto correspondiente a la respuesta completa.
import { PromptRole , PromptSegment } from "@llumiverse/core" ;
// instantiate the desired driver
const driver = createDriverInstance ( ) ;
const model = "the-model-id" ; // change with your desired model ID
// create the prompt.
const prompt : PromptSegment [ ] = [
{
role : PromptRole . user ,
content : 'Please, write a short story about winter in Paris, in no more than 512 characters.'
}
]
// execute the prompt in streaming mode
console . log ( `n# Executing prompt on model ${ model } in streaming mode: ${ prompt } ` ) ;
const stream = await driver . stream ( prompt , {
model ,
temperature : 0.6 ,
max_tokens : 1024
} ) ;
// print the streaming response as it comes
for await ( const chunk of stream ) {
process . stdout . write ( chunk ) ;
}
// when the response stream is consumed we can get the final response using stream.completion field.
const streamingResponse = stream . completion ! ;
console . log ( 'n# LLM response:' , streamingResponse . result )
console . log ( '# Response took' , streamingResponse . execution_time , 'ms' )
console . log ( '# Token usage:' , streamingResponse . token_usage ) ;
Los controladores LLumiverse exponen un método para generar incrustaciones de vectores para un texto determinado. Los controladores que admiten incrustaciones a partir de v0.10.0 son bedrock
, openai
, vertexai
. Si las incrustaciones aún no son compatibles, el método generateEmbeddings arrojará un error.
A continuación se muestra un ejemplo sobre el uso del controlador vertexai
. Para que el ejemplo funcione, debes definir una variable de entorno GOOGLE_APPLICATION_CREDENTIALS
para poder acceder a tu proyecto de gcloud.
import { VertexAIDriver } from "@llumiverse/drivers" ;
const driver = new VertexAIDriver ( {
project : 'your-project-id' ,
region : 'us-central1' // your zone
} ) ;
const r = await vertex . generateEmbeddings ( { content : "Hello world!" } ) ;
// print the vector
console . log ( 'Embeddings: ' , v . values ) ;
El objeto de resultado contiene el vector como propiedad values
, el model
utilizado para generar las incrustaciones y un token_count
opcional que, si se define, es el recuento de tokens del texto de entrada. Dependiendo del controlador, el resultado puede contener propiedades adicionales.
También puede especificar un modelo específico que se utilizará o pasar otro parámetro admitido por el controlador.
Ejemplo:
import { VertexAIDriver } from "@llumiverse/drivers" ;
const driver = new VertexAIDriver ( {
project : 'your-project-id' ,
region : 'us-central1' // your zone
} ) ;
const r = await vertex . generateEmbeddings ( {
content : "Hello world!" ,
model : "textembedding-gecko@002" ,
task_type : "SEMANTIC_SIMILARITY"
} ) ;
// print the vector
console . log ( 'Embeddings: ' , v . values ) ;
El parámetro task_type
es específico del modelo textembedding-gecko.
¡Las contribuciones son bienvenidas! Consulte CONTRIBUTING.md para obtener más detalles.
Llumivers tiene la licencia Apache 2.0. Siéntase libre de utilizarlo en consecuencia.