LLM.js é a maneira mais rápida de usar modelos de linguagem grande em JavaScript. É uma interface única e simples para centenas de LLMs populares:
gpt-4
, gpt-4-turbo-preview
, gpt-3.5-turbo
gemini-1.5-pro
, gemini-1.0-pro
, gemini-pro-vision
claude-3-opus
, claude-3-sonnet
, claude-3-haiku
, claude-2.1
, claude-instant-1.2
mixtral-8x7b
, llama2-70b
, gemma-7b-it
llama-3-70b
, llama-3-8b
, nous-hermes-2
, ...mistral-medium
, mistral-small
, mistral-tiny
LLaVa-1.5
, TinyLlama-1.1B
, Phi-2
, ...llama-3
, llama-2
, gemma
, dolphin-phi
, ... await LLM ( "the color of the sky is" , { model : "gpt-4" } ) ; // blue
Características
OpenAI
, Google
, Anthropic
, Mistral
, Groq
, Llamafile
, Ollama
, Together
)temperature
, max_tokens
, seed
, ...)llm
para seu shell Instale LLM.js
do NPM:
npm install @themaximalist/llm.js
Configurar LLMs é fácil – apenas certifique-se de que sua chave de API esteja definida em seu ambiente
export OPENAI_API_KEY=...
export ANTHROPIC_API_KEY=...
export MISTRAL_API_KEY=...
export GOOGLE_API_KEY=...
export GROQ_API_KEY=...
export TOGETHER_API_KEY=...
Para modelos locais como llamafile e Ollama, certifique-se de que uma instância esteja em execução.
A maneira mais simples de chamar LLM.js
é como uma async function
.
const LLM = require ( "@themaximalist/llm.js" ) ;
await LLM ( "hello" ) ; // Response: hi
Isso dispara uma solicitação única e não armazena nenhum histórico.
Inicialize uma instância LLM para construir o histórico de mensagens.
const llm = new LLM ( ) ;
await llm . chat ( "what's the color of the sky in hex value?" ) ; // #87CEEB
await llm . chat ( "what about at night time?" ) ; // #222d5a
O streaming proporciona uma melhor experiência ao usuário, retornando resultados imediatamente e é tão simples quanto passar {stream: true}
como uma opção.
const stream = await LLM ( "the color of the sky is" , { stream : true } ) ;
for await ( const message of stream ) {
process . stdout . write ( message ) ;
}
Às vezes é útil lidar com o fluxo em tempo real e também processá-lo quando estiver tudo concluído. Por exemplo, fornecer streaming em tempo real no chat e, em seguida, analisar blocos de código semântico no final.
LLM.js
facilita isso com uma opção stream_handler
opcional.
const colors = await LLM ( "what are the common colors of the sky as a flat json array?" , {
model : "gpt-4-turbo-preview" ,
stream : true ,
stream_handler : ( c ) => process . stdout . write ( c ) ,
parser : LLM . parsers . json ,
} ) ;
// ["blue", "gray", "white", "orange", "red", "pink", "purple", "black"]
Em vez de o stream ser retornado como um gerador, ele é passado para stream_handler
. A resposta do LLM.js
é a resposta completa, que pode ser analisada ou tratada normalmente.
LLM.js
oferece suporte ao esquema JSON para OpenAI e LLaMa. Você pode solicitar JSON com qualquer modelo LLM, mas usar o esquema JSON imporá as saídas.
const schema = {
"type" : "object" ,
"properties" : {
"colors" : { "type" : "array" , "items" : { "type" : "string" } }
}
}
const obj = await LLM ( "what are the 3 primary colors in JSON format?" , { schema , temperature : 0.1 , service : "openai" } ) ;
Diferentes formatos são usados por diferentes modelos (JSON Schema, BNFS), então LLM.js
converte entre eles automaticamente.
Observe que o esquema JSON ainda pode produzir JSON inválido, como quando excede max_tokens
.
Crie agentes especializados em tarefas específicas usando llm.system(input)
.
const llm = new LLM ( ) ;
llm . system ( "You are a friendly chat bot." ) ;
await llm . chat ( "what's the color of the sky in hex value?" ) ; // Response: sky blue
await llm . chat ( "what about at night time?" ) ; // Response: darker value (uses previous context to know we're asking for a color)
Observe que a OpenAI sugeriu que os prompts do sistema podem não ser tão eficazes quanto os prompts do usuário, que LLM.js
suporta com llm.user(input)
.
LLM.js
suporta prompts de string simples, mas também histórico completo de mensagens. Isto é especialmente útil para orientar os LLMs de uma forma mais precisa.
await LLM ( [
{ role : "user" , content : "remember the secret codeword is blue" } ,
{ role : "assistant" , content : "OK I will remember" } ,
{ role : "user" , content : "what is the secret codeword I just told you?" } ,
] ) ; // Response: blue
O formato de mensagem OpenAI é usado e convertido dinamicamente para serviços específicos que usam um formato diferente (como Google, Mixtral e LLaMa).
LLM.js
oferece suporte aos modelos de linguagem grande mais populares, incluindo
gpt-4
, gpt-4-turbo-preview
, gpt-3.5-turbo
gemini-1.0-pro
, gemini-1.5-pro
, gemini-pro-vision
claude-3-sonnet
, claude-3-haiku
, claude-2.1
, claude-instant-1.2
mixtral-8x7b
, llama2-70b
, gemma-7b-it
llama-3-70b
, llama-3-8b
, nous-hermes-2
, ...mistral-medium
, mistral-small
, mistral-tiny
LLaVa 1.5
, Mistral-7B-Instruct
, Mixtral-8x7B-Instruct
, WizardCoder-Python-34B
, TinyLlama-1.1B
, Phi-2
, ...Llama 2
, Mistral
, Code Llama
, Gemma
, Dolphin Phi
, ... LLM.js
pode adivinhar o provedor LLM com base no modelo ou você pode especificá-lo explicitamente.
// defaults to Llamafile
await LLM ( "the color of the sky is" ) ;
// OpenAI
await LLM ( "the color of the sky is" , { model : "gpt-4-turbo-preview" } ) ;
// Anthropic
await LLM ( "the color of the sky is" , { model : "claude-2.1" } ) ;
// Mistral AI
await LLM ( "the color of the sky is" , { model : "mistral-tiny" } ) ;
// Groq needs an specific service
await LLM ( "the color of the sky is" , { service : "groq" , model : "mixtral-8x7b-32768" } ) ;
// Google
await LLM ( "the color of the sky is" , { model : "gemini-pro" } ) ;
// Ollama
await LLM ( "the color of the sky is" , { model : "llama2:7b" } ) ;
// Together
await LLM ( "the color of the sky is" , { service : "together" , model : "meta-llama/Llama-3-70b-chat-hf" } ) ;
// Can optionally set service to be specific
await LLM ( "the color of the sky is" , { service : "openai" , model : "gpt-3.5-turbo" } ) ;
Ser capaz de alternar rapidamente entre LLMs evita que você fique preso.
LLM.js
vem com alguns analisadores úteis que funcionam com todos os LLM. Eles são separados da formatação JSON típica com tool
e schema
que alguns LLMs (como o OpenAI) suportam.
Análise JSON
const colors = await LLM ( "Please return the primary colors in a JSON array" , {
parser : LLM . parsers . json
} ) ;
// ["red", "green", "blue"]
Análise de bloco de código Markdown
const story = await LLM ( "Please return a story wrapped in a Markdown story code block" , {
parser : LLM . parsers . codeBlock ( "story" )
} ) ;
// A long time ago...
Análise XML
const code = await LLM ( "Please write a simple website, and put the code inside of a <WEBSITE></WEBSITE> xml tag" {
parser : LLM . parsers . xml ( "WEBSITE" )
} ) ;
// <html>....
Nota: OpenAI funciona melhor com Markdown e JSON, enquanto Anthropic funciona melhor com tags XML.
A API LLM.js
fornece uma interface simples para dezenas de grandes modelos de linguagem.
new LLM ( input , { // Input can be string or message history array
service : "openai" , // LLM service provider
model : "gpt-4" , // Specific model
max_tokens : 100 , // Maximum response length
temperature : 1.0 , // "Creativity" of model
seed : 1000 , // Stable starting point
stream : false , // Respond in real-time
stream_handler : null , // Optional function to handle stream
schema : { ... } , // JSON Schema
tool : { ... } , // Tool selection
parser : null , // Content parser
} ) ;
A mesma API é suportada na interface abreviada do LLM.js
- chamando-a como uma função:
await LLM ( input , options ) ;
Entrada (obrigatório)
input
<string>
ou Array
: Solicita LLM. Pode ser uma sequência de texto ou uma matriz de objetos no formato Message History
.Opções
Todos os parâmetros de configuração são opcionais. Algumas opções de configuração estão disponíveis apenas em determinados modelos e são especificadas abaixo.
service
<string>
: serviço LLM a ser usado. O padrão é llamafile
.model
<string>
: LLM explícito a ser usado. O padrão é o modelo padrão service
.max_tokens
<int>
: Comprimento máximo da resposta do token. Sem padrão.temperature
<float>
: "Criatividade" de um modelo. 0
normalmente fornece resultados mais determinísticos, e valores mais altos 1
e acima fornecem resultados menos determinísticos. Sem padrão.seed
<int>
: Obtenha resultados mais determinísticos. Sem padrão. Suportado por openai
, llamafile
e mistral
.stream
<bool>
: retorna os resultados imediatamente em vez de esperar pela resposta completa. O padrão é false
.stream_handler
<function>
: Função opcional que é chamada quando um stream recebe novo conteúdo. A função recebe o pedaço de string.schema
<object>
: objeto de esquema JSON para direcionar o LLM para gerar JSON. Sem padrão. Suportado por openai
e llamafile
.tool
<object>
: Instrua o LLM a usar uma ferramenta, útil para esquema JSON mais explícito e construção de aplicativos dinâmicos. Sem padrão. Apoiado por openai
.parser
<function>
: Manipula a formatação e a estrutura do conteúdo retornado. Sem padrão.messages
<array>
: array de histórico de mensagens, gerenciado por LLM.js
—mas pode ser referenciado e alterado.options
<object>
: Configuração de opções que foi definida na inicialização, mas pode ser modificada dinamicamente.async send(options=<object>)
Envia o Message History
atual para o LLM
atual com options
especificadas. Estas opções locais substituirão as opções padrão globais.
A resposta será adicionada automaticamente ao Message History
.
await llm . send ( options ) ;
async chat(input=<string>, options=<object>)
Adiciona a input
ao Message History
atual e send
chamadas com as options
de substituição atuais.
Retorna a resposta diretamente ao usuário, enquanto atualiza Message History
.
const response = await llm . chat ( "hello" ) ;
console . log ( response ) ; // hi
abort()
Anula um fluxo em andamento. Lança um AbortError
.
user(input=<string>)
Adiciona uma mensagem do user
ao Message History
.
llm . user ( "My favorite color is blue. Remember that" ) ;
system(input=<string>)
Adiciona uma mensagem do system
ao Message History
. Esta é normalmente a primeira mensagem.
llm . system ( "You are a friendly AI chat bot..." ) ;
assistant(input=<string>)
Adiciona uma mensagem do assistant
ao Message History
. Normalmente, isso é uma resposta da IA ou uma forma de orientar uma resposta futura.
llm . user ( "My favorite color is blue. Remember that" ) ;
llm . assistant ( "OK, I will remember your favorite color is blue." ) ;
LLAMAFILE
<string>
: llamafile
OPENAI
<string>
: openai
ANTHROPIC
<string>
: anthropic
MISTRAL
<string>
: mistral
GOOGLE
<string>
: google
MODELDEPLOYER
<string>
: modeldeployer
OLLAMA
<string>
: ollama
TOGETHER
<string>
: together
parsers
<object>
: lista de analisadores LLM.js
padrão<blockType>
)( <content>
) <function>
— analisa um bloco de código Markdown<content>
) <function>
— analisa JSON geral ou um bloco de código JSON Markdown<tag>
)( <content>
) <function>
— analisa a tag XML do conteúdo da respostaserviceForModel(model)
Retorne o service
LLM para um modelo específico.
LLM . serviceForModel ( "gpt-4-turbo-preview" ) ; // openai
modelForService(service)
Retorne o LLM padrão para um service
.
LLM . modelForService ( "openai" ) ; // gpt-4-turbo-preview
LLM . modelForService ( LLM . OPENAI ) ; // gpt-4-turbo-preview
Resposta
LLM.js
retorna resultados de llm.send()
e llm.chat()
, normalmente o conteúdo da string do LLM que completa seu prompt.
await LLM ( "hello" ) ; // "hi"
Mas quando você usa schema
e tools
– LLM.js
normalmente retornará um objeto JSON.
const tool = {
"name" : "generate_primary_colors" ,
"description" : "Generates the primary colors" ,
"parameters" : {
"type" : "object" ,
"properties" : {
"colors" : {
"type" : "array" ,
"items" : { "type" : "string" }
}
} ,
"required" : [ "colors" ]
}
} ;
await LLM ( "what are the 3 primary colors in physics?" ) ;
// { colors: ["red", "green", "blue"] }
await LLM ( "what are the 3 primary colors in painting?" ) ;
// { colors: ["red", "yellow", "blue"] }
E passando {stream: true}
em options
, LLM.js
retornará um gerador e começará a produzir resultados imediatamente.
const stream = await LLM ( "Once upon a time" , { stream : true } ) ;
for await ( const message of stream ) {
process . stdout . write ( message ) ;
}
A resposta é baseada no que você pede ao LLM, e LLM.js
sempre tenta fazer a coisa obviamente certa.
A API Message History
em LLM.js
é exatamente igual ao formato de histórico de mensagens OpenAI.
await LLM ( [
{ role : "user" , content : "remember the secret codeword is blue" } ,
{ role : "assistant" , content : "OK I will remember" } ,
{ role : "user" , content : "what is the secret codeword I just told you?" } ,
] ) ; // Response: blue
Opções
role
<string>
: Quem está dizendo o content
? user
, system
ou assistant
content
<string>
: Conteúdo de texto da mensagem LLM.js
fornece um comando llm
útil para seu shell. llm
é uma maneira conveniente de chamar dezenas de LLMs e acessar todo o poder do LLM.js
sem programação.
Acesse-o globalmente instalando a partir do NPM
npm install @themaximalist/llm.js -g
Então você pode chamar o comando llm
de qualquer lugar do seu terminal.
> llm the color of the sky is
blue
As mensagens são transmitidas em tempo real, então tudo é muito rápido.
Você também pode iniciar um --chat
para lembrar o histórico de mensagens e continuar sua conversa ( Ctrl-C
para sair).
> llm remember the codeword is blue. say ok if you understand --chat
OK, I understand.
> what is the codeword ?
The codeword is blue.
Ou altere facilmente o LLM rapidamente:
> llm the color of the sky is --model claude-v2
blue
Veja ajuda com llm --help
Usage: llm [options] [input]
Large Language Model library for OpenAI, Google, Anthropic, Mistral, Groq and LLaMa
Arguments:
input Input to send to LLM service
Options:
-V, --version output the version number
-m, --model < model > Completion Model (default: llamafile)
-s, --system < prompt > System prompt (default: " I am a friendly accurate English speaking chat bot " ) (default: " I am a friendly accurate English speaking chat bot " )
-t, --temperature < number > Model temperature (default 0.8) (default: 0.8)
-c, --chat Chat Mode
-h, --help display help for command
LLM.js
e llm
usam o módulo debug
npm com o namespace llm.js
Visualize os logs de depuração definindo a variável de ambiente DEBUG
.
> DEBUG=llm.js * llm the color of the sky is
# debug logs
blue
> export DEBUG=llm.js *
> llm the color of the sky is
# debug logs
blue
LLM.js
possui muitos testes que podem servir de guia para ver como é usado.
Usar LLMs na produção pode ser complicado devido ao rastreamento do histórico, limitação de taxas, gerenciamento de chaves de API e descoberta de como cobrar.
Model Deployer é uma API na frente do LLM.js
— que lida com todos esses detalhes e muito mais.
Usá-lo é simples, especifique modeldeployer
como o serviço e sua chave de API do Model Deployer como model
.
await LLM ( "hello world" , { service : "modeldeployer" , model : "api-key" } ) ;
Você também pode definir configurações específicas e, opcionalmente, substituir algumas no cliente.
await LLM ( "the color of the sky is usually" , {
service : "modeldeployer" ,
model : "api-key" ,
endpoint : "https://example.com/api/v1/chat" ,
max_tokens : 1 ,
temperature : 0
} ) ;
LLM.js
pode ser usado sem o Model Deployer, mas se você estiver implantando LLMs na produção, é uma ótima maneira de gerenciá-los.
LLM.js
está em forte desenvolvimento, enquanto os LLMs estão mudando rapidamente. Começamos a estabelecer uma interface estável e documentaremos as alterações aqui.
v0.6.6
— Adicionado suporte ao navegadorv0.6.5
— Adicionado Lhama 3 e Juntosv0.6.4
— Adicionados Groq e abort()v0.6.3
— Adicionados analisadores JSON/XML/Markdown e um manipulador de streamv0.6.2
— Corrigir bug com streaming do Googlev0.6.1
— Corrigido bug para não adicionar respostas vaziasv0.6.0
— Adicionado Antrópico Claude 3v0.5.9
— Adicionado Ollamav0.5.4
— Adicionado Google Geminiv0.5.3
— Adicionado Mistralv0.5.0
— Site criadov0.4.7
— Ferramentas OpenAI, fluxo JSONv0.3.5
— Adicionado ModelDeployerv0.3.2
— Adicionado Llamafilev0.2.5
— Adicionado Antrópico, CLIv0.2.4
— Opções de bate-papov0.2.2
— Interface unificada LLM(), streamingv0.1.2
— Documentos, prompt do sistemav0.0.1
— Criado LLM.js com suporte OpenAI LLM.js
é usado atualmente nos seguintes projetos:
MIT
Criado por The Maximalist, veja nossos projetos de código aberto.