AI 애플리케이션 구축을 위한 TypeScript 라이브러리입니다.
소개 | 빠른 설치 | 사용법 | 문서 | 예 | 기여 | modelfusion .dev
중요한
modelfusion Vercel에 합류하여 Vercel AI SDK에 통합되고 있습니다. 우리는 텍스트 생성, 구조화된 객체 생성 및 도구 호출을 시작으로 modelfusion 의 가장 좋은 부분을 Vercel AI SDK에 가져오고 있습니다. 최신 개발 내용은 AI SDK를 확인하세요.
modelfusion 은 AI 모델을 JavaScript 및 TypeScript 애플리케이션에 통합하고 텍스트 스트리밍 , 객체 생성 및 도구 사용 과 같은 일반적인 작업을 위해 API를 통합하기 위한 추상화 계층입니다. 관찰 가능성 후크, 로깅 및 자동 재시도를 포함하여 프로덕션 환경을 지원하는 기능을 제공합니다. modelfusion 사용하여 AI 애플리케이션, 챗봇 및 에이전트를 구축할 수 있습니다.
npm install modelfusion
또는 시작 템플릿을 사용하십시오.
팁
기본 예제는 시작하고 문서와 병행하여 탐색할 수 있는 좋은 방법입니다. 예제/기본 폴더에서 찾을 수 있습니다.
환경 변수(예: OPENAI_API_KEY
)를 사용하여 다양한 통합에 API 키를 제공하거나 이를 모델 생성자에 옵션으로 전달할 수 있습니다.
언어 모델과 프롬프트를 사용하여 텍스트를 생성합니다. 모델에서 지원하는 경우 텍스트를 스트리밍할 수 있습니다. 모델이 지원하는 경우(예: 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), Stability 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
}
제공자: 일레븐랩스
음성(오디오) 데이터를 텍스트로 변환합니다. 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), 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?" ,
} ) ;
분류자: EmbeddingSimilarityClassifier
텍스트를 토큰으로 분할하고 토큰에서 텍스트를 재구성합니다.
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 검색, 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 , 스트리밍 , 중단 처리
Next.js 앱으로 구현된 AI 도우미와의 웹 채팅입니다.
터미널 앱 , PDF 파싱 , 인 메모리 벡터 인덱스 , 검색 증강 생성 , 가상 문서 임베딩
PDF 문서에 대해 질문하고 문서에서 답변을 얻으세요.
Next.js 앱 , 이미지 생성 , 전사 , 객체 스트리밍 , OpenAI , 안정성 AI , Ollama
Next.js 14(앱 라우터)와 함께 modelfusion 사용하는 예:
음성 스트리밍 , OpenAI , Elevenlabs 스트리밍 , Vite , Fastify , modelfusion Server
프롬프트가 주어지면 서버는 텍스트와 음성 스트림 응답을 모두 반환합니다.
터미널 앱 , 에이전트 , BabyAGI
BabyAGI 클래식 및 BabyBeeAGI의 TypeScript 구현입니다.
터미널 앱 , ReAct 에이전트 , GPT-4 , OpenAI 기능 , 도구
Wikipedia에서 "누가 먼저 태어났습니까, 아인슈타인입니까 아니면 피카소입니까?"와 같은 질문에 대한 답변을 얻으십시오.
터미널 앱 , 에이전트 , 도구 , GPT-4
중학교 수학 문제를 풀어주는 소형 에이전트. 문제를 해결하기 위해 계산기 도구를 사용합니다.
터미널 앱 , PDF 파싱 , 재귀적 정보 추출 , 인 메모리 벡터 인덱스, _style 예제 검색 , OpenAI GPT-4 , 비용 계산
PDF에서 주제에 대한 정보를 추출하고 이에 대한 자신만의 스타일로 트윗을 작성합니다.
클라우드플레어 , 오픈AI
modelfusion 과 OpenAI를 사용하여 Cloudflare Worker에서 텍스트를 생성하세요.
개발 프로세스, 버그 수정 및 개선 제안 방법, 변경 사항 빌드 및 테스트 방법에 대해 알아보려면 modelfusion 기여 가이드를 읽어보세요.