LLM.js เป็นวิธีที่เร็วที่สุดในการใช้โมเดลภาษาขนาดใหญ่ใน JavaScript มันเป็นอินเทอร์เฟซที่เรียบง่ายเพียงอินเทอร์เฟซเดียวสำหรับ LLM ยอดนิยมหลายร้อยรายการ:
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
คุณสมบัติ
OpenAI
, Google
, Anthropic
, Mistral
, Groq
, Llamafile
, Ollama
, Together
)temperature
, max_tokens
, seed
, ...)llm
สำหรับเชลล์ของคุณ ติดตั้ง LLM.js
จาก NPM:
npm install @themaximalist/llm.js
การตั้งค่า LLM เป็นเรื่องง่าย เพียงตรวจสอบให้แน่ใจว่าคีย์ API ของคุณได้รับการตั้งค่าในสภาพแวดล้อมของคุณ
export OPENAI_API_KEY=...
export ANTHROPIC_API_KEY=...
export MISTRAL_API_KEY=...
export GOOGLE_API_KEY=...
export GROQ_API_KEY=...
export TOGETHER_API_KEY=...
สำหรับโมเดลในเครื่อง เช่น llamafile และ Ollama ตรวจสอบให้แน่ใจว่าอินสแตนซ์กำลังทำงานอยู่
วิธีที่ง่ายที่สุดในการเรียก LLM.js
คือการใช้ async function
const LLM = require ( "@themaximalist/llm.js" ) ;
await LLM ( "hello" ) ; // Response: hi
นี่เป็นการส่งคำขอแบบครั้งเดียวและจะไม่เก็บประวัติใดๆ
เริ่มต้นอินสแตนซ์ LLM เพื่อสร้างประวัติข้อความ
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
การสตรีมมอบประสบการณ์ผู้ใช้ที่ดีขึ้นโดยการส่งคืนผลลัพธ์ทันที และทำได้ง่ายเพียงแค่ส่ง {stream: true}
เป็นตัวเลือก
const stream = await LLM ( "the color of the sky is" , { stream : true } ) ;
for await ( const message of stream ) {
process . stdout . write ( message ) ;
}
บางครั้งการจัดการสตรีมแบบเรียลไทม์และประมวลผลเมื่อเสร็จสิ้นทั้งหมดก็มีประโยชน์ ตัวอย่างเช่น จัดให้มีการสตรีมแบบเรียลไทม์ในการแชท จากนั้นแยกวิเคราะห์บล็อกโค้ดความหมายในตอนท้าย
LLM.js
ทำให้สิ่งนี้เป็นเรื่องง่ายด้วยตัวเลือก stream_handler
ซึ่งเป็นตัวเลือกเสริม
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"]
แทนที่จะให้สตรีมส่งคืนเป็นตัวสร้าง สตรีมจะถูกส่งผ่านไปยัง stream_handler
การตอบสนองจาก LLM.js
เป็นการตอบกลับทั้งหมด ซึ่งสามารถแยกวิเคราะห์หรือจัดการได้ตามปกติ
LLM.js
รองรับสคีมา JSON สำหรับ OpenAI และ LLaMa คุณสามารถขอ JSON ด้วยโมเดล LLM ใดก็ได้ แต่การใช้ JSON Schema จะบังคับใช้เอาต์พุต
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" } ) ;
โมเดลต่างๆ จะใช้รูปแบบที่แตกต่างกัน (JSON Schema, BNFS) ดังนั้น LLM.js
จะแปลงระหว่างรูปแบบเหล่านี้โดยอัตโนมัติ
หมายเหตุ JSON Schema ยังคงสามารถสร้าง JSON ที่ไม่ถูกต้องได้เหมือนกับเมื่อเกิน max_tokens
สร้างตัวแทนที่เชี่ยวชาญในงานเฉพาะโดยใช้ 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)
หมายเหตุ OpenAI ได้แนะนำระบบพร้อมท์อาจไม่มีประสิทธิภาพเท่ากับพร้อมท์ผู้ใช้ ซึ่ง LLM.js
รองรับ llm.user(input)
LLM.js
รองรับข้อความแจ้งแบบสตริงธรรมดา แต่ยังมีประวัติข้อความแบบเต็มด้วย สิ่งนี้มีประโยชน์อย่างยิ่งในการแนะนำ LLM ในวิธีที่แม่นยำยิ่งขึ้น
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
มีการใช้รูปแบบข้อความ OpenAI และแปลงได้ทันทีสำหรับบริการเฉพาะที่ใช้รูปแบบอื่น (เช่น Google, Mixtral และ LLaMa)
LLM.js
รองรับโมเดล Lanuage ขนาดใหญ่ที่ได้รับความนิยมส่วนใหญ่ ซึ่งรวมถึง
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
สามารถเดาผู้ให้บริการ LLM ตามโมเดล หรือคุณสามารถระบุอย่างชัดเจนก็ได้
// 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" } ) ;
ความสามารถในการสลับระหว่าง LLM อย่างรวดเร็วช่วยป้องกันไม่ให้คุณถูกล็อค
LLM.js
มาพร้อมกับ parsers ที่มีประโยชน์สองสามตัว ซึ่งใช้ได้กับ LLM ทุกตัว สิ่งเหล่านี้แยกจากการจัดรูปแบบ JSON ทั่วไปด้วย tool
และ schema
ที่ LLM บางตัว (เช่นจาก OpenAI) รองรับ
การแยกวิเคราะห์ JSON
const colors = await LLM ( "Please return the primary colors in a JSON array" , {
parser : LLM . parsers . json
} ) ;
// ["red", "green", "blue"]
การแยกวิเคราะห์บล็อกรหัส 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...
การแยกวิเคราะห์ 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>....
หมายเหตุ: OpenAI ทำงานได้ดีที่สุดกับ Markdown และ JSON ในขณะที่ Anthropic ทำงานได้ดีที่สุดกับแท็ก XML
LLM.js
API มอบอินเทอร์เฟซที่เรียบง่ายให้กับโมเดลภาษาขนาดใหญ่จำนวนมาก
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
} ) ;
API เดียวกันได้รับการสนับสนุนในอินเทอร์เฟซแบบสั้นของ LLM.js
ซึ่งเรียกว่าเป็นฟังก์ชัน:
await LLM ( input , options ) ;
อินพุต (จำเป็น)
input
<string>
หรือ Array
: พร้อมท์สำหรับ LLM อาจเป็นสตริงข้อความหรืออาร์เรย์ของออบเจ็กต์ในรูป Message History
ตัวเลือก
พารามิเตอร์การกำหนดค่าทั้งหมดเป็นทางเลือก ตัวเลือกการกำหนดค่าบางอย่างมีเฉพาะในบางรุ่นเท่านั้น และระบุไว้ด้านล่าง
service
<string>
: บริการ LLM ที่จะใช้ ค่าเริ่มต้นคือ llamafile
model
<string>
: LLM ที่ชัดเจนที่จะใช้ ค่าเริ่มต้นเป็นรูปแบบเริ่มต้น service
max_tokens
<int>
: ความยาวการตอบสนองโทเค็นสูงสุด ไม่มีค่าเริ่มต้นtemperature
<float>
: "ความคิดสร้างสรรค์" ของแบบจำลอง โดยทั่วไปแล้ว 0
จะให้ผลลัพธ์ที่กำหนดได้มากกว่า และค่าที่สูงกว่า 1
ขึ้นไปจะให้ผลลัพธ์ที่กำหนดน้อยกว่า ไม่มีค่าเริ่มต้นseed
<int>
: รับผลลัพธ์ที่กำหนดได้มากขึ้น ไม่มีค่าเริ่มต้น สนับสนุนโดย openai
, llamafile
และ mistral
stream
<bool>
: ส่งคืนผลลัพธ์ทันทีแทนที่จะรอการตอบกลับแบบเต็ม ค่าเริ่มต้นเป็น false
stream_handler
<function>
: ฟังก์ชั่นเสริมที่ถูกเรียกเมื่อสตรีมได้รับเนื้อหาใหม่ ฟังก์ชั่นถูกส่งผ่านกลุ่มสตริงschema
<object>
: วัตถุ JSON Schema สำหรับการควบคุม LLM เพื่อสร้าง JSON ไม่มีค่าเริ่มต้น สนับสนุนโดย openai
และ llamafile
tool
<object>
: สั่งให้ LLM ใช้เครื่องมือ ซึ่งมีประโยชน์สำหรับ JSON Schema ที่ชัดเจนยิ่งขึ้นและการสร้างแอปแบบไดนามิก ไม่มีค่าเริ่มต้น สนับสนุนโดย openai
parser
<function>
: จัดการการจัดรูปแบบและโครงสร้างของเนื้อหาที่ส่งคืน ไม่มีค่าเริ่มต้นmessages
<array>
: อาร์เรย์ของประวัติข้อความ จัดการโดย LLM.js
—แต่สามารถอ้างอิงและเปลี่ยนแปลงได้options
<object>
: การกำหนดค่าตัวเลือกที่ตั้งค่าไว้เมื่อเริ่มต้น แต่สามารถแก้ไขได้แบบไดนามิกasync send(options=<object>)
ส่ง Message History
ปัจจุบันไปยัง LLM
ปัจจุบันพร้อม options
ที่ระบุ ตัวเลือกภายในเครื่องเหล่านี้จะแทนที่ตัวเลือกเริ่มต้นส่วนกลาง
การตอบกลับจะถูกเพิ่มลงใน Message History
โดยอัตโนมัติ
await llm . send ( options ) ;
async chat(input=<string>, options=<object>)
เพิ่ม input
ใน Message History
ปัจจุบันและ send
สายด้วย options
แทนที่ปัจจุบัน
ส่งคืนการตอบกลับไปยังผู้ใช้โดยตรง ขณะอัปเดต Message History
const response = await llm . chat ( "hello" ) ;
console . log ( response ) ; // hi
abort()
ยกเลิกการสตรีมที่กำลังดำเนินอยู่ พ่น AbortError
user(input=<string>)
เพิ่มข้อความจาก user
ไปที่ Message History
llm . user ( "My favorite color is blue. Remember that" ) ;
system(input=<string>)
เพิ่มข้อความจาก system
ไปที่ Message History
โดยปกติจะเป็นข้อความแรก
llm . system ( "You are a friendly AI chat bot..." ) ;
assistant(input=<string>)
เพิ่มข้อความจาก assistant
ลงใน Message History
โดยทั่วไปนี่คือการตอบสนองจาก AI หรือวิธีการคัดท้ายการตอบสนองในอนาคต
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>
: รายการตัวแยกวิเคราะห์ LLM.js
เริ่มต้น<blockType>
)( <content>
) <function>
— แยกวิเคราะห์ codeblock Markdown<content>
) <function>
— แยกวิเคราะห์ JSON โดยรวมหรือ codeblock ของ Markdown JSON<tag>
)( <content>
) <function>
— แยกแท็ก XML ออกจากเนื้อหาการตอบสนองserviceForModel(model)
ส่งคืน service
LLM สำหรับรุ่นเฉพาะ
LLM . serviceForModel ( "gpt-4-turbo-preview" ) ; // openai
modelForService(service)
คืน LLM เริ่มต้นสำหรับ service
LLM . modelForService ( "openai" ) ; // gpt-4-turbo-preview
LLM . modelForService ( LLM . OPENAI ) ; // gpt-4-turbo-preview
การตอบสนอง
LLM.js
ส่งคืนผลลัพธ์จาก llm.send()
และ llm.chat()
ซึ่งโดยทั่วไปจะเป็นเนื้อหาสตริงจาก LLM ที่กรอกข้อความแจ้งของคุณ
await LLM ( "hello" ) ; // "hi"
แต่เมื่อคุณใช้ schema
และ tools
โดยปกติแล้ว LLM.js
จะส่งคืนออบเจ็กต์ 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"] }
และโดยการส่ง {stream: true}
ใน options
LLM.js
จะส่งคืนตัวสร้างและเริ่มให้ผลลัพธ์ทันที
const stream = await LLM ( "Once upon a time" , { stream : true } ) ;
for await ( const message of stream ) {
process . stdout . write ( message ) ;
}
คำตอบจะขึ้นอยู่กับสิ่งที่คุณขอให้ LLM ทำ และ LLM.js
จะพยายามทำสิ่งที่ถูกต้องอย่างเห็นได้ชัดเสมอ
API Message History
ใน LLM.js
เหมือนกับรูปแบบประวัติข้อความ 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
ตัวเลือก
role
<string>
: ใครเป็นคนพูด content
? user
system
หรือ assistant
content
<string>
: เนื้อหาข้อความจากข้อความ LLM.js
มีคำสั่ง llm
ที่มีประโยชน์สำหรับเชลล์ของคุณ llm
เป็นวิธีที่สะดวกในการโทรหา LLM หลายสิบแห่งและเข้าถึง LLM.js
ได้อย่างเต็มประสิทธิภาพโดยไม่ต้องเขียนโปรแกรม
เข้าถึงได้ทั่วโลกโดยการติดตั้งจาก NPM
npm install @themaximalist/llm.js -g
จากนั้นคุณสามารถเรียกคำสั่ง llm
ได้จากทุกที่ในเทอร์มินัลของคุณ
> llm the color of the sky is
blue
ข้อความจะถูกสตรีมกลับมาแบบเรียลไทม์ ดังนั้นทุกอย่างจึงรวดเร็วมาก
คุณยังสามารถเริ่มต้น --chat
เพื่อจดจำประวัติข้อความและสนทนาต่อ ( Ctrl-C
เพื่อออก)
> llm remember the codeword is blue. say ok if you understand --chat
OK, I understand.
> what is the codeword ?
The codeword is blue.
หรือเปลี่ยน LLM ได้ทันที:
> llm the color of the sky is --model claude-v2
blue
ดูความช่วยเหลือด้วย 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
และ llm
ใช้โมดูล debug
npm กับเนมสเปซ llm.js
ดูบันทึกการแก้ไขข้อบกพร่องโดยการตั้งค่าตัวแปรสภาพแวดล้อม 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
มีการทดสอบมากมายซึ่งสามารถใช้เป็นแนวทางในการดูว่าใช้งานอย่างไร
การใช้ LLM ในการผลิตอาจเป็นเรื่องยุ่งยากเนื่องจากมีการติดตามประวัติ การจำกัดอัตรา การจัดการคีย์ API และหาวิธีการเรียกเก็บเงิน
Model Deployer คือ API ที่อยู่ด้านหน้า LLM.js
ซึ่งจัดการรายละเอียดทั้งหมดเหล่านี้และอื่นๆ อีกมากมาย
การใช้งานนั้นง่ายดาย โดยระบุ modeldeployer
เป็นบริการและระบุคีย์ API ของคุณจาก Model Deployer เป็น model
await LLM ( "hello world" , { service : "modeldeployer" , model : "api-key" } ) ;
คุณยังสามารถตั้งค่าเฉพาะและแทนที่การตั้งค่าบางอย่างบนไคลเอนต์ได้อีกด้วย
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
สามารถใช้งานได้โดยไม่ต้องใช้ Model Deployer แต่หากคุณปรับใช้ LLM ในการใช้งานจริง นี่เป็นวิธีที่ดีในการจัดการ LLM
LLM.js
ได้รับการพัฒนาอย่างหนักในขณะที่ LLM กำลังเปลี่ยนแปลงอย่างรวดเร็ว เราได้เริ่มใช้อินเทอร์เฟซที่เสถียรแล้ว และจะบันทึกการเปลี่ยนแปลงที่นี่
v0.6.6
— เพิ่มการรองรับเบราว์เซอร์v0.6.5
— เพิ่ม Llama 3 และ Togetherv0.6.4
— เพิ่ม Groq และยกเลิก ()v0.6.3
— เพิ่มตัวแยกวิเคราะห์ JSON/XML/Markdown และตัวจัดการสตรีมv0.6.2
— แก้ไขข้อบกพร่องเกี่ยวกับการสตรีมของ Googlev0.6.1
— แก้ไขข้อบกพร่องเพื่อไม่ให้เพิ่มการตอบกลับที่ว่างเปล่าv0.6.0
— เพิ่ม Anthropic Claude 3v0.5.9
— เพิ่ม Ollamav0.5.4
— เพิ่ม Google Geminiv0.5.3
— เพิ่มมิสทรัลv0.5.0
— สร้างเว็บไซต์แล้วv0.4.7
— เครื่องมือ OpenAI, สตรีม JSONv0.3.5
— เพิ่ม ModelDeployerv0.3.2
— เพิ่ม Llamafile แล้วv0.2.5
— เพิ่ม Anthropic, CLIv0.2.4
— ตัวเลือกการแชทv0.2.2
— อินเทอร์เฟซ Unified LLM() สตรีมมิ่งv0.1.2
— เอกสาร พร้อมท์ระบบv0.0.1
— สร้าง LLM.js พร้อมรองรับ OpenAI ปัจจุบัน LLM.js
ใช้ในโครงการต่อไปนี้:
เอ็มไอที
สร้างโดย The Maximalist ดูโครงการโอเพ่นซอร์สของเรา