跳到内容

使用 instructor 和 llama-cpp-python 生成结构化输出,完整指南

本指南演示如何使用 llama-cpp-python 和 Instructor 生成结构化输出。您将学习如何使用 JSON schema 模式和推测解码从本地 LLM 创建类型安全的响应。

开源 LLM 越来越受欢迎,而 llama-cpp-python 通过结合约束采样推测解码,使得 llama-cpp 模型可以通过 JSON schema 获取结构化输出。

他们还支持一个与 OpenAI 兼容的客户端,可以用作进程内机制来获取结构化输出,避免任何网络依赖。

补丁

Instructor 的补丁通过以下特性增强了 create 调用

  • create 调用中的 response_model,返回一个 pydantic 模型
  • create 调用中的 max_retries,使用退避策略在调用失败时重试

了解更多

要了解更多信息,请参阅文档。要理解在 Instructor 中使用 Pydantic 的好处,请访问为何使用 Pydantic页面的技巧和窍门部分。如果您想查看在 Instructor 中使用 Pydantic 的示例,请访问示例页面。

llama-cpp-python

最近 llama-cpp-python 添加了通过 JSON schema 模式支持结构化输出的功能。这是一种省时的方法,可以替代大量的提示工程,用于获取结构化输出。

在此示例中,我们将介绍 JSON_SCHEMA 模式的更高级用法,用于流式传输部分模型。要了解更多关于部分流式传输的信息,请查看部分流式传输。

import llama_cpp
import instructor
from llama_cpp.llama_speculative import LlamaPromptLookupDecoding
from pydantic import BaseModel


llama = llama_cpp.Llama(
    model_path="../../models/OpenHermes-2.5-Mistral-7B-GGUF/openhermes-2.5-mistral-7b.Q4_K_M.gguf",
    n_gpu_layers=-1,
    chat_format="chatml",
    n_ctx=2048,
    draft_model=LlamaPromptLookupDecoding(num_pred_tokens=2),
    logits_all=True,
    verbose=False,
)


create = instructor.patch(
    create=llama.create_chat_completion_openai_v1,
    mode=instructor.Mode.JSON_SCHEMA,
)


class UserDetail(BaseModel):
    name: str
    age: int


user = create(
    messages=[
        {
            "role": "user",
            "content": "Extract `Jason is 30 years old`",
        }
    ],
    response_model=UserDetail,
)

print(user)
#> name='Jason' age=30