Ekstraksi terstruktur dalam naskah, ditenagai oleh LLMS, dirancang untuk kesederhanaan, transparansi, dan kontrol.
Selami dunia ekstraksi terstruktur berbasis naskah, oleh fungsi Openai yang memanggil API dan Zod, validasi skema first-first dengan inferensi tipe statis. Instruktur menonjol karena kesederhanaannya, transparansi, dan desain pengguna-sentris. Apakah Anda seorang pengembang berpengalaman atau baru memulai, Anda akan menemukan pendekatan instruktur yang intuitif dan dapat dikendalikan.
bun add @instructor-ai/instructor zod openai
npm i @instructor-ai/instructor zod openai
pnpm add @instructor-ai/instructor zod openai
Untuk memeriksa semua tips dan trik untuk meminta dan mengekstrak data, lihat dokumentasi.
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" }
Kelas utama untuk membuat klien instruktur.
createInstructor
function createInstructor < C extends GenericClient | OpenAI > ( args : {
client : OpenAILikeClient < C > ;
mode : Mode ;
debug ?: boolean ;
} ) : InstructorClient < C >
Membuat contoh kelas instruktur.
Mengembalikan klien seperti OpenAi yang diperluas.
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 > >
Ketika response_model hadir di params, membuat penyelesaian obrolan dengan ekstraksi terstruktur berdasarkan skema yang disediakan - jika tidak akan proxy kembali ke klien yang disediakan.
Instruktur mendukung berbagai mode untuk mendefinisikan struktur dan format respons dari model bahasa. Mode-mode ini didefinisikan dalam paket zod-stream
dan sebagai berikut:
FUNCTIONS
( sudah usang ): Menghasilkan respons menggunakan fungsi OpenAi Calling API. Ini memetakan ke parameter yang diperlukan untuk fungsi API panggilan fungsi, termasuk properti function_call
dan functions
.
TOOLS
: Menghasilkan respons menggunakan spesifikasi alat OpenAI. Ini membangun parameter yang diperlukan untuk spesifikasi alat, termasuk properti tool_choice
dan tools
.
JSON
: Ini menetapkan response_format
ke json_object
dan menyertakan skema JSON dalam pesan sistem untuk memandu generasi respons. (Together & AnyScale)
MD_JSON
: Menghasilkan respons dalam format JSON yang tertanam dalam blok kode markdown. Ini termasuk skema JSON dalam pesan sistem dan mengharapkan respons menjadi objek JSON yang valid yang dibungkus dalam blok kode markdown.
JSON_SCHEMA
: Menghasilkan respons menggunakan "mode JSON" yang sesuai dengan skema JSON yang disediakan. Ini menetapkan response_format
ke json_object
dengan skema yang disediakan dan menyertakan deskripsi skema dalam pesan sistem.
Instruktur mendukung penyelesaian streaming parsial, memungkinkan Anda untuk menerima data yang diekstraksi secara real-time saat model menghasilkan responsnya. Ini dapat berguna untuk memberikan pengalaman pengguna yang lebih interaktif atau memproses data dalam jumlah besar secara bertahap.
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 ( )
Dalam contoh ini, kami mendefinisikan ExtractionChema menggunakan ZOD untuk menentukan struktur data yang ingin kami ekstrak. Kami kemudian membuat klien instruktur dengan streaming diaktifkan dan meneruskan skema ke parameter respons_model.
Variabel ExtractionStream memegang generator async yang menghasilkan hasil ekstraksi parsial saat tersedia. Kami mengulangi aliran menggunakan untuk menunggu ... dari loop, memperbarui objek ExtractEddata dengan setiap hasil parsial dan mencatatnya ke konsol.
Akhirnya, kami mencatat data yang diekstraksi lengkap setelah aliran habis.
Instruktur mendukung berbagai penyedia yang mematuhi spesifikasi API OpenAI. Anda dapat dengan mudah beralih di antara penyedia dengan mengonfigurasi klien yang sesuai dan menentukan model dan mode yang diinginkan.
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 )
Bersama
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 )
Dalam contoh -contoh ini, kami menentukan URL dasar dan kunci API tertentu dari AnyScale, dan bersama -sama ..
Fungsi ExtractAser mengambil model, mode, dan penyedia sebagai parameter. Ini mengambil konfigurasi penyedia yang sesuai, membuat klien OpenAI, dan menginisialisasi instance instruktur dengan mode yang ditentukan.
Kami kemudian menghubungi instruktur.chat.
Dengan memvariasikan argumen penyedia, model, dan mode saat memanggil ExcxtructUser, Anda dapat dengan mudah beralih antara berbagai penyedia dan konfigurasi.
Instruktur mendukung integrasi dengan penyedia yang tidak mematuhi SDK OpenAI, seperti antropik, Azure, dan cohere, melalui perpustakaan llm-polyglot
yang dikelola oleh @Dimitrikennedy. Perpustakaan ini menyediakan antarmuka terpadu untuk berinteraksi dengan berbagai model bahasa di berbagai penyedia.
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 )
Dalam contoh ini, kami menggunakan fungsi CreateLmClient dari pustaka LLM-polyglot untuk membuat klien untuk penyedia antropik. Kami meneruskan nama penyedia ("Antropik") dan kunci API yang sesuai untuk fungsi tersebut.
Selanjutnya, kami mendefinisikan Userschema menggunakan ZOD untuk menentukan struktur data pengguna yang ingin kami ekstrak.
Kami membuat instance instruktur dengan melewati klien antropik dan mode yang diinginkan ke fungsi instruktur. Perhatikan bahwa kami menggunakan instruktur untuk menentukan jenis klien secara eksplisit.
Fungsi ExtractAser menunjukkan cara menggunakan instance instruktur untuk mengekstrak informasi pengguna dari input yang diberikan. Kami menyebut instruktur.chat.
Akhirnya, kami mencatat informasi pengguna yang diekstraksi.
Dengan memanfaatkan Perpustakaan LLM-Polyglot, instruktur memungkinkan integrasi yang mulus dengan berbagai penyedia di luar yang mengikuti Openai SDK. Ini memungkinkan Anda untuk memanfaatkan kemampuan unik dan model yang ditawarkan oleh penyedia yang berbeda sambil tetap mendapat manfaat dari ekstraksi terstruktur dan fitur validasi instruktur.
Untuk dukungan dan informasi tambahan tentang penggunaan penyedia lain dengan LLM-polyglot, silakan merujuk ke dokumentasi dan contoh perpustakaan.
Jika Anda ingin melihat lebih banyak, periksa buku masak kami.
Menginstal instruktur sangat mudah.
Instruktur dibangun di atas beberapa paket kuat dari Toolkit Pulau AI, dikembangkan dan dikelola oleh Dimitri Kennedy. Paket -paket ini memberikan fungsionalitas penting untuk penanganan dan streaming data terstruktur dengan model bahasa besar.
Zod-Stream adalah modul klien yang berinteraksi langsung dengan aliran LLM. Ini menggunakan skema-stream untuk parsing yang efisien dan dilengkapi dengan alat untuk memproses respons mentah dari openai, mengkategorikannya berdasarkan mode (fungsi, alat, JSON, dll.), Dan memastikan penanganan kesalahan dan konversi aliran yang tepat. Ini sangat ideal untuk integrasi API yang memberikan aliran respons LLM terstruktur.
Skema-Stream adalah parser streaming JSON yang secara bertahap membangun dan memperbarui model respons berdasarkan skema Zod. Ini dirancang untuk pemrosesan data real-time dan hidrasi model tambahan.
LLM-Polyglot adalah perpustakaan yang menyediakan antarmuka terpadu untuk berinteraksi dengan berbagai model bahasa di berbagai penyedia, seperti OpenAi, Antropik, Azure, dan Cohere. Ini menyederhanakan proses bekerja dengan beberapa penyedia LLM dan memungkinkan integrasi tanpa batas dengan instruktur.
Instruktur memanfaatkan kekuatan paket AI pulau ini untuk memberikan pengalaman yang mulus dan efisien untuk ekstraksi data terstruktur dan streaming dengan LLM. Kolaborasi antara Dimitri Kennedy, pencipta Pulau AI, dan Jason Liu, penulis paket instruktur asli Python, telah mengarah pada pengembangan versi Instruktur TypeScript, yang memperkenalkan konsep streaming JSON parsial dari LLM.
Untuk informasi lebih lanjut tentang Pulau AI dan paketnya, silakan merujuk ke repositori Pulau AI.
Pertanyaan menggunakan instruktur pada dasarnya adalah pertanyaan mengapa menggunakan Zod.
Bekerja dengan Openai SDK - Instruktur mengikuti API Openai. Ini berarti Anda dapat menggunakan API yang sama untuk diminta dan ekstraksi di beberapa penyedia yang mendukung API OpenAI.
Customizable - Zod sangat dapat disesuaikan. Anda dapat mendefinisikan validator Anda sendiri, pesan kesalahan khusus, dan banyak lagi.
Ecosystem Zod adalah pustaka validasi data yang paling banyak digunakan untuk TypeScript.
Tes Battle - Zod diunduh lebih dari 24 juta kali per bulan, dan didukung oleh komunitas kontributor besar.
Jika Anda ingin membantu, periksa beberapa masalah yang ditandai sebagai good-first-issue
atau help-wanted
. Ditemukan di sini. Mereka bisa berupa apa saja dari perbaikan kode, posting blog tamu, atau buku masak baru.
CHECKOUT Panduan Kontribusi untuk detail tentang cara mengatur segalanya, pengujian, perubahan, dan pedoman.
Kiat: Dukungan dalam bahasa lain
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!
Proyek ini dilisensikan berdasarkan ketentuan lisensi MIT.