为什么使用 Instructor?¶
为什么使用 Zod?
在回答为什么使用 Instructor 之前,很难不先回答 为什么使用 Zod。
-
由 OpenAI 提供支持 — Instructor 由 OpenAI 的函数调用 API 提供支持。这意味着你可以使用相同的 API 进行提示和提取。
-
可定制性 — Zod 具有高度可定制性。你可以定义自己的验证器、自定义错误消息等等。
-
生态系统 — Zod 是最广泛使用的 TypeScript 数据验证库。
-
经受考验 — Zod 每月下载量超过 2400 万次,并得到庞大贡献者社区的支持。如果你想用 Zod 做某事,很可能已经有人做过了。
我们的 OpenAI
类的 Instructor
客户端引入了三个关键增强功能:
- 响应模式:指定一个 Zod 模型来简化数据提取。
- 最大重试次数:设置请求所需的重试尝试次数。
- 验证上下文:提供一个上下文对象以增强验证器访问。 Instructor 能力一瞥
使用验证器
了解更多关于验证器的信息,请查看我们的博客文章 好的 LLM 验证就是好的验证
使用 Instructor,你的代码将变得更高效且更具可读性。这里快速预览一下:
理解 Instructor
类¶
让我们回顾一下 Instructor
类。看看如何利用它来使用 instructor。
步骤 1: 修补 OpenAI 客户端¶
首先,导入所需的库,并通过传入 OpenAI 客户端来构建 Instructor 类。这将通过 response_model
参数公开新功能。
import Instructor from "@instructor-ai/instructor";
import OpenAI from "openai"
import { z } from "zod"
// Create the OpenAI client
const oai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY ?? undefined,
organization: process.env.OPENAI_ORG_ID ?? undefined,
})
// This enables response_model keyword
// from client.chat.completions.create
const client = Instructor({
client: oai,
mode: "FUNCTIONS"
})
步骤 2: 定义 Zod 模型¶
创建一个 Zod 模型来定义你要提取的数据结构。这个模型将直接映射到提示中的信息。
import { z } from "zod"
const UserSchema = z.object({
age: z.number(),
name: z.string(),
})
type User = z.infer<typeof UserSchema>
步骤 3: 提取¶
使用 client.chat.completions.create
方法发送提示并将数据提取到 Zod 对象中。response_model
参数指定用于提取的 Zod 模式。最好使用响应模型的类型来注释变量,这将帮助你的 IDE 提供自动完成和拼写检查。
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 }
})
console.log(user)
// { age: 30, name: "Jason Liu" }
理解验证¶
本节正在进行中
本节正在进行中。考虑通过提交 PR 来贡献。
验证错误时的自我纠正¶
在这里,将 UserDetails
Zod 模式作为 response_model
传递,并将 max_retries
设置为 2。
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,
})
// Apply the patch to the OpenAI client
const client = Instructor({
client: oai,
mode: "FUNCTIONS"
})
// Use refine to ensure the name is uppercase
const UserDetails = z.object({
age: z.number(),
name: z.string().refine((v) => v.toUpperCase() === v, {
message: "Name must be in uppercase.",
}
})
const user = await client.chat.completions.create({
messages: [{ role: "user", content: "Extract jason is 30 years old" }],
model: "gpt-3.5-turbo",
response_model: { schema: UserDetails },
max_retries: 2,
})
console.log(user.name)
// JASON
如你所见,我们已经在模型中内置了自我纠正机制。这是一种强大的方法,可以使你的模型更健壮、不易出错,而无需包含大量额外的代码或提示。