Примечание. Эта библиотека устарела, теперь она разделена на ZoD-GPT и LLM-API.

TypeScript-первая инструментальная инструментальная инструментальная работа для работы с большими языковыми моделями на основе чата (LLMS).
Llamaflow - это промежуточный слой, который находится между вашим программным обеспечением и моделью ИИ, он добавляет следующие возможности поверх стандартного API завершения чата:
С Llamaflow вы можете просто запросить модель Openai Chatgpt, как SO:
import { OpenAI } from 'llama-flow' ;
const model = new OpenAI ( { apiKey : 'YOUR_OPENAI_KEY' } ) ;
const chat = model . chat ( {
systemMessage :
"You are a smart and honest AI assistant. Follow the user's requirements carefully & to the letter, minimize any other prose." ,
} ) ;
const response = await chat . request (
prompt . json ( {
message :
'What are some good names for childrens book about the renaissance? Respond as a JSON array' ,
schema : z . array ( z . string ( ) . max ( 200 ) ) ,
} ) ,
) ;
console . log ( response . content ) ; // content will be typed as string[]; Этот пакет размещен на NPM:
npm i llama-flow
yarn add llama-flow
Для настройки в вашей кодовой базе инициализируйте новый экземпляр с помощью модели, которую вы хотите (только OpenAI подходит на данный момент). Обратите внимание, что при инициализации вы также можете добавить модель по умолчанию и конфигурация чата (например, температура, тайм -ауты, повторные данные). Это просто знания по умолчанию, и они всегда могут быть перезаписаны позже на чате или на основе каждого запроса.
import { OpenAI } from 'llama-flow' ;
const model = new OpenAI (
{ apiKey : 'YOUR_OPENAI_KEY' } ,
{ model : 'gpt-3.5-turbo' } ,
) ;Чат - это разговор между «Пользователем» (ваше программное обеспечение) и агентом искусственного интеллекта. Llamaflow позаботится о управлении памятью чата, поэтому вы можете просто продолжить разговор, отправив еще один запрос. Обратите внимание, что в будущем будут добавлены различные стратегии управления памятью, такие как обрезка памяти по мере необходимости, чтобы соответствовать окну контекста.
const chat = model . chat ( {
systemMessage : 'You are an AI writer.' ,
retainMemory : true ,
} ) ;
// You can ask the AI model with a simple string, or a dedicated `Prompt` object.
const response = await chat . request (
prompt . text (
'Write a script for a tiktok video that talks about the artistic contribution of the renaissance.' ,
) ,
) ;
// The results, as well as any usage stats, will be returned.
console . log (
`The AI writer's response is: ${ response . content } . Token used: ${ response . usage . totalTokens } .` ,
) ;
// You can follow up on this chat by prompting further, using the `bulletPrompt` object that was created earlier.
const bulletPoints = await chat . request ( bulletPrompt ) ;
// `bulletPoints.content` will be automatically casted in the correct type as defined in the schema field of `bulletPrompt`
console . log (
`The structured version of this response is: ${ JSON . stringify (
bulletPoints . content ,
) } ` ,
) ;Подсказка - это сообщение в чате ИИ с ожиданием конкретного формата ответа. Сообщения типа приглашения подтверждаются, чтобы убедиться, что определенный формат возвращается точно, или это будет ошибкой. Существуют разные подсказки для разных форматов. Вот пример подсказки JSON.
import { prompt } from 'llama-flow' ;
import { z } from 'zod' ; // JSON prompt uses Zod for schema validation.
const bulletPrompt = prompt . json ( {
message :
'Please rewrite this in a list of bullet points. Respond as a JSON array, where each element in the array is one bullet point. Keep each bullet point to be 200 characters max. For example: ["bullet point 1", "bullet point 2"]' ,
schema : z . array ( z . string ( ) . max ( 200 ) ) ,
} ) ; Обратите внимание, что объект Prompt выделяет основное message и formatMessage . Это используется для повторных поисков. Когда Llamaflow использует эту подсказку, он спросит модель как с основным и форматом. Если модель возвращается с неправильно отформатированным ответом, она попросит модель исправить предыдущий выход, используя только formatMessage .
Вы также можете построить свои собственные объекты с помощью пользовательских валидаторов. Llamaflow обеспечивает простой и расширяемый способ создания любых валидаторов. Вот несколько примеров пользовательских валидаторов:
Принимая пример выше, но на этот раз он попросит модель просто ответить в реальных пулевых точках вместо массивов JSON. Это полезно, потому что иногда модель (ESP <GPT-4) не самая лучшая при следующих конкретных инструкциях по форматированию, особенно когда речь идет о сложных структурах данных.
import { prompt } from 'llama-flow' ;
const bulletPrompt = prompt . json ( {
message :
'Please rewrite this in a list of bullet points. Respond as a list of bullet points, where each bullet point begins with the "-" character. Each bullet point should be less than 200 characters. Put each bullet point on a new line.' ,
// parse the response from the model so it can be fed into the schema validator
parseResponse : ( res ) => res . split ( 'n' ) . map ( ( s ) => s . replace ( '-' , '' ) . trim ( ) ) ,
// it's useful to define custom error messages, any schema parse errors will be automatically fed back into the model on retry, so the model knows exactly what to correct.
schema : z . array (
z . string ( ) . max ( 200 , {
message : 'This bullet point should be less than 200 characters.' ,
} ) ,
) ,
} ) ; Теперь давайте возьмем это еще дальше. Вы можете создать подсказку, которая использует модель (или какой -то другой внешний источник) для проверки собственного выхода. Вы можете сделать это, передав пользовательский метод Async validate . Обратите внимание, что этот метод будет переопределять другие свойства, связанные с валидацией, такие как formatMessage , parseResponse , schema ... и т. Д.
import { prompt , Chat } from 'llama-flow' ;
const factCheckerChat = model . chat ( {
systemMessage :
'You are a fact checker that responds to if the user's messages are true or not, with just the word "true" or "false". Do not add punctuations or any other text. If the user asks a question, request, or anything that cannot be fact checked, ignore the user's request and just say "null".' ,
// The fact checker is designed to fulfill each request independently (e.g. the current request does not depend on the content of the previous request). So no need to keep message memory to save on tokens.
retainMemory : false ,
} ) ;
const buildFactCheckedPrompt = ( article : string ) =>
prompt . text ( {
message : `Please write a summary about the following article: ${ article } ` ,
// Because LLM driven validation can get expensive, set a lower retry count.
promptRetries : 2 ,
parse : async ( response ) => {
// Check if this summary is true or not
const { response } = await factCheckerChat . request (
prompt . boolean ( {
message : response . content ,
} ) ,
) ;
if ( response . content === true ) {
return { success : true , data : response . content } ;
} else {
// if `retryPrompt` is set, LLamaFlow will automatically retry with the text in this property.
return {
success : false ,
retryPrompt :
'This summary is not true, please rewrite with only true facts.' ,
} ;
}
} ,
} ) ;
// now, every content generated by this chat will be fact checked by the LLM itself, and this request will throw an error if the content can't be fixed (once the maximum number of retries has been reached).
const factCheckedContent = await chat . request (
buildFactCheckedPrompt (
'Write a script for a tiktok video that talks about the artistic contribution of the renaissance.' ,
) ,
) ;Поскольку это API, часто полезно продолжать запрашивать из того же чата. Часто история сообщений будет служить контекстом для следующего запроса. Хорошим примером использования является подсказка для сначала написать немного контента, затем извлечь объекты и, наконец, дать некоторые варианты для заголовка.
// You can reset chat history anytime with `reset()`, however, this is an anti-pattern, as it is prone to mistakes. It's much safer to just initialize a new chat.
chat . reset ( ) ;
const article = await chat . request (
prompt . text ( 'Write a blog post about the financial crisis of 2008' ) ,
) ;
const entities = await chat . request (
prompt . json ( {
message :
'What are the different entities in the above blog post? Respond in a JSON array, where the items in the array are just the names of the entities.' ,
schema : z . array ( z . string ( ) ) ,
} ) ,
) ;
const titles = await chat . request (
prompt . bulletPoints ( {
message : 'Write a good title for this post' ,
amount : 10 ,
} ) ,
) ; Распространенной ошибкой с API LLM является использование токена - вам разрешено соответствовать определенному объему данных в окне контекста. В случае с Llamaflow это означает, что вы ограничены в общем количестве сообщений, которые вы можете отправить (если retainMemory установлен на true ) и длину содержания сообщений.
Llamaflow автоматически определит, нарушит ли запрос предел токена перед отправкой фактического запроса поставщику моделей (например, OpenAI). Это сохранит один вызов в обратном обращении с сетью и позволит вам обращаться с такими ошибками. Типичным способом обработки этих ошибок является удаление сообщений в истории сообщений (если вы используете ЧАТ с набором retainMemory ), или разделение вашего контента на более мелкие кластеры и обрабатывают их в нескольких запросах.
Вот пример улавливания ошибки переполнения токена. Обратите внимание, что minimumResponseTokens устанавливается на высокое значение для явного запуска этой ошибки ( gpt-3.5-turbo имеет максимальный предел контекста 4096, поэтому установление минимального предела до 4095 означает, что для фактической подсказки недостаточно только 1 токена, что недостаточно для примера ниже.).
try {
// make sure to set the `contextSize` to enable automatic token checking
const model = new OpenAI (
{ apiKey : 'YOUR_OPENAI_KEY' } ,
{ model : 'gpt-3.5-turbo' , contextSize : 4096 } ,
) ;
const chat = model . chat ( {
systemMessage : 'You are an AI assistant' ,
} ) ;
await chat . request (
{ message : 'hello world, testing overflow logic' } ,
{ minimumResponseTokens : 4095 } ,
) ;
} catch ( e ) {
if ( e instanceof TokenError ) {
console . info (
`Caught token overflow, overflowed tokens: ${ e . overflowTokens } ` ,
) ;
}
} Обычным способом решения проблем с ограничением токена является разделение вашего контента. Llamaflow предоставляет полезный вспомогательный метод, который завершает метод chat.request . Он достаточно умный, чтобы разделить ваш текст, только если он определяет, что он выше предела токена, и попытается сохранить как можно больше исходного текста.
const response = await chat . requestWithSplit (
'hello world, testing overflow logic' ,
( text ) =>
prompt . text ( {
message : `Add other required prompts first, then add your content: ${ text } ` ,
} ) ,
) ; Обратите внимание, что теперь основной контент подсказки представлен первым. Это контент, который будет разделен текстовым сплиттером (вдоль n , . , И Первые персонажи сначала, чтобы купить его). Вы можете добавить любые дополнительные требуемые подсказки и объединить его с помощью подсказки содержимого в параметре responseFn .
LLAMAFLOW использует модуль debug для ведения журналов и сообщений об ошибках. Чтобы запустить в режиме отладки, установите переменную DEBUG ENV:
DEBUG=llamaflow:* yarn playground
Вы также можете указать различные типы журнала через:
DEBUG=llamaflow:error yarn playground DEBUG=llamaflow:log yarn playground
Llamaflow также поставляется с поддержкой моделей Azure OpenAI. Версия Azure обычно намного быстрее и надежнее, чем собственные конечные точки API Openai. Чтобы использовать конечные точки Azure, вы должны включить 2 параметры, специфичные для Azure, при инициализации модели OpenAI, azureDeployment и azureEndpoint . Поле apiKey также теперь будет использоваться для ключа Azure API.
Вы можете найти ключ Azure API и конечную точку на портале Azure. Развертывание Azure должно быть создано в рамках Azure AI Portal.
Обратите внимание, что параметр model в ModelConfig будет игнорироваться при использовании Azure. Это связано с тем, что в системе Azure model выбирается при создании развертывания, а не во время выполнения.
const model = new OpenAI ( {
apiKey : 'AZURE_OPENAI_KEY' ,
azureDeployment : 'AZURE_DEPLOYMENT_NAME' ,
azureEndpoint : 'AZURE_ENDPOINT' ,
} ) ; Единственная модель Llamaflow поддерживает в настоящее время модели OpenAI на основе чата.
const model = new OpenAI ( openAiConfig , modelConfig ) ; interface OpenAIConfig {
apiKey : string ;
} Эти модели конфигурации в конфигурации Openai напрямую см. Doc: https://platform.openai.com/docs/api-reference/chat/create
interface ModelConfig {
model ?: string ;
maxTokens ?: number ;
temperature ?: number ;
topP ?: number ;
stop ?: string | string [ ] ;
presencePenalty ?: number ;
frequencyPenalty ?: number ;
logitBias ?: Record < string , number > ;
user ?: string ;
stream ?: boolean ;
} Когда stream устанавливается на true , вы можете получить доступ к частичным выходам запросов модели, передавая излучение события в ChatRequestOptions при выполнении запросов. Частичные выходы будут отправлены в виде строки по событию data .
Чтобы сделать запрос на модель, вам нужно сначала построить объект приглашения. Подсказки предоставляют способ добавить валидацию и повторную логику в каждый запрос.
import { prompt } from 'llama-flow' ;
prompt . text ( prompt : string ) ;
prompt . text ( prompt : RawPrompt ) ;
prompt . json ( prompt : JSONPrompt ) ;
prompt . bulletPoints ( prompt : BulletPointsPrompt ) ;
prompt . boolean ( prompt : BooleanPrompt ) ; Вы можете запрашивать как строку, либо как RawPrompt .
interface RawPrompt < T = string > {
message : string ;
parse ?: (
response : ChatResponse < string > ,
) => MaybePromise <
{ success : false ; retryPrompt ?: string } | { success : true ; data : T }
> ;
promptRetries ?: number ;
}Сообщение Это текст, который отправляется в модель.
Parse Вы можете реализовать пользовательский анализатор, определив свой собственный метод parse .
При определении пользовательского метода parse , который возвращает пользовательский тип данных, вы можете добавить общий тип в RawPrompt , который автоматически отбрасывает тип возврата parse в Generic. Это также будет распространять тип на протяжении всего пути через метод chat.request .
Если данные, возвращаемые моделью, являются уменными, вы можете вернуть пользовательскую строку retryPrompt , которая приведет к тому, что Llamaflow будет восстановить модель.
PROMPTRETRIES определяет, сколько раз переполнить модель, прежде чем запрос принесет ошибку. По умолчанию 3. Обратите внимание, что parse должен вернуть действительный retryPrompt для любых попыток, которые будут предприняты.
interface BooleanPrompt {
message : string ;
promptRetries ?: number ;
} Используйте эту подсказку, если вы хотите задать модель вопрос, где вы ожидаете только true или false ответ.
Сообщите запрос, чтобы отправить в модель. Эта подсказка будет автоматически добавлять инструкции форматирования форматирования к сообщению, которое отправляется в модель, которая говорит модели, чтобы отформатировать свой ответ в качестве логического, так что вы можете просто включить запрос в message , не написав какие -либо дополнительные заявления о форматировании.
interface BulletPointsPrompt {
message : string ;
amount ?: number ;
length ?: number ;
promptRetries ?: number ;
}Используйте эту подсказку, если вы хотите, чтобы модель вернула список строк.
Сообщите запрос, чтобы отправить в модель. Эта подсказка автоматически добавит инструкции по форматированию форматирования к сообщению, которое сообщает модели, как отформатировать ответ.
сумма количество пулевых баллов, которые должны быть возвращены.
Длина Максимальное количество символов, которые должны быть в каждой точке пули.
interface JSONPrompt < T extends z . ZodType > {
message : string ;
schema : T ;
parseResponse ?: ( res : string ) => MaybePromise < z . infer < T > > ;
retryMessage ?: string ;
promptRetries ?: number ;
}Сообщите сообщение для отправки в модель. В отличие от подсказки логических или пулевых точек, эта подсказка не генерирует формирующие инструкции для модели. Таким образом, как часть вашего сообщения в модель, вы должны включить инструкции по форматированию для возврата данных в формате JSON, а также форму JSON.
Схема Это схема ZOD, которая будет использоваться для анализа и типирования ответа от модели.
SACSERESPONSE Если вы попросите модель не возвращать данные в формате JSON, вы можете определить пользовательский анализатор, чтобы разобрать обратную строку в JSON, прежде чем отправить ее для schema для проверки.
RETRYMESSEGAGE Если анализ схемы не стерт, это будет использоваться как часть сообщения, отправленного в модель, чтобы переоценить для правильного отформатированного ответа. Обратите внимание, что эта подсказка автоматически генерирует сообщение reck в зависимости от ошибок анализа схемы (например, если конкретный ключ отсутствует, Llamaflow попросит модель включить этот конкретный ключ). Таким образом, это поле является исключительно для того, чтобы дать дополнительный контекст модели на REAK.
Объект чата хранит сеанс чата с моделью. Сессия позаботится о хранении истории сообщений, поэтому вы можете просто продолжить разговор с моделью, сделав еще один запрос.
const chat = model . chat ( config : ChatConfig ) ;Параметры. Вы можете установить поведение удержания памяти, а также параметры запроса по умолчанию для каждого запроса, отправленного в этом чате.
export interface ChatConfig {
// the message injected at the start of every chat to steer the agent
systemMessage : string ;
// if chat memory should be retained after every request. when enabled, the chat's behavior will be similar to a normal user chat room, and model can have access to history when making inferences. defaults to false
retainMemory ?: boolean ;
// set default request options. note that this can be overridden on a per-request basis
options ?: ChatRequestOptions ;
} Чтобы отправить запрос на сеанс чата:
const res : ChatResponse = await chat . request ( prompt , options : ChatRequestOptions ) ;Параметры. Вы можете переопределить параметры запроса по умолчанию через этот параметр. Запрос будет автоматически повторно, если есть ошибка RateLimit или сервера.
Обратите внимание, что повторение в запросе не учитывается в направлении быстрого воздействия, определенного в разделе «Запрос» выше.
type ChatRequestOptions = {
// the number of time to retry this request due to rate limit or recoverable API errors
retries ?: number ;
retryInterval ?: number ;
timeout ?: number ;
// the minimum amount of tokens to allocate for the response. if the request is predicted to not have enough tokens, it will automatically throw a 'TokenError' without sending the request
minimumResponseTokens ?: number ;
// override the messages used for completion, only use this if you understand the API well
messages ?: Message [ ] ;
// pass in an event emitter to receive message stream events
events ?: EventEmitter ;
} ; Ответы чата находятся в следующем формате:
interface ChatResponse < T = string > {
content : T ;
model : string ;
// set to true if this content was streamed. note to actually access the stream, you have to pass in an event emitter via ChatRequestOptions
isStream : boolean ;
usage : {
promptTokens : number ;
completionTokens : number ;
totalTokens : number ;
} ;
}Проанализированный контент и типичный контент из приглашения. Типы будут установлены автоматически в зависимости от того, какую подсказку вы использовали.
Моделируйте конкретную модель, используемую для завершения (например gpt-3.5-turbo-0301 )
Данные использования токенов, эти карты непосредственно открывают ответ на использование.
Если вы хотите сбросить историю сообщений в истории чата, есть простой вспомогательный метод:
chat . reset ( ) ;Обратите внимание, что этот метод является люком побега. Лучше просто создать новую сессию чата, если вы хотите сделать новый запрос с чистым сланцем. Сложная логика, в которой вы сбрасываете сеанс чата несколько раз, может быть трудно отслеживать и трудно отлаживать.
Обратите внимание, что если вы хотите обойти логику управления чатом Llamaflow и напрямую отправить запрос на подчеркнутую модель, вы можете отправить запрос на модель напрямую без создания чата:
const model = new OpenAI ( openAiConfig , modelConfig ) ;
const res = await model . request ( messages : Message [ ] , options : ChatRequestOptions ) ; Это обойдется любым управлением историей чата, быстрой форматированием и анализом, а также логикой персоны. Вы по -прежнему можете использовать функцию API Retries через ChatRequestOptions .