استخراج منظم في TypeScript ، مدعوم من LLMs ، المصممة للبساطة والشفافية والتحكم.
الغطس في عالم الاستخراج المهيكلة القائم على TypeScript ، من خلال وظيفة API و ZOD من Openai ، والتحقق من صحة مخطط TypeScript-First مع استنتاج نوع ثابت. يبرز المدرب بساطته وشفافيته وتصميمه المتمحور حول المستخدم. سواء كنت مطورًا محنكًا أو بدأت للتو ، ستجد نهج المدرب بديهية ومبهجة.
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" }
الفصل الرئيسي لإنشاء عميل مدرب.
CreateStructor
function createInstructor < C extends GenericClient | OpenAI > ( args : {
client : OpenAILikeClient < C > ;
mode : Mode ;
debug ?: boolean ;
} ) : InstructorClient < C >
ينشئ مثيل فئة المدرب.
إرجاع العميل الممتد الذي يشبه Openai.
chat.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
( تم إهمالها ): يولد استجابة باستخدام واجهة برمجة تطبيقات وظيفة Openai. يقوم بتعيين المعلمات اللازمة لاتصالات استدعاء الوظيفة ، بما في ذلك خصائص function_call
functions
.
TOOLS
: إنشاء استجابة باستخدام مواصفات أداة Openai. يقوم بإنشاء المعلمات المطلوبة لمواصفات الأداة ، بما في ذلك خصائص tool_choice
و tools
.
JSON
: يقوم بتعيين response_format
على json_object
ويتضمن مخطط JSON في رسالة النظام لتوجيه توليد الاستجابة. (معا وأيسي)
MD_JSON
: ينشئ استجابة بتنسيق JSON مضمن ضمن كتلة رمز Markdown. ويتضمن مخطط JSON في رسالة النظام ويتوقع أن يكون الاستجابة كائن JSON صالح ملفوف في كتلة رمز Markdown.
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 ( )
في هذا المثال ، نقوم بتعريف extractionschema باستخدام ZOD لتحديد بنية البيانات التي نريد استخراجها. نقوم بعد ذلك بإنشاء عميل مدرب مع تمكين البث ونمر المخطط إلى معلمة Response_Model.
يحمل متغير extractionsstream مولدًا غير متزامن يعطي نتائج الاستخراج الجزئي عند توفرها. نحن نكرر فوق الدفق باستخدام A for earait ... من الحلقة ، وتحديث كائن 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 من AnyScale ، والبعض الآخر ..
تأخذ دالة الاستخراج النموذج والوضع والمزود كمعلمات. يسترجع تكوين الموفر المقابل ، ويقوم بإنشاء عميل OpenAI ، ويهيئة مثيل المدرب مع الوضع المحدد.
ثم نقوم بالاتصال بالمدرب.
من خلال تغيير وسيطات الموفر والنموذج والوضع عند استدعاء المستخلص ، يمكنك بسهولة التبديل بين مقدمي الخدمات والتكوينات المختلفين.
يدعم المدرب التكامل مع مقدمي الخدمات الذين لا يلتزمون بـ Openai SDK ، مثل الأنثروبور ، والأزور ، و Cohere ، من خلال مكتبة 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 )
في هذا المثال ، نستخدم وظيفة CreatellMclient من مكتبة LLM-Polyglot لإنشاء عميل لمزود الإنسان. نمرر اسم الموفر ("الأنثروبولوجيا") ومفتاح API المقابل للوظيفة.
بعد ذلك ، نحدد usterveschema باستخدام ZOD لتحديد بنية بيانات المستخدم التي نريد استخراجها.
نقوم بإنشاء مثيل مدرب من خلال تمرير العميل الإنساني والوضع المطلوب لوظيفة المدرب. لاحظ أننا نستخدم المدرب لتحديد نوع العميل بشكل صريح.
توضح وظيفة ExtractUser كيفية استخدام مثيل المدرب لاستخراج معلومات المستخدم من إدخال معين. نحن ندعو المعلم.
أخيرًا ، نقوم بتسجيل معلومات المستخدم المستخرجة.
من خلال الاستفادة من مكتبة LLM-Polyglot ، يتيح المدرب تكاملًا سلسًا مع مجموعة واسعة من مقدمي الخدمات خارج أولئك الذين يتبعون Openai SDK. يتيح لك ذلك الاستفادة من القدرات والنماذج الفريدة التي يقدمها مقدمو الخدمات المختلفين مع الاستفادة من ميزات الاستخراج والتحقق من صحة منظمة.
للحصول على دعم إضافي ومعلومات حول استخدام مقدمي الخدمات الآخرين مع LLM-Polyglot ، يرجى الرجوع إلى وثائق المكتبة وأمثلة.
إذا كنت ترغب في رؤية المزيد تحقق من كتاب الطبخ الخاص بنا.
تثبيت المدرب هو نسيم.
تم بناء المدرب فوق عدة حزم قوية من مجموعة أدوات الجزيرة AI ، التي تم تطويرها وصيانتها بواسطة Dimitri Kennedy. توفر هذه الحزم وظائف أساسية لمعالجة البيانات المنظمة وتدفقها مع نماذج لغة كبيرة.
Zod-Stream هي وحدة عميل تتفاعل مباشرة مع تدفقات LLM. إنه يستخدم دفق المخطط لتحليل فعال ومجهز بأدوات لمعالجة الاستجابات الخام من Openai ، وتصنيفها حسب الوضع (الوظيفة ، والأدوات ، و JSON ، إلخ) ، وضمان معالجة الأخطاء المناسبة وتحويل الدفق. إنه مثالي لتكامل واجهة برمجة التطبيقات التي تقدم تدفقات استجابة LLM منظمة.
Schema-Stream هو محلل دفق JSON يقوم ببناء نماذج الاستجابة وتحديثها بشكل تدريجي على أساس مخططات ZOD. تم تصميمه لمعالجة البيانات في الوقت الفعلي وترطيب النموذج الإضافي.
LLM-Polyglot هي مكتبة توفر واجهة موحدة للتفاعل مع نماذج اللغة المختلفة عبر مختلف مقدمي الخدمات ، مثل Openai ، Anthropic ، Azure ، و Cohere. إنه يبسط عملية العمل مع مقدمي LLM المتعددين ويمكّن التكامل السلس مع المدرب.
يقوم المدرب بالاستفادة من قوة حزم AI الجزيرة هذه لتقديم تجربة سلسة وفعالة لاستخراج البيانات المهيكلة وتدفق مع LLMs. أدى التعاون بين Dimitri Kennedy ، منشئ Island AI ، وجيسون ليو ، مؤلف حزمة المدرب الأصلي Python ، إلى تطوير إصدار TypeScript من المدرب ، الذي يقدم مفهوم البث الجزئي JSON من LLM.
لمزيد من المعلومات حول جزيرة الذكاء الاصطناعي وحزمها ، يرجى الرجوع إلى مستودع جزيرة الذكاء الاصطناعي.
إن مسألة استخدام المدرب هي في الأساس مسألة سبب استخدام Zod.
يعمل مع Openai SDK - المدرب يتبع API Openai. هذا يعني أنه يمكنك استخدام واجهة برمجة التطبيقات نفسها لكل من المطالبة والاستخراج عبر العديد من مقدمي الخدمات التي تدعم API Openai.
قابل للتخصيص - Zod قابلة للتخصيص للغاية. يمكنك تحديد المدققين الخاصة بك ورسائل الخطأ المخصصة والمزيد.
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!
هذا المشروع مرخص بموجب شروط ترخيص معهد ماساتشوستس للتكنولوجيا.