为何说 Instructor 是最适合结构化 LLM 输出的库¶
大型语言模型 (LLM),例如 GPTs,功能强大得令人难以置信,但处理其开放式文本输出可能具有挑战性。这正是 Instructor 库大放异彩的地方——它允许您使用 Python 类型注解轻松地将 LLM 输出映射到结构化数据。
Instructor 背后的核心思想非常简单:它只是对 OpenAI Python SDK 的一个补丁,增加了一个 response_model 参数。这个参数允许您传入一个 Pydantic 模型,该模型描述了您希望 LLM 输出映射到的结构。Pydantic 模型是使用标准的 Python 类型提示定义的,因此无需学习任何新语法。
这里是一个从 LLM 提取结构化用户数据的示例
from pydantic import BaseModel
import instructor
class User(BaseModel):
name: str
age: int
client = instructor.from_openai(openai.OpenAI())
user = client.chat.completions.create(
model="gpt-3.5-turbo",
response_model=User, # (1)!
messages=[
{
"role": "user",
"content": "Extract the user's name and age from this: John is 25 years old",
}
],
)
print(user) # (2)!
#> User(name='John', age=25)
- 请注意,现在我们有一个新的 response_model 参数,可以将其传递给 completions.create 方法。这个参数允许我们指定希望 LLM 输出映射到的结构。在本例中,我们正在使用一个名为 User 的 Pydantic 模型,它描述了用户的姓名和年龄。
- completions.create 方法的输出是一个 User 对象,与我们在 response_model 参数中指定的结构相匹配,而不是一个 ChatCompletion。
其他特性¶
Instructor 在库内外的其他特性包括
- 能够在重试逻辑中使用 Tenacity
- 能够使用 Pydantic 的验证上下文
- 具有正确类型的并行工具调用
- 流式传输部分和可迭代数据。
- 还可以返回原始类型和联合类型!
- 在我们的集成指南中有大量的代码示例集、教程和全面的文档
Instructor 的广泛适用性¶
Instructor 的主要优势之一是它被设计为对官方 OpenAI Python SDK 的轻量级补丁。这意味着它不仅可以轻松集成到 OpenAI 的托管 API 服务,还可以集成到任何公开与 OpenAI SDK 兼容接口的提供商或平台。
例如,像 Together、Ollama、Groq 和 llama-cpp-python 等提供商都在底层使用或模仿 OpenAI Python SDK。通过 Instructor 的零开销补丁方法,团队可以立即开始从这些提供商中的任何一个获取结构化数据输出。无需进行定制集成工作。
直接访问 messages 数组¶
与其他抽象掉 messages=[...]
参数的库不同,Instructor 提供直接访问。这种直接方法有助于进行复杂的 Prompt 工程,确保与 OpenAI 不断发展的消息类型兼容,包括将来对图像、音频或视频的支持,而没有字符串格式化的限制。
低抽象¶
Instructor 之所以如此强大,在于它与现有的 OpenAI SDK 代码无缝集成。要使用它,您只需在您的 OpenAI 客户端实例上调用 instructor.from_openai(),然后就可以继续使用 response_model 参数了。无需进行复杂的重构或理解新的抽象概念。
这种渐进式、零开销的采用路径使得 Instructor 非常适合将结构化 LLM 输出注入到现有的基于 OpenAI 的应用程序中。您可以从简单的 Prompt 开始提取数据模型,然后逐步扩展到更复杂的层次模型、流式输出和自定义验证。
如果您最终认为 Instructor 不太适合,移除它也很简单,只需不应用该补丁即可!直接使用 OpenAI SDK 的熟悉度和灵活性是其核心优势。
Instructor 解决了非结构化 LLM 输出带来的“字符串地狱”。它允许团队通过将其文本映射到类型安全、经过验证的数据结构,轻松地发挥 GPTs 等工具的全部潜力。如果您希望从 LLM 中获得更结构化的价值,不妨试试 Instructor!