由LLM驱动的打字稿中的结构化提取,为简单,透明度和控制而设计。
通过OpenAI的函数调用API和ZOD,使用静态类型推理验证了Typescript-First-First-Firt schema验证。教师的简单性,透明度和以用户为中心的设计而脱颖而出。无论您是经验丰富的开发人员还是刚开始,您都会发现教练的方法直观而可名。
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" }
创建讲师客户端的主要课程。
创建Instructor
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生成响应。它映射到函数调用API的必要参数,包括function_call
和functions
属性。
TOOLS
:使用OpenAI的工具规范生成响应。它为工具规范构建了所需的参数,包括tool_choice
和tools
属性。
JSON
:它将response_format
设置为json_object
,并在系统消息中包含JSON模式以指导响应生成。 (一起&Anyscale)
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定义了提取化学,以指定要提取的数据的结构。然后,我们创建一个具有流启用流的讲师客户端,然后将架构传递到with wospy_model参数。
ExtracionsTream变量具有异步发电机,可在可用时产生部分提取结果。我们使用A for等待循环在流上迭代流,更新ExtractedData对象,并将每个部分结果记录到控制台。
最后,一旦流耗尽,我们就会记录完整的提取数据。
讲师支持遵守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 )
在这些示例中,我们从Anyscale中指定了一个特定的基本URL和API键,并一起指定。
提取器函数将模型,模式和提供商作为参数。它检索相应的提供商配置,创建OpenAI客户端,并使用指定模式初始化指导员实例。
然后,我们使用所需模型,响应架构和其他参数来调用ersenter.chat.completions.create,以提取用户信息。
通过更改提供商,模型和模式参数时,可以在调用提取器时,可以轻松地在不同的提供商和配置之间切换。
讲师支持与不遵守OpenAI SDK的提供商的集成,例如通过@DiMitrikennedy维护的llm-polyglot
库,例如人类,Azure和Cohere。该库提供了一个统一的界面,用于与不同提供商之间的各种语言模型进行交互。
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函数为人类提供商创建客户端。我们将提供商名称(“拟人化”)和该功能的相应API键传递给。
接下来,我们使用ZOD定义一个用户chema来指定要提取的用户数据的结构。
我们通过将人类客户端和所需模式传递给教师函数来创建讲师实例。请注意,我们使用讲师明确指定客户端类型。
提取器函数演示了如何使用讲师实例从给定输入中提取用户信息。我们使用适当的模型(在这种情况下为“ Claude-3-Opus-20240229”),参数和包含包括我们用户Chema的响应的wenders_model调用ersenter.chat.completions.create。
最后,我们记录提取的用户信息。
通过利用LLM-PolyGlot库,讲师可以与超越遵循OpenAI SDK的提供商无缝集成。这使您可以利用不同提供商提供的独特功能和模型,同时仍能从教师的结构化提取和验证功能中受益。
有关使用LLM-PolyGlot使用其他提供商的其他支持和信息,请参阅图书馆的文档和示例。
如果您想查看更多查看我们的食谱。
安装教练很轻松。
教练建于岛上AI工具包的几个强大包装的顶部,由Dimitri Kennedy开发和维护。这些软件包为结构化数据处理和流媒体提供了重要的功能。
Zod-tream是直接与LLM流直接接口的客户端模块。它利用模式流进行有效解析,并配备了处理OpenAI的原始响应的工具,按模式(功能,工具,JSON等)对其进行分类,并确保正确处理和流转换。它是API集成提供结构化LLM响应流的理想选择。
模式流是一个JSON流解析器,可逐步构建基于ZOD模式的响应模型。它专为实时数据处理和增量模型水合而设计。
LLM-PolyGlot是一个库,它提供了一个统一的界面,用于与OpenAI,Anthropic,Azure和Cohere等不同提供商之间的各种语言模型进行交互。它简化了与多个LLM提供商合作的过程,并启用了与讲师的无缝集成。
讲师利用这些Island AI软件包的力量为结构化数据提取和使用LLMS提供了无缝且有效的体验。 Island AI的创建者Dimitri Kennedy与原始讲师Python套餐的作者Jason Liu之间的合作导致了TypeScript版本的讲师的开发,该版本介绍了LLM的部分JSON流的概念。
有关Island AI及其包装的更多信息,请参阅Island AI存储库。
使用讲师的问题从根本上说是为什么使用ZOD的问题。
与OpenAI SDK合作- 讲师遵循OpenAI的API。这意味着您可以在支持OpenAI API的多个提供商中使用相同的API来提示和提取。
可自定义- ZOD是高度可定制的。您可以定义自己的验证器,自定义错误消息等。
生态系统ZOD是使用最广泛使用的数据验证库。
战斗测试- ZOD每月下载超过240万次,并得到大量贡献者社区的支持。
如果您想提供帮助,请查看一些标记为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许可证的条款获得许可的。