ZhuHai.Fun
outlines项目logo

开源大模型结构化输出:输出与正则表达式匹配或遵循 JSON 架构

开源大模型结构化输出:输出与正则表达式匹配或遵循 JSON 架构

结构化输出是现在AI应用中核心用例,一般大家在使用一些成熟的大模型接口时都可以通过参数去控制格式化输出Json,比如OpenAI接口中的response_format参数。 如何在部署自己的大模型中实现格式化输出,给大家推荐一个成熟的大模型结构化输出开源项目:outlines。 在24年8月6日,OpenAI发布了Introducing Structured Outputs in the API,也在测试中表示,gpt-4o-2024-08-06实现了100%的结构化输出。并且在文章中鸣谢了outlines项目。

为什么使用outlines结构化输出

如何使用outlines

安装与使用outlines

pip install outlines

初始化模型

import outlines

model = outlines.models.transformers(
    "microsoft/Phi-3-mini-4k-instruct",
    device="cuda"  # 将模型部署到GPU
)

结合pydantic模型,格式化输出

from enum import Enum
from pydantic import BaseModel, constr, conint

class Character(BaseModel):
    name: constr(max_length=10)
    age: conint(gt=18, lt=99)
    armor: (Enum('Armor', {'leather': 'leather', 'chainmail': 'chainmail', 'plate': 'plate'}))
    strength: conint(gt=1, lt=100)

generator = outlines.generate.json(model, Character)

character = generator(
    "Generate a new character for my awesome game: "
    + "name, age (between 1 and 99), armor and strength. "
    )
print(character)
# Character(name='Zara', age=25, armor=<Armor.leather: 'leather'>, strength=85)

结合VLLM框架使用outlines结构化输出

更友好的方式是我们可以结合VLLM大模型推理加速框架来使用outlines结构化输出并且兼容OpenAI的SDK.

示例启动VLLM服务指令:

vllm serve NousResearch/Meta-Llama-3-8B-Instruct --dtype auto --api-key token-abc123 --guided-decoding-backend outlines

更详细的指令可以参考VLLM文档

使用OpenAI的SDK调用模型示例代码:

import openai
from enum import Enum
from pydantic import BaseModel, constr, conint

class Character(BaseModel):
    name: constr(max_length=10)
    age: conint(gt=18, lt=99)
    armor: (Enum('Armor', {'leather': 'leather', 'chainmail': 'chainmail', 'plate': 'plate'}))
    strength: conint(gt=1, lt=100)

client = openai.OpenAI(base_url="http://localhost:8000/v1", api_key="token-abc123")

response = client.chat.completions.create(
    model="NousResearch/Meta-Llama-3-8B-Instruct",
    messages=[{"role": "user", "content": "Hello, world!"}],
    extra_body = {
        "guided_json": Character.model_json_schema()
    }
)

更多格式化输出示例

guided_json: Optional[Union[str, dict, BaseModel]] = Field(
    default=None,
    description=(
        "如果指定,输出将遵循 JSON 模式。"),
)

guided_regex: Optional[str] = Field(
    default=None,
    description=(
        "如果指定,输出将遵循正则表达式模式。"),
)

guided_choice: Optional[List[str]] = Field(
    default=None,
    description=(
        "如果指定,输出将是选项之一。"),
)

guided_grammar: Optional[str] = Field(
    default=None,
    description=(
        "如果指定,输出将遵循上下文无关语法。"),
)

guided_decoding_backend: Optional[str] = Field(
    default=None,
    description=(
        "如果指定,将覆盖服务器为此特定请求的默认引导解码后端。"),
)
分享文章

开源大模型结构化输出:输出与正则表达式匹配或遵循 JSON 架构

扫描二维码查看文章

ZhuHai.Fun