LLumiverse é uma interface universal para interação com Large Language Models, para o ecossistema Typescript/Javascript. Ele fornece uma biblioteca modular leve para interagir com vários modelos LLM e plataformas de execução.
Ele se concentra apenas na abstração de LLMs e suas plataformas de execução e não fornece modelos imediatos, ou RAG, ou cadeias, permitindo que você escolha a melhor ferramenta para o trabalho.
As seguintes plataformas LLM são suportadas na versão atual:
Provedor | Conclusão | Bater papo | Listagem de modelos | Multimodal | Afinação |
---|---|---|---|---|---|
Base da AWS | ✅ | ✅ | ✅ | ✅ | ✅ |
Azure OpenAI | ✅ | ✅ | ✅ | ✅ | ✅ |
Google Vertex AI | ✅ | ✅ | N / D | ✅ | Por solicitação |
Groq | ✅ | ✅ | ✅ | N / D | N / D |
Pontos finais de inferência HuggingFace | ✅ | ✅ | N / D | N / D | N / D |
IBM WatsonX | ✅ | ✅ | ✅ | N / D | Por solicitação |
IA Mistral | ✅ | ✅ | ✅ | N / D | Por solicitação |
OpenAI | ✅ | ✅ | ✅ | ✅ | ✅ |
Replicar | ✅ | ✅ | ✅ | N / D | ✅ |
Juntos IA | ✅ | ✅ | ✅ | N / D | Por solicitação |
Novos recursos e plataformas podem ser facilmente adicionados criando um novo driver para a plataforma.
@llumiverse/core
e @llumiverse/drivers
npm install @llumiverse/core @llumiverse/drivers
@llumiverse/core
npm install @llumiverse/core
@llumiverse/core
npm install @llumiverse/core
Primeiro, você precisa instanciar uma instância de driver para a plataforma LLM de destino com a qual deseja interagir também. Cada driver aceita seu próprio conjunto de parâmetros ao instanciar.
import { OpenAIDriver } from "@llumiverse/drivers" ;
// create an instance of the OpenAI driver
const driver = new OpenAIDriver ( {
apiKey : "YOUR_OPENAI_API_KEY"
} ) ;
Neste exemplo, instanciaremos o driver Bedrock usando credenciais do arquivo de credenciais compartilhadas (ou seja, ~/.aws/credentials). Saiba mais sobre como configurar credenciais da AWS em node.
import { BedrockDriver } from "@llumiverse/drivers" ;
const driver = new BedrockDriver ( {
region : 'us-west-2'
} ) ;
Para que o exemplo a seguir funcione, você precisa definir uma variável de ambiente 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" ,
} ) ;
Depois de instanciar um driver, você poderá listar os modelos disponíveis. Alguns drivers aceitam um argumento para o método listModel
procurar modelos correspondentes. Alguns drivers, como por exemplo replicate
, listam um conjunto pré-selecionado de modelos. Para listar outros modelos você precisa realizar uma pesquisa fornecendo uma consulta de texto como argumento.
No exemplo a seguir, estamos assumindo que já instanciamos um driver, que está disponível como variável 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 executar um prompt precisamos criar um prompt no formato LLumiverse e passá-lo para o método execute
do driver.
O formato do prompt é muito semelhante ao formato do prompt OpenAI. É uma matriz de mensagens com um content
e uma propriedade role
. As funções podem ser qualquer uma de "user" | "system" | "assistant" | "safety"
.
A função safety
é semelhante à system
, mas tem maior precedência sobre as outras mensagens. Assim, ele substituirá qualquer mensagem user
ou system
que diga algo contrário à mensagem safety
.
Para executar um prompt, também precisamos especificar um modelo de destino, dado um ID de modelo que é conhecido pelo LLM de destino. Também podemos especificar opções de execução como temperature
, max_tokens
etc.
No exemplo a seguir, estamos assumindo novamente que já instanciamos um driver, que está disponível como variável driver
.
Além disso, estamos assumindo que o ID do modelo que queremos atingir está disponível como a variável model
. Para obter uma lista dos modelos existentes (e seus IDs), você pode listar o modelo conforme mostrado no exemplo anterior
Aqui está um exemplo de IDs de modelo dependendo do tipo de driver:
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 ) ;
Neste exemplo, executaremos um prompt e transmitiremos o resultado para exibi-lo no console conforme for retornado pela plataforma LLM de destino.
Observe que alguns modelos não suportam streaming. Nesse caso, o driver simulará um streaming usando um único pedaço de texto correspondente à resposta inteira.
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 ) ;
Os drivers LLumiverse expõem um método para gerar embeddings vetoriais para um determinado texto. Os drivers que suportam embeddings a partir da v0.10.0 são bedrock
, openai
, vertexai
. Se os embeddings ainda não forem suportados, o método generateEmbeddings gerará um erro.
Aqui está um exemplo de uso do driver vertexai
. Para que o exemplo funcione você precisa definir uma variável env GOOGLE_APPLICATION_CREDENTIALS
para poder acessar seu projeto 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 ) ;
O objeto de resultado contém o vetor como propriedade values
, o model
usado para gerar os embeddings e um token_count
opcional que, se definido, é a contagem de tokens do texto de entrada. Dependendo do driver, o resultado pode conter propriedades adicionais.
Além disso, você pode especificar um modelo específico a ser usado ou passar outro parâmetro suportado pelo driver.
Exemplo:
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 ) ;
O parâmetro task_type
é específico para o modelo textembedding-gecko.
Contribuições são bem-vindas! Consulte CONTRIBUTING.md para obter mais detalhes.
Llumivers é licenciado sob a Licença Apache 2.0. Sinta-se à vontade para usá-lo adequadamente.