跳到内容

使用 Instructor 实现 Fireworks 的结构化输出,完整指南

Fireworks 提供高效且经济实惠的 AI 模型,具有企业级可靠性。本指南将向您展示如何将 Instructor 与 Fireworks 的模型结合使用,以获得类型安全且经过验证的响应。

快速入门

安装支持 Fireworks 的 Instructor

pip install "instructor[fireworks-ai]"

简单用户示例 (同步)

from fireworks.client import Fireworks
import instructor
from pydantic import BaseModel

# Initialize the client
client = Fireworks()

# Enable instructor patches
client = instructor.from_fireworks(client)


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


# Create structured output
user = client.chat.completions.create(
    messages=[
        {
            "role": "user",
            "content": "Extract: Jason is 25 years old",
        }
    ],
    model="accounts/fireworks/models/llama-v3-8b-instruct",
    response_model=User,
)

print(user)
# > User(name='Jason', age=25)

简单用户示例 (异步)

from fireworks.client import AsyncFireworks
import instructor
from pydantic import BaseModel
import asyncio

# Initialize async client
client = AsyncFireworks()

# Enable instructor patches
client = instructor.from_fireworks(client)


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


async def extract_user():
    user = await client.chat.completions.create(
        messages=[
            {
                "role": "user",
                "content": "Extract: Jason is 25 years old",
            }
        ],
        model="accounts/fireworks/models/llama-v3-8b-instruct",
        response_model=User,
    )
    return user


# Run async function
user = asyncio.run(extract_user())
print(user)  # User(name='Jason', age=25)

嵌套示例

from fireworks.client import Fireworks
import instructor
from pydantic import BaseModel


# Enable instructor patches
client = instructor.from_fireworks(Fireworks())


class Address(BaseModel):
    street: str
    city: str
    country: str


class User(BaseModel):
    name: str
    age: int
    addresses: list[Address]


# Create structured output with nested objects
user = client.chat.completions.create(
    messages=[
        {
            "role": "user",
            "content": """
                Extract: Jason is 25 years old.
                He lives at 123 Main St, New York, USA
                and has a summer house at 456 Beach Rd, Miami, USA
            """,
        }
    ],
    model="accounts/fireworks/models/llama-v3-8b-instruct",
    response_model=User,
)

print(user)
#> {
#>     'name': 'Jason',
#>     'age': 25,
#>     'addresses': [
#>         {
#>             'street': '123 Main St',
#>             'city': 'New York',
#>             'country': 'USA'
#>         },
#>         {
#>             'street': '456 Beach Rd',
#>             'city': 'Miami',
#>             'country': 'USA'
#>         }
#>     ]
#> }

流式支持

Instructor 提供两种主要的流式输出响应方式

  1. 可迭代对象(Iterables): 当您希望流式传输同类型对象的列表时,这非常有用(例如,使用结构化输出提取多个用户)
  2. 部分流式(Partial Streaming): 当您希望流式传输单个对象并希望在响应到达时立即开始处理时,这非常有用。

部分流式示例

from fireworks.client import Fireworks
import instructor
from pydantic import BaseModel


# Enable instructor patches
client = instructor.from_fireworks(Fireworks())


class User(BaseModel):
    name: str
    age: int
    bio: str


user = client.chat.completions.create_partial(
    model="accounts/fireworks/models/llama-v3-8b-instruct",
    messages=[
        {
            "role": "user",
            "content": "Create a user profile for Jason + 1 sentence bio, age 25",
        },
    ],
    response_model=User,
)

for user_partial in user:
    print(user_partial)
    # name=None age=None bio=None
    # name='Jason' age=None bio=None
    # name='Jason' age=25 bio="When he's"
    # name='Jason' age=25 bio="When he's not working as a graphic designer, Jason can usually be found trying out new craft beers or attempting to cook something other than ramen noodles."

可迭代示例

from fireworks.client import Fireworks
import instructor
from pydantic import BaseModel


# Enable instructor patches
client = instructor.from_fireworks(Fireworks())


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


# Extract multiple users from text
users = client.chat.completions.create_iterable(
    model="accounts/fireworks/models/llama-v3-8b-instruct",
    messages=[
        {
            "role": "user",
            "content": """
            Extract users:
            1. Jason is 25 years old
            2. Sarah is 30 years old
            3. Mike is 28 years old
        """,
        },
    ],
    response_model=User,
)

for user in users:
    print(user)

    # name='Jason' age=25
    # name='Sarah' age=30
    # name='Mike' age=28

Instructor 模式

我们提供几种模式,以便轻松使用 Fireworks 支持的不同响应模型

  1. instructor.Mode.FIREWORKS_JSON : 将原始文本补全解析为 pydantic 对象
  2. instructor.Mode.FIREWORKS_TOOLS : 使用 Fireworks 的工具调用 API 向客户端返回结构化输出

更新与兼容性

Instructor 保持与 Fireworks 最新 API 版本的兼容性。请查看更新日志以获取更新信息。

注意:在生产环境中实现流式功能之前,务必验证特定模型的功能和限制。