Структурированная извлечение в TypeScript, питаемое с помощью LLMS, предназначенное для простоты, прозрачности и управления.
Погрузитесь в мир структурированной экстракции на основе типовой записи, с помощью функции OpenAI, вызывая API и ZOD, проверка схемы в типовойписах со статическим выводом. Инструктор выделяется своей простотой, прозрачностью и ориентированным на пользователя дизайна. Будь вы опытный разработчик или только начинаете, вы найдете подход инструктора интуитивно понятным и управляемым.
bun add @instructor-ai/instructor zod openai
npm i @instructor-ai/instructor zod openai
pnpm add @instructor-ai/instructor zod openai
Чтобы проверить все советы и хитрости, чтобы вызвать и извлечь данные, ознакомьтесь с документацией.
import Instructor from "@instructor-ai/instructor" ;
import OpenAI from "openai"
import { z } from "zod"
const oai = new OpenAI ( {
apiKey : process . env . OPENAI_API_KEY ?? undefined ,
organization : process . env . OPENAI_ORG_ID ?? undefined
} )
const client = Instructor ( {
client : oai ,
mode : "TOOLS"
} )
const UserSchema = z . object ( {
// Description will be used in the prompt
age : z . number ( ) . describe ( "The age of the user" ) ,
name : z . string ( )
} )
// User will be of type z.infer<typeof UserSchema>
const user = await client . chat . completions . create ( {
messages : [ { role : "user" , content : "Jason Liu is 30 years old" } ] ,
model : "gpt-3.5-turbo" ,
response_model : {
schema : UserSchema ,
name : "User"
}
} )
console . log ( user )
// { age: 30, name: "Jason Liu" }
Основной класс для создания инструктора.
CreateInstructor
function createInstructor < C extends GenericClient | OpenAI > ( args : {
client : OpenAILikeClient < C > ;
mode : Mode ;
debug ?: boolean ;
} ) : InstructorClient < C >
Создает экземпляр класса инструкторов.
Возвращает расширенный клиент, похожий на Openai.
чат.completions.create
chat . completions . create <
T extends z . AnyZodObject ,
P extends T extends z . AnyZodObject ? ChatCompletionCreateParamsWithModel < T >
: ClientTypeChatCompletionParams < OpenAILikeClient < C > > & { response_model : never }
> (
params : P
) : Promise < ReturnTypeBasedOnParams < typeof this . client , P > >
Когда в параметрах присутствует response_model, создает завершение чата со структурированной извлечением на основе предоставленной схемы - в противном случае будет прокси обратно в предоставленный клиент.
Преподаватель поддерживает различные режимы для определения структуры и формата ответа из языковой модели. Эти режимы определены в пакете zod-stream
и следующие:
FUNCTIONS
( устаревшие ): генерирует ответ, используя API функции OpenAI. Он отображает необходимые параметры для API вызова функции, включая свойства function_call
и functions
.
TOOLS
: генерирует ответ с помощью спецификации инструмента Openai. Он строит необходимые параметры для спецификации инструмента, включая свойства tool_choice
и tools
.
JSON
: он устанавливает response_format
на json_object
и включает в себя схему JSON в системном сообщении, чтобы направлять генерацию ответов. (Вместе и AnlyScale)
MD_JSON
: генерирует ответ в формате JSON, встроенный в блок кода разметки. Он включает в себя схему JSON в системном сообщении и ожидает, что ответ будет действительным объектом JSON, завернутым в блок кода разметки.
JSON_SCHEMA
: генерирует ответ с использованием «режима JSON», который соответствует предоставленной схеме JSON. Он устанавливает response_format
для json_object
с предоставленной схемой и включает в себя описание схемы в системном сообщении.
Преподаватель поддерживает частичные потоковые завершения, позволяя получать извлеченные данные в режиме реального времени, поскольку модель генерирует свой ответ. Это может быть полезно для обеспечения более интерактивного пользовательского опыта или обработки больших объемов данных постепенно.
import Instructor from "@instructor-ai/instructor"
import OpenAI from "openai"
import { z } from "zod"
const textBlock = `
In our recent online meeting, participants from various backgrounds joined to discuss the upcoming tech conference.
The names and contact details of the participants were as follows:
- Name: John Doe, Email: [email protected], Twitter: @TechGuru44
- Name: Jane Smith, Email: [email protected], Twitter: @DigitalDiva88
- Name: Alex Johnson, Email: [email protected], Twitter: @CodeMaster2023
During the meeting, we agreed on several key points. The conference will be held on March 15th, 2024, at the Grand Tech Arena located at 4521 Innovation Drive. Dr. Emily Johnson, a renowned AI researcher, will be our keynote speaker. The budget for the event is set at $50,000, covering venue costs, speaker fees, and promotional activities.
Each participant is expected to contribute an article to the conference blog by February 20th. A follow-up meeting is scheduled for January 25th at 3 PM GMT to finalize the agenda and confirm the list of speakers.
`
async function extractData ( ) {
const ExtractionSchema = z . object ( {
users : z . array (
z . object ( {
name : z . string ( ) ,
handle : z . string ( ) ,
twitter : z . string ( )
} )
) . min ( 3 ) ,
location : z . string ( ) ,
budget : z . number ( )
} )
const oai = new OpenAI ( {
apiKey : process . env . OPENAI_API_KEY ?? undefined ,
organization : process . env . OPENAI_ORG_ID ?? undefined
} )
const client = Instructor ( {
client : oai ,
mode : "TOOLS"
} )
const extractionStream = await client . chat . completions . create ( {
messages : [ { role : "user" , content : textBlock } ] ,
model : "gpt-3.5-turbo" ,
response_model : {
schema : ExtractionSchema ,
name : "Extraction"
} ,
max_retries : 3 ,
stream : true
} )
let extractedData = { }
for await ( const result of extractionStream ) {
extractedData = result
console . log ( "Partial extraction:" , result )
}
console . log ( "Final extraction:" , extractedData )
}
extractData ( )
В этом примере мы определяем экстракции, используя ZOD, чтобы указать структуру данных, которые мы хотим извлечь. Затем мы создаем клиент -инструктор с включенной потоковой передачей и передаем схему параметру response_model.
Переменная экстракции содержит асинхровый генератор, который дает частичную извлечение результатов по мере их появления. Мы итерации по потоку, используя для ожидания ... из цикла, обновляя объект ExtractedData с каждым частичным результатом и регистрируя его в консоли.
Наконец, мы регистрируем полные извлеченные данные после того, как поток исчерпан.
Преподаватель поддерживает различных поставщиков, которые придерживаются спецификации API OpenAI. Вы можете легко переключаться между поставщиками, настраивая соответствующий клиент и указав нужную модель и режим.
AnyScale
import Instructor from "@instructor-ai/instructor"
import OpenAI from "openai"
import { z } from "zod"
const UserSchema = z . object ( {
age : z . number ( ) ,
name : z . string ( ) . refine ( name => name . includes ( " " ) , {
message : "Name must contain a space"
} )
} )
async function extractUser ( ) {
const client = new OpenAI ( {
baseURL : "https://api.endpoints.anyscale.com/v1" ,
apiKey : process . env . ANYSCALE_API_KEY
} )
const instructor = Instructor ( {
client : client ,
mode : "TOOLS"
} )
const user = await instructor . chat . completions . create ( {
messages : [ { role : "user" , content : "Jason Liu is 30 years old" } ] ,
model : "mistralai/Mixtral-8x7B-Instruct-v0.1" ,
response_model : {
schema : UserSchema ,
name : "User"
} ,
max_retries : 4
} )
return user
}
const anyscaleUser = await extractUser ( )
console . log ( "Anyscale user:" , anyscaleUser )
Вместе
import Instructor from "@instructor-ai/instructor"
import OpenAI from "openai"
import { z } from "zod"
const UserSchema = z . object ( {
age : z . number ( ) ,
name : z . string ( ) . refine ( name => name . includes ( " " ) , {
message : "Name must contain a space"
} )
} )
async function extractUser ( ) {
const client = new OpenAI ( {
baseURL : "https://api.together.xyz/v1" ,
apiKey : process . env . TOGETHER_API_KEY
} )
const instructor = Instructor ( {
client : client ,
mode : "TOOLS"
} )
const user = await instructor . chat . completions . create ( {
messages : [ { role : "user" , content : "Jason Liu is 30 years old" } ] ,
model : "mistralai/Mixtral-8x7B-Instruct-v0.1" ,
response_model : {
schema : UserSchema ,
name : "User"
} ,
max_retries : 4
} )
return user
}
const togetherUser = await extractUser ( )
console . log ( "Together user:" , togetherUser )
В этих примерах мы указываем определенный базовый URL и ключ API из Antscale и вместе.
Функция ExtractUser принимает модель, режим и поставщик в качестве параметров. Он получает соответствующую конфигурацию поставщика, создает клиент OpenAI и инициализирует экземпляр инструктора с указанным режимом.
Затем мы называем Tranctor.chat.completions.create с желаемой моделью, схемой ответа и другими параметрами для извлечения пользовательской информации.
Изменяя аргументы поставщика, модели и режима при вызове ExtractUser, вы можете легко переключаться между различными поставщиками и конфигурациями.
Преподаватель поддерживает интеграцию с поставщиками, которые не придерживаются SDK OpenAI, такими как антропный, лазурный и кожух, через библиотеку llm-polyglot
поддерживаемая @Dimitrikennedy. Эта библиотека предоставляет унифицированный интерфейс для взаимодействия с различными языковыми моделями в разных поставщиках.
import { createLLMClient } from "llm-polyglot"
import Instructor from "@instructor-ai/instructor"
import { z } from "zod"
const anthropicClient = createLLMClient ( {
provider : "anthropic" ,
apiKey : process . env . ANTHROPIC_API_KEY
} )
const UserSchema = z . object ( {
age : z . number ( ) ,
name : z . string ( )
} )
const instructor = Instructor < typeof anthropicClient > ( {
client : anthropicClient ,
mode : "TOOLS"
} )
async function extractUser ( ) {
const user = await instructor . chat . completions . create ( {
model : "claude-3-opus-20240229" ,
max_tokens : 1000 ,
messages : [
{
role : "user" ,
content : "My name is Dimitri Kennedy."
}
] ,
response_model : {
name : "extract_name" ,
schema : UserSchema
}
} )
return user
}
// Example usage
const extractedUser = await extractUser ( )
console . log ( "Extracted user:" , extractedUser )
В этом примере мы используем функцию CreaterllmClient из библиотеки LLM-Polyglot, чтобы создать клиента для антропного поставщика. Мы передаем имя поставщика («антроп») и соответствующий ключ API к функции.
Далее мы определяем пользовательский учеб с использованием ZOD, чтобы указать структуру пользовательских данных, которые мы хотим извлечь.
Мы создаем экземпляр инструктора, передавая антропного клиента и желаемый режим функции инструктора. Обратите внимание, что мы используем инструктор для явного указания типа клиента.
Функция ExtractUser демонстрирует, как использовать экземпляр инструктора для извлечения пользовательской информации из данного ввода. Мы называем Tranctor.chat.completions.create с соответствующей моделью («Claude-3-Opus-201240229» в данном случае), параметры и response_model, который включает в себя нашу пользовательскуюшемлую.
Наконец, мы регистрируем извлеченную информацию пользователя.
Используя библиотеку LLM-Polyglot, инструктор обеспечивает бесшовную интеграцию с широким спектром поставщиков, помимо тех, которые следуют за SDK OpenAI. Это позволяет вам воспользоваться уникальными возможностями и моделями, предлагаемыми различными поставщиками, в то же время получая выгоду от структурированных функций извлечения и проверки инструктора.
Для получения дополнительной поддержки и информации об использовании других поставщиков с LLM-PolyGlot, пожалуйста, обратитесь к документации и примерам библиотеки.
Если вы хотите увидеть больше, загляните в нашу кулинарную книгу.
Установка инструктора - это бриз.
Преподаватель построен на вершине нескольких мощных пакетов из инструментария Ай -Ай на острове, разработанных и поддерживаемых Дмитрием Кеннеди. Эти пакеты обеспечивают важную функциональность для обработки и потоковой передачи структурированных данных с большими языковыми моделями.
ZOD-Stream-это клиентский модуль, который напрямую взаимодействует с потоками LLM. Он использует Stram для эффективного анализа и оснащен инструментами для обработки необработанных ответов от OpenaI, классифицируя их по режиму (функциям, инструментам, JSON и т. Д.), А также обеспечивая правильную обработку ошибок и преобразование потока. Он идеально подходит для интеграции API, обеспечивающей структурированные потоки откликов LLM.
Schema-Stream-это анализатор потоковой передачи JSON, который постепенно строит и обновляет модели ответов на основе схемы ZOD. Он предназначен для обработки данных в реальном времени и инкрементной модели гидратации.
LLM-Polyglot-это библиотека, которая обеспечивает унифицированный интерфейс для взаимодействия с различными языковыми моделями в разных поставщиках, таких как OpenAI, антропов, лазурь и COURE. Он упрощает процесс работы с несколькими поставщиками LLM и обеспечивает бесшовную интеграцию с инструктором.
Преподаватель использует мощность этих пакетов AIS AIS на острове для обеспечения бесшовного и эффективного опыта для извлечения и потоковой передачи структурированных данных с помощью LLMS. Сотрудничество между Дмитрием Кеннеди, создателем Ай -Ай острова, и Джейсоном Лю, автором оригинального преподавателя Python Package, привело к разработке типовой версии инструктора, которая представляет концепцию частичного потока JSON от LLM.
Для получения дополнительной информации об Ай -Ай островах и его пакетах, пожалуйста, обратитесь к репозиторию Ай острова.
Вопрос об использовании инструктора - это в основном вопрос о том, почему использовать ZOD.
Работает с Openai SDK - инструктор следует за API Openai. Это означает, что вы можете использовать один и тот же API как для подсказки, так и для извлечения для нескольких поставщиков, которые поддерживают API OpenAI.
Настраиваемый - ZOD очень настраивается. Вы можете определить свои собственные валидаторы, пользовательские сообщения об ошибках и многое другое.
Ecosystem ZOD является наиболее широко используемой библиотекой проверки данных для TypeScript.
Проверка боя - ZOD загружается более 24 м раз в месяц и поддерживается крупным сообществом участников.
Если вы хотите помочь, проверьте некоторые проблемы, отмеченные как good-first-issue
или help-wanted
. Найдено здесь. Они могут быть чем угодно от улучшений кода, гостевого сообщения в блоге или новой кулинарной книги.
Ознакомьтесь с руководством взносов для получения подробной информации о том, как установить вещи, тестирование, изменения и руководящие принципы.
Совет: поддержка на других языках
Check out ports to other languages below:
- [Python](https://www.github.com/jxnl/instructor)
- [Elixir](https://github.com/thmsmlr/instructor_ex/)
If you want to port Instructor to another language, please reach out to us on [Twitter](https://twitter.com/jxnlco) we'd love to help you get started!
Этот проект лицензирован в соответствии с условиями лицензии MIT.