LLM으로 구동되는 TypeScript의 구조적 추출, 단순성, 투명성 및 제어를 위해 설계되었습니다.
OpenAI의 기능을 호출하여 API 및 ZOD를 호출하여 정적 단용 유추를 사용한 TypeScript 우선 스키마 검증을 통해 TypeScript 기반 구조 추출의 세계로 뛰어 들었습니다. 강사는 단순성, 투명성 및 사용자 중심 디자인으로 두드러집니다. 노련한 개발자이든 방금 시작하든 강사의 접근 방식은 직관적이고 조종 가능합니다.
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" }
강사 클라이언트를 만드는 메인 클래스.
CreateIntructor
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의 기능 호출 API를 사용하여 응답을 생성합니다. function_call
및 functions
속성을 포함하여 API를 호출하는 기능에 필요한 매개 변수에 맵핑됩니다.
TOOLS
: OpenAI의 도구 사양을 사용하여 응답을 생성합니다. tool_choice
및 tools
속성을 포함하여 도구 사양에 필요한 매개 변수를 구성합니다.
JSON
: response_format
json_object
로 설정하고 시스템 메시지에 JSON 스키마를 포함하여 응답 생성을 안내합니다. (함께 & 모든 규모)
MD_JSON
: Markdown 코드 블록에 포함 된 JSON 형식으로 응답을 생성합니다. 시스템 메시지에 JSON 스키마가 포함되어 있으며 응답이 Markdown 코드 블록에 싸인 유효한 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 매개 변수로 전달합니다.
추출 스트림 변수는 이용 가능한 부분 추출 결과를 산출하는 비동기 생성기를 보유합니다. 우리는 루프의 대기 ...에 대한 A를 사용하여 스트림을 반복하고, 각 부분 결과에 따라 추출 된 데이터 객체를 업데이트하고이를 콘솔에 기록합니다.
마지막으로 스트림이 소진되면 전체 추출 된 데이터를 기록합니다.
강사는 OpenAI API 사양을 준수하는 다양한 제공 업체를 지원합니다. 적절한 클라이언트를 구성하고 원하는 모델 및 모드를 지정하여 제공자간에 쉽게 전환 할 수 있습니다.
모든 규모
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 키를 지정합니다.
추출물 기능은 모델, 모드 및 제공자를 매개 변수로 취합니다. 해당 공급자 구성을 검색하고 OpenAI 클라이언트를 생성하며 지정된 모드로 강사 인스턴스를 초기화합니다.
그런 다음 orctuctor.chat.completions.come 사용자 정보를 추출하기 위해 원하는 모델, 응답 스키마 및 기타 매개 변수로 만듭니다.
ExtractUser를 호출 할 때 제공자, 모델 및 모드 인수를 변경하면 다른 공급자와 구성을 쉽게 전환 할 수 있습니다.
강사는 @dimitrikennedy가 관리하는 llm-polyglot
라이브러리를 통해 Openai SDK (예 : Anthropic, Azure 및 Cohere)와 같은 OpenAI SDK를 준수하지 않는 공급자와의 통합을 지원합니다. 이 라이브러리는 다른 제공 업체의 다양한 언어 모델과 상호 작용하기위한 통합 인터페이스를 제공합니다.
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 )
이 예에서는 LLM-Polyglot 라이브러리의 Createllmclient 함수를 사용하여 인류 제공 업체를위한 클라이언트를 만듭니다. 제공자 이름 ( "Anthropic")과 해당 API 키를 함수에 전달합니다.
다음으로, 우리는 ZOD를 사용하여 userschema를 정의하여 추출하려는 사용자 데이터의 구조를 지정합니다.
우리는 인류 클라이언트와 원하는 모드를 강사 기능에 전달하여 강사 인스턴스를 만듭니다. 강사를 사용하여 클라이언트 유형을 명시 적으로 지정합니다.
추출물 기능은 강사 인스턴스를 사용하여 주어진 입력에서 사용자 정보를 추출하는 방법을 보여줍니다. 우리는 강사를 호출합니다. chat.completions.cep userSchema를 포함하는 적절한 모델 ( "Claude-3-opus-20240229"), 매개 변수 및 응답 _model을 호출하십시오.
마지막으로 추출 된 사용자 정보를 기록합니다.
LLM-Polyglot 라이브러리를 활용하여 강사는 OpenAI SDK를 따르는 것 이상의 광범위한 공급 업체와 완벽한 통합을 가능하게합니다. 이를 통해 다른 제공 업체가 제공하는 고유 한 기능 및 모델을 활용하면서 강사의 구조화 된 추출 및 검증 기능으로부터 혜택을받을 수 있습니다.
LLM-Polyglot과 함께 다른 제공 업체 사용에 대한 추가 지원 및 정보는 라이브러리의 문서 및 예를 참조하십시오.
더보고 싶다면 요리 책을 확인하십시오.
강사를 설치하는 것은 산들 바람입니다.
강사는 Dimitri Kennedy가 개발하고 관리하는 Island AI Toolkit의 여러 강력한 패키지 위에 제작되었습니다. 이 패키지는 큰 언어 모델로 구조화 된 데이터 처리 및 스트리밍에 필수적인 기능을 제공합니다.
Zod-stream은 LLM 스트림과 직접 인터페이스하는 클라이언트 모듈입니다. 그것은 효율적인 구문 분석을 위해 스키마-스트림을 사용하고 OpenAI에서 원시 응답을 처리하고 모드별로 분류하고 (기능, 도구, JSON 등) 적절한 오류 처리 및 스트림 변환을 보장하는 도구가 장착되어 있습니다. 구조화 된 LLM 응답 스트림을 제공하는 API 통합에 이상적입니다.
Schema-Stream은 ZOD 스키마를 기반으로 응답 모델을 점진적으로 구성하고 업데이트하는 JSON 스트리밍 파서입니다. 실시간 데이터 처리 및 증분 모델 수화를 위해 설계되었습니다.
LLM-Polyglot은 OpenAi, Anthropic, Azure 및 Cohere와 같은 다양한 제공 업체의 다양한 언어 모델과 상호 작용하기위한 통합 인터페이스를 제공하는 라이브러리입니다. 여러 LLM 제공 업체와 협력하는 프로세스를 단순화하고 강사와의 원활한 통합을 가능하게합니다.
강사는이 섬 AI 패키지의 힘을 활용하여 구조화 된 데이터 추출 및 LLMS 스트리밍에 대한 원활하고 효율적인 경험을 제공합니다. Island AI의 제작자 인 Dimitri Kennedy와 원래 강사 Python 패키지의 저자 인 Jason Liu 간의 협력은 LLM에서 부분 JSON 스트리밍 개념을 소개하는 강사의 TypeScript 버전을 개발했습니다.
Island AI 및 그 패키지에 대한 자세한 내용은 Island AI 저장소를 참조하십시오.
강사 사용에 대한 문제는 근본적으로 Zod를 사용해야하는 이유에 대한 문제입니다.
OpenAi SDK와 함께 작동 - 강사는 OpenAI의 API를 따릅니다. 즉, OpenAI API를 지원하는 여러 제공 업체에서 프롬프트 및 추출에 동일한 API를 사용할 수 있습니다.
사용자 정의 가능 - ZOD는 사용자 정의 가능합니다. 자신의 유효성 검사기, 사용자 정의 오류 메시지 등을 정의 할 수 있습니다.
Ecosystem ZOD는 TypeScript에 가장 널리 사용되는 데이터 검증 라이브러리입니다.
전투 테스트 - ZOD는 한 달에 24m 이상 다운로드되며 대규모 기고자 커뮤니티가 지원합니다.
도움을주고 싶다면 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 라이센스의 조건에 따라 라이센스가 부여됩니다.