LLumiverse est une interface universelle d'interaction avec les grands modèles de langage, pour l'écosystème Typescript/Javascript. Il fournit une bibliothèque modulaire légère pour interagir avec divers modèles LLM et plates-formes d'exécution.
Il se concentre uniquement sur l'abstraction des LLM et de leurs plates-formes d'exécution, et ne fournit pas de modèles d'invite, ni de RAG, ni de chaînes, vous permettant de choisir le meilleur outil pour le travail.
Les plates-formes LLM suivantes sont prises en charge dans la version actuelle :
Fournisseur | Achèvement | Chat | Liste des modèles | Multimodal | Réglage fin |
---|---|---|---|---|---|
Socle AWS | ✅ | ✅ | ✅ | ✅ | ✅ |
Azure OpenAI | ✅ | ✅ | ✅ | ✅ | ✅ |
Google Vertex AI | ✅ | ✅ | N / A | ✅ | Sur demande |
Groq | ✅ | ✅ | ✅ | N / A | N / A |
Points de terminaison d’inférence HuggingFace | ✅ | ✅ | N / A | N / A | N / A |
IBM WatsonX | ✅ | ✅ | ✅ | N / A | Sur demande |
Mistral IA | ✅ | ✅ | ✅ | N / A | Sur demande |
OpenAI | ✅ | ✅ | ✅ | ✅ | ✅ |
Reproduire | ✅ | ✅ | ✅ | N / A | ✅ |
Ensemble IA | ✅ | ✅ | ✅ | N / A | Sur demande |
De nouvelles fonctionnalités et plates-formes peuvent facilement être ajoutées en créant un nouveau pilote pour la plate-forme.
@llumiverse/core
et @llumiverse/drivers
npm install @llumiverse/core @llumiverse/drivers
@llumiverse/core
npm install @llumiverse/core
@llumiverse/core
npm install @llumiverse/core
Tout d’abord, vous devez instancier une instance de pilote pour la plate-forme LLM cible avec laquelle vous souhaitez également interagir. Chaque pilote accepte son propre ensemble de paramètres lors de l'instanciation.
import { OpenAIDriver } from "@llumiverse/drivers" ;
// create an instance of the OpenAI driver
const driver = new OpenAIDriver ( {
apiKey : "YOUR_OPENAI_API_KEY"
} ) ;
Dans cet exemple, nous allons instancier le pilote Bedrock à l'aide des informations d'identification du fichier d'informations d'identification partagées (c'est-à-dire ~/.aws/credentials). Apprenez-en davantage sur la configuration des informations d'identification AWS dans le nœud.
import { BedrockDriver } from "@llumiverse/drivers" ;
const driver = new BedrockDriver ( {
region : 'us-west-2'
} ) ;
Pour que l'exemple suivant fonctionne, vous devez définir une variable d'environnement 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" ,
} ) ;
Une fois que vous avez instancié un pilote, vous pouvez lister les modèles disponibles. Certains pilotes acceptent un argument pour que la méthode listModel
recherche les modèles correspondants. Certains pilotes, comme par exemple replicate
répertorient un ensemble présélectionné de modèles. Pour lister d'autres modèles, vous devez effectuer une recherche en donnant une requête textuelle comme argument.
Dans l'exemple suivant, nous supposons que nous avons déjà instancié un pilote, qui est disponible en tant que 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 } ]` ) ;
}
Pour exécuter une invite, nous devons créer une invite au format LLumiverse et la transmettre à la méthode execute
du pilote.
Le format d'invite est très similaire au format d'invite OpenAI. Il s'agit d'un tableau de messages avec un content
et une propriété role
. Les rôles peuvent être n'importe lesquels "user" | "system" | "assistant" | "safety"
.
Le rôle safety
est similaire à system
mais a une plus grande priorité sur les autres messages. Ainsi, il annulera tout message user
ou system
disant quelque chose de contraire au message safety
.
Afin d'exécuter une invite, nous devons également spécifier un modèle cible, étant donné un ID de modèle connu par le LLM cible. Nous pouvons également spécifier des options d'exécution comme temperature
, max_tokens
etc.
Dans l'exemple suivant, nous supposons à nouveau que nous avons déjà instancié un pilote, qui est disponible en tant que variable driver
.
De plus, nous supposons que l'ID de modèle que nous souhaitons cibler est disponible en tant que variable model
. Pour obtenir une liste des modèles existants (et leurs identifiants), vous pouvez lister le modèle comme nous l'avons montré dans l'exemple précédent
Voici un exemple d'ID de modèle en fonction du type de pilote :
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 ) ;
Dans cet exemple, nous exécuterons une invite et diffuserons le résultat pour l'afficher sur la console tel qu'il est renvoyé par la plateforme LLM cible.
Notez que certains modèles ne prennent pas en charge le streaming. Dans ce cas, le pilote simulera un streaming en utilisant un seul morceau de texte correspondant à l'intégralité de la réponse.
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 ) ;
Les pilotes LLumiverse exposent une méthode pour générer des intégrations vectorielles pour un texte donné. Les pilotes prenant en charge les intégrations à partir de la v0.10.0 sont bedrock
, openai
, vertexai
. Si les intégrations ne sont pas encore prises en charge, la méthode generateEmbeddings générera une erreur.
Voici un exemple d'utilisation du pilote vertexai
. Pour que l'exemple fonctionne, vous devez définir une variable d'environnement GOOGLE_APPLICATION_CREDENTIALS
pour pouvoir accéder à votre projet 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 ) ;
L'objet résultat contient le vecteur comme propriété values
, le model
utilisé pour générer les intégrations et un token_count
facultatif qui, s'il est défini, est le nombre de jetons du texte d'entrée. Selon le pilote, le résultat peut contenir des propriétés supplémentaires.
Vous pouvez également spécifier un modèle spécifique à utiliser ou transmettre un autre paramètre pris en charge par le pilote.
Exemple:
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 ) ;
Le paramètre task_type
est spécifique au modèle textembedding-gecko.
Les contributions sont les bienvenues ! Veuillez consulter CONTRIBUTING.md pour plus de détails.
Llumivers est sous licence Apache License 2.0. N'hésitez pas à l'utiliser en conséquence.