ไลบรารี TypeScript สำหรับการสร้างแอปพลิเคชัน AI
บทนำ | ติดตั้งด่วน | การใช้งาน | เอกสารประกอบ | ตัวอย่าง | มีส่วนร่วม | modelfusion .dev
สำคัญ
modelfusion ได้เข้าร่วมกับ Vercel และกำลังบูรณาการเข้ากับ Vercel AI SDK เรากำลังนำส่วนที่ดีที่สุดของ modelfusion มาสู่ Vercel AI SDK โดยเริ่มจากการสร้างข้อความ การสร้างวัตถุที่มีโครงสร้าง และการเรียกใช้เครื่องมือ โปรดตรวจสอบ AI SDK สำหรับการพัฒนาล่าสุด
modelfusion เป็นเลเยอร์นามธรรมสำหรับการรวมโมเดล AI เข้ากับแอปพลิเคชัน JavaScript และ TypeScript โดยเป็นการรวม API สำหรับการดำเนินการทั่วไป เช่น การสตรีมข้อความ การสร้างอ็อบเจ็กต์ และ การใช้เครื่องมือ โดยมีคุณสมบัติเพื่อรองรับสภาพแวดล้อมการใช้งานจริง รวมถึง hooks ที่สามารถสังเกตได้ การบันทึก และการลองใหม่โดยอัตโนมัติ คุณสามารถใช้ modelfusion เพื่อสร้างแอปพลิเคชัน AI แชทบอท และตัวแทนได้
npm install modelfusion
หรือใช้เทมเพลตเริ่มต้น:
เคล็ดลับ
ตัวอย่างพื้นฐานเป็นวิธีที่ดีในการเริ่มต้นและสำรวจควบคู่ไปกับเอกสารประกอบ คุณสามารถค้นหาได้ในโฟลเดอร์ตัวอย่าง/พื้นฐาน
คุณสามารถจัดเตรียมคีย์ API สำหรับการผสานรวมต่างๆ โดยใช้ตัวแปรสภาพแวดล้อม (เช่น OPENAI_API_KEY
) หรือส่งต่อไปยังตัวสร้างโมเดลเป็นตัวเลือก
สร้างข้อความโดยใช้โมเดลภาษาและข้อความแจ้ง คุณสามารถสตรีมข้อความได้หากโมเดลรองรับ คุณสามารถใช้รูปภาพสำหรับการแจ้งเตือนหลายรูปแบบหากโมเดลรองรับ (เช่น llama.cpp) คุณสามารถใช้รูปแบบข้อความแจ้งเพื่อใช้ข้อความ คำแนะนำ หรือข้อความแจ้งแชทได้
import { generateText , openai } from " modelfusion " ;
const text = await generateText ( {
model : openai . CompletionTextGenerator ( { model : "gpt-3.5-turbo-instruct" } ) ,
prompt : "Write a short story about a robot learning to love:nn" ,
} ) ;
ผู้ให้บริการ: OpenAI, รองรับ OpenAI, Llama.cpp, Ollama, Mistral, Hugging Face, Cohere
import { streamText , openai } from " modelfusion " ;
const textStream = await streamText ( {
model : openai . CompletionTextGenerator ( { model : "gpt-3.5-turbo-instruct" } ) ,
prompt : "Write a short story about a robot learning to love:nn" ,
} ) ;
for await ( const textPart of textStream ) {
process . stdout . write ( textPart ) ;
}
ผู้ให้บริการ: OpenAI, รองรับ OpenAI, Llama.cpp, Ollama, Mistral, Cohere
โมเดลการมองเห็นหลายรูปแบบ เช่น GPT 4 Vision สามารถประมวลผลภาพโดยเป็นส่วนหนึ่งของข้อความแจ้ง
import { streamText , openai } from " modelfusion " ;
import { readFileSync } from "fs" ;
const image = readFileSync ( "./image.png" ) ;
const textStream = await streamText ( {
model : openai
. ChatTextGenerator ( { model : "gpt-4-vision-preview" } )
. withInstructionPrompt ( ) ,
prompt : {
instruction : [
{ type : "text" , text : "Describe the image in detail." } ,
{ type : "image" , image , mimeType : "image/png" } ,
] ,
} ,
} ) ;
for await ( const textPart of textStream ) {
process . stdout . write ( textPart ) ;
}
ผู้ให้บริการ: OpenAI, รองรับ OpenAI, Llama.cpp, Ollama
สร้างวัตถุที่พิมพ์โดยใช้โมเดลภาษาและสคีมา
สร้างวัตถุที่ตรงกับสคีมา
import {
ollama ,
zodSchema ,
generateObject ,
jsonObjectPrompt ,
} from " modelfusion " ;
const sentiment = await generateObject ( {
model : ollama
. ChatTextGenerator ( {
model : "openhermes2.5-mistral" ,
maxGenerationTokens : 1024 ,
temperature : 0 ,
} )
. asObjectGenerationModel ( jsonObjectPrompt . instruction ( ) ) ,
schema : zodSchema (
z . object ( {
sentiment : z
. enum ( [ "positive" , "neutral" , "negative" ] )
. describe ( "Sentiment." ) ,
} )
) ,
prompt : {
system :
"You are a sentiment evaluator. " +
"Analyze the sentiment of the following product review:" ,
instruction :
"After I opened the package, I was met by a very unpleasant smell " +
"that did not disappear even after washing. Never again!" ,
} ,
} ) ;
ผู้ให้บริการ: OpenAI, Ollama, Llama.cpp
สตรีมออบเจ็กต์ที่ตรงกับสคีมา ออบเจ็กต์บางส่วนก่อนส่วนสุดท้ายเป็น JSON ที่ไม่ได้พิมพ์
import { zodSchema , openai , streamObject } from " modelfusion " ;
const objectStream = await streamObject ( {
model : openai
. ChatTextGenerator ( /* ... */ )
. asFunctionCallObjectGenerationModel ( {
fnName : "generateCharacter" ,
fnDescription : "Generate character descriptions." ,
} )
. withTextPrompt ( ) ,
schema : zodSchema (
z . object ( {
characters : z . array (
z . object ( {
name : z . string ( ) ,
class : z
. string ( )
. describe ( "Character class, e.g. warrior, mage, or thief." ) ,
description : z . string ( ) ,
} )
) ,
} )
) ,
prompt : "Generate 3 character descriptions for a fantasy role playing game." ,
} ) ;
for await ( const { partialObject } of objectStream ) {
console . clear ( ) ;
console . log ( partialObject ) ;
}
ผู้ให้บริการ: OpenAI, Ollama, Llama.cpp
สร้างภาพจากพรอมต์
import { generateImage , openai } from " modelfusion " ;
const image = await generateImage ( {
model : openai . ImageGenerator ( { model : "dall-e-3" , size : "1024x1024" } ) ,
prompt :
"the wicked witch of the west in the style of early 19th century painting" ,
} ) ;
ผู้ให้บริการ: OpenAI (Dall·E), AI ความเสถียร, Automatic1111
สังเคราะห์คำพูด (เสียง) จากข้อความ เรียกอีกอย่างว่า TTS (การอ่านออกเสียงข้อความ)
generateSpeech
สังเคราะห์คำพูดจากข้อความ
import { generateSpeech , lmnt } from " modelfusion " ;
// `speech` is a Uint8Array with MP3 audio data
const speech = await generateSpeech ( {
model : lmnt . SpeechGenerator ( {
voice : "034b632b-df71-46c8-b440-86a42ffc3cf3" , // Henry
} ) ,
text :
"Good evening, ladies and gentlemen! Exciting news on the airwaves tonight " +
"as The Rolling Stones unveil 'Hackney Diamonds,' their first collection of " +
"fresh tunes in nearly twenty years, featuring the illustrious Lady Gaga, the " +
"magical Stevie Wonder, and the final beats from the late Charlie Watts." ,
} ) ;
ผู้ให้บริการ: Eleven Labs, LMNT, OpenAI
generateSpeech
สร้างกระแสคำพูดจากข้อความหรือจากสตรีมข้อความ อาจเป็นแบบดูเพล็กซ์เต็มรูปแบบก็ได้ ทั้งนี้ขึ้นอยู่กับรุ่น
import { streamSpeech , elevenlabs } from " modelfusion " ;
const textStream : AsyncIterable < string > ;
const speechStream = await streamSpeech ( {
model : elevenlabs . SpeechGenerator ( {
model : "eleven_turbo_v2" ,
voice : "pNInz6obpgDQGcFmaJgB" , // Adam
optimizeStreamingLatency : 1 ,
voiceSettings : { stability : 1 , similarityBoost : 0.35 } ,
generationConfig : {
chunkLengthSchedule : [ 50 , 90 , 120 , 150 , 200 ] ,
} ,
} ) ,
text : textStream ,
} ) ;
for await ( const part of speechStream ) {
// each part is a Uint8Array with MP3 audio data
}
ผู้ให้บริการ: Eleven Labs
ถอดเสียงคำพูด (เสียง) ข้อมูลเป็นข้อความ เรียกอีกอย่างว่าคำพูดเป็นข้อความ (STT)
import { generateTranscription , openai } from " modelfusion " ;
import fs from "node:fs" ;
const transcription = await generateTranscription ( {
model : openai . Transcriber ( { model : "whisper-1" } ) ,
mimeType : "audio/mp3" ,
audioData : await fs . promises . readFile ( "data/test.mp3" ) ,
} ) ;
ผู้ให้บริการ: OpenAI (กระซิบ), Whisper.cpp
สร้างการฝังสำหรับข้อความและค่าอื่นๆ การฝังเป็นเวกเตอร์ที่แสดงถึงแก่นแท้ของค่านิยมในบริบทของโมเดล
import { embed , embedMany , openai } from " modelfusion " ;
// embed single value:
const embedding = await embed ( {
model : openai . TextEmbedder ( { model : "text-embedding-ada-002" } ) ,
value : "At first, Nox didn't know what to do with the pup." ,
} ) ;
// embed many values:
const embeddings = await embedMany ( {
model : openai . TextEmbedder ( { model : "text-embedding-ada-002" } ) ,
values : [
"At first, Nox didn't know what to do with the pup." ,
"He keenly observed and absorbed everything around him, from the birds in the sky to the trees in the forest." ,
] ,
} ) ;
ผู้ให้บริการ: OpenAI, รองรับ OpenAI, Llama.cpp, Ollama, Mistral, Hugging Face, Cohere
จำแนกค่าเป็นหมวดหมู่
import { classify , EmbeddingSimilarityClassifier , openai } from " modelfusion " ;
const classifier = new EmbeddingSimilarityClassifier ( {
embeddingModel : openai . TextEmbedder ( { model : "text-embedding-ada-002" } ) ,
similarityThreshold : 0.82 ,
clusters : [
{
name : "politics" as const ,
values : [
"they will save the country!" ,
// ...
] ,
} ,
{
name : "chitchat" as const ,
values : [
"how's the weather today?" ,
// ...
] ,
} ,
] ,
} ) ;
// strongly typed result:
const result = await classify ( {
model : classifier ,
value : "don't you love politics?" ,
} ) ;
ตัวแยกประเภท: การฝังตัวแยกประเภทความคล้ายคลึงกัน
แยกข้อความออกเป็นโทเค็นและสร้างข้อความใหม่จากโทเค็น
const tokenizer = openai . Tokenizer ( { model : "gpt-4" } ) ;
const text = "At first, Nox didn't know what to do with the pup." ;
const tokenCount = await countTokens ( tokenizer , text ) ;
const tokens = await tokenizer . tokenize ( text ) ;
const tokensAndTokenTexts = await tokenizer . tokenizeWithTexts ( text ) ;
const reconstructedText = await tokenizer . detokenize ( tokens ) ;
ผู้ให้บริการ: OpenAI, Llama.cpp, Cohere
เครื่องมือคือฟังก์ชัน (และข้อมูลเมตาที่เกี่ยวข้อง) ที่สามารถดำเนินการได้ด้วยโมเดล AI มีประโยชน์สำหรับการสร้างแชทบอทและตัวแทน
modelfusion มีเครื่องมือมากมายที่พร้อมใช้งานทันที: Math.js, MediaWiki Search, SerpAPI, Google Custom Search คุณยังสามารถสร้างเครื่องมือที่กำหนดเองได้
ด้วย runTool
คุณสามารถขอให้โมเดลภาษาที่เข้ากันได้กับเครื่องมือ (เช่น แชท OpenAI) เรียกใช้เครื่องมือเดียว runTool
จะสร้างการเรียกเครื่องมือก่อน จากนั้นจึงเรียกใช้งานเครื่องมือด้วยอาร์กิวเมนต์
const { tool , toolCall , args , ok , result } = await runTool ( {
model : openai . ChatTextGenerator ( { model : "gpt-3.5-turbo" } ) ,
too : calculator ,
prompt : [ openai . ChatMessage . user ( "What's fourteen times twelve?" ) ] ,
} ) ;
console . log ( `Tool call:` , toolCall ) ;
console . log ( `Tool:` , tool ) ;
console . log ( `Arguments:` , args ) ;
console . log ( `Ok:` , ok ) ;
console . log ( `Result or Error:` , result ) ;
ด้วย runTools
คุณสามารถขอให้โมเดลภาษาสร้างการเรียกเครื่องมือและข้อความได้หลายอย่าง โมเดลจะเลือกว่าเครื่องมือใด (ถ้ามี) ที่ควรเรียกใช้พร้อมกับอาร์กิวเมนต์ใด ทั้งข้อความและการเรียกเครื่องมือเป็นทางเลือก ฟังก์ชั่นนี้รันเครื่องมือ
const { text , toolResults } = await runTools ( {
model : openai . ChatTextGenerator ( { model : "gpt-3.5-turbo" } ) ,
tools : [ calculator /* ... */ ] ,
prompt : [ openai . ChatMessage . user ( "What's fourteen times twelve?" ) ] ,
} ) ;
คุณสามารถใช้ runTools
เพื่อใช้ลูปตัวแทนที่ตอบสนองต่อข้อความผู้ใช้และดำเนินการเครื่องมือ เรียนรู้เพิ่มเติม
const texts = [
"A rainbow is an optical phenomenon that can occur under certain meteorological conditions." ,
"It is caused by refraction, internal reflection and dispersion of light in water droplets resulting in a continuous spectrum of light appearing in the sky." ,
// ...
] ;
const vectorIndex = new MemoryVectorIndex < string > ( ) ;
const embeddingModel = openai . TextEmbedder ( {
model : "text-embedding-ada-002" ,
} ) ;
// update an index - usually done as part of an ingestion process:
await upsertIntoVectorIndex ( {
vectorIndex ,
embeddingModel ,
objects : texts ,
getValueToEmbed : ( text ) => text ,
} ) ;
// retrieve text chunks from the vector index - usually done at query time:
const retrievedTexts = await retrieve (
new VectorIndexRetriever ( {
vectorIndex ,
embeddingModel ,
maxResults : 3 ,
similarityThreshold : 0.8 ,
} ) ,
"rainbow and water droplets"
) ;
ร้านค้าเวกเตอร์ที่มีจำหน่าย: หน่วยความจำ, SQLite VSS, Pinecone
คุณสามารถใช้สไตล์พร้อมท์ที่แตกต่างกัน (เช่น ข้อความ คำแนะนำ หรือพร้อมท์แชท) กับโมเดลการสร้างข้อความ modelfusion สไตล์พรอมต์เหล่านี้สามารถเข้าถึงได้ผ่านวิธีการ .withTextPrompt()
, .withChatPrompt()
และ .withInstructionPrompt()
:
const text = await generateText ( {
model : openai
. ChatTextGenerator ( {
// ...
} )
. withTextPrompt ( ) ,
prompt : "Write a short story about a robot learning to love" ,
} ) ;
const text = await generateText ( {
model : llamacpp
. CompletionTextGenerator ( {
// run https://huggingface.co/TheBloke/Llama-2-7B-Chat-GGUF with llama.cpp
promptTemplate : llamacpp . prompt . Llama2 , // Set prompt template
contextWindowSize : 4096 , // Llama 2 context window size
maxGenerationTokens : 512 ,
} )
. withInstructionPrompt ( ) ,
prompt : {
system : "You are a story writer." ,
instruction : "Write a short story about a robot learning to love." ,
} ,
} ) ;
const textStream = await streamText ( {
model : openai
. ChatTextGenerator ( {
model : "gpt-3.5-turbo" ,
} )
. withChatPrompt ( ) ,
prompt : {
system : "You are a celebrated poet." ,
messages : [
{
role : "user" ,
content : "Suggest a name for a robot." ,
} ,
{
role : "assistant" ,
content : "I suggest the name Robbie" ,
} ,
{
role : "user" ,
content : "Write a short story about Robbie learning to love" ,
} ,
] ,
} ,
} ) ;
คุณสามารถใช้เทมเพลตพร้อมท์กับโมเดลรูปภาพได้เช่นกัน เช่น เพื่อใช้พร้อมท์ข้อความพื้นฐาน มีจำหน่ายในรูปแบบชวเลข:
const image = await generateImage ( {
model : stability
. ImageGenerator ( {
//...
} )
. withTextPrompt ( ) ,
prompt :
"the wicked witch of the west in the style of early 19th century painting" ,
} ) ;
เทมเพลตพร้อมท์ | ข้อความพร้อมท์ |
---|---|
อัตโนมัติ1111 | |
ความมั่นคง |
ฟังก์ชันโมเดล modelfusion ส่งคืนการตอบสนองที่หลากหลายซึ่งรวมถึงการตอบสนองแบบดิบ (ดั้งเดิม) และข้อมูลเมตาเมื่อคุณตั้งค่าอาร์กิวเมนต์ fullResponse
เป็น true
// access the raw response (needs to be typed) and the metadata:
const { text , rawResponse , metadata } = await generateText ( {
model : openai . CompletionTextGenerator ( {
model : "gpt-3.5-turbo-instruct" ,
maxGenerationTokens : 1000 ,
n : 2 , // generate 2 completions
} ) ,
prompt : "Write a short story about a robot learning to love:nn" ,
fullResponse : true ,
} ) ;
console . log ( metadata ) ;
// cast to the raw response type:
for ( const choice of ( rawResponse as OpenAICompletionResponse ) . choices ) {
console . log ( choice . text ) ;
}
modelfusion จัดให้มีกรอบงานผู้สังเกตการณ์และการสนับสนุนการบันทึก คุณสามารถติดตามการเรียกใช้และลำดับชั้นการโทรได้อย่างง่ายดาย และคุณสามารถเพิ่มผู้สังเกตการณ์ของคุณเองได้
import { generateText , openai } from " modelfusion " ;
const text = await generateText ( {
model : openai . CompletionTextGenerator ( { model : "gpt-3.5-turbo-instruct" } ) ,
prompt : "Write a short story about a robot learning to love:nn" ,
logging : "detailed-object" ,
} ) ;
ตัวอย่างฟังก์ชันและอ็อบเจ็กต์แต่ละรายการเกือบทั้งหมด ขอแนะนำอย่างยิ่งในการเริ่มต้น
หลากหลายรูปแบบ , การสตรีมวัตถุ , การสร้างภาพ , ข้อความเป็นคำพูด , คำพูดเป็นข้อความ , การสร้างข้อความ , การสร้างวัตถุ , การฝัง
StoryTeller เป็นเว็บแอปพลิเคชั่นเชิงสำรวจที่สร้างเรื่องราวเสียงสั้นสำหรับเด็กก่อนวัยเรียน
แอป Next.js , OpenAI GPT-3.5-turbo , การสตรีม , ยกเลิกการจัดการ
เว็บแชทกับผู้ช่วย AI ใช้งานเป็นแอป Next.js
แอปเทอร์มินัล , การแยกวิเคราะห์ PDF , ในดัชนีเวกเตอร์หน่วยความจำ , การสร้างแบบเสริมการดึงข้อมูล , การฝังเอกสารสมมุติ
ถามคำถามเกี่ยวกับเอกสาร PDF และรับคำตอบจากเอกสาร
แอป Next.js , การสร้างภาพ , การถอดเสียง , การสตรีมวัตถุ , OpenAI , AI ความเสถียร , Ollama
ตัวอย่างการใช้ modelfusion กับ Next.js 14 (App Router):
การสตรีมคำพูด , OpenAI , การสตรีม Elevenlabs , Vite , Fastify , เซิร์ฟเวอร์ modelfusion
เมื่อได้รับพร้อมต์ เซิร์ฟเวอร์จะส่งคืนทั้งข้อความและการตอบสนองสตรีมคำพูด
แอปเทอร์มินัล , ตัวแทน , BabyAGI
การใช้ TypeScript ของ BabyAGI classic และ BabyBeeAGI
แอปเทอร์มินัล , ตัวแทน ReAct , GPT-4 , ฟังก์ชัน OpenAI , เครื่องมือ
รับคำตอบสำหรับคำถามจากวิกิพีเดีย เช่น "ใครเกิดก่อน ไอน์สไตน์ หรือ ปิกัสโซ"
แอปเทอร์มินัล , ตัวแทน , เครื่องมือ , GPT-4
ตัวแทนตัวน้อยที่แก้ปัญหาคณิตศาสตร์ในโรงเรียนมัธยมต้น ใช้เครื่องมือเครื่องคิดเลขในการแก้ปัญหา
แอปเทอร์มินัล , การแยกวิเคราะห์ PDF , การแยกข้อมูลแบบเรียกซ้ำ , ในดัชนีเวกเตอร์หน่วยความจำ , การดึงตัวอย่าง _style , OpenAI GPT-4 , การคำนวณต้นทุน
แยกข้อมูลเกี่ยวกับหัวข้อจาก PDF และเขียนทวีตในสไตล์ของคุณเอง
คลาวด์แฟลร์ , OpenAI
สร้างข้อความบน Cloudflare Worker โดยใช้ modelfusion และ OpenAI
อ่านคู่มือการสนับสนุน modelfusion เพื่อเรียนรู้เกี่ยวกับกระบวนการพัฒนา วิธีเสนอการแก้ไขจุดบกพร่องและการปรับปรุง และวิธีการสร้างและทดสอบการเปลี่ยนแปลงของคุณ