跳到内容

为什么使用 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

如你所见,我们已经在模型中内置了自我纠正机制。这是一种强大的方法,可以使你的模型更健壮、不易出错,而无需包含大量额外的代码或提示。