跳到内容

使用 Writer 实现结构化输出:一个完整的指导(含 instructor)

本指南演示了如何使用 Writer 及其最新的 Palmyra-X-004 模型来实现结构化输出,以获得更可靠的系统输出。

你需要注册一个账户并获取 API 密钥。你可以在这里完成。

export WRITER_API_KEY=<your-api-key-here>
pip install "instructor[writer]"

Palmyra-X-004

Writer 通过其最新的 Palmyra-X-004 模型支持结构化输出,该模型引入了工具调用功能。

同步示例

import instructor
from writerai import Writer
from pydantic import BaseModel

# Initialize Writer client
client = instructor.from_writer(Writer(api_key="your API key"))


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


# Extract structured data
user = client.chat.completions.create(
    model="palmyra-x-004",
    messages=[{"role": "user", "content": "Extract: John is 30 years old"}],
    response_model=User,
)

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

异步示例

import instructor
from writerai import AsyncWriter
from pydantic import BaseModel

# Initialize Writer client
client = instructor.from_writer(AsyncWriter())


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


async def extract_user():
    # Extract structured data
    user = await client.chat.completions.create(
        model="palmyra-x-004",
        messages=[{"role": "user", "content": "Extract: John is 30 years old"}],
        response_model=User,
    )

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


if __name__ == "__main__":
    import asyncio

    asyncio.run(extract_user())

嵌套对象

Writer 还支持嵌套对象,这对于从更复杂的响应中提取数据非常有用。

import instructor
from writerai import Writer
from pydantic import BaseModel

# Initialize Writer client
client = instructor.from_writer(Writer())


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(
    model="palmyra-x-004",
    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
        """,
        },
    ],
    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. 可迭代对象:当您希望流式传输同一类型的对象列表时,这非常有用(例如,使用结构化输出提取多个用户)
  2. 部分流式传输:当您希望流式传输单个对象并希望在响应到达时立即开始处理它时,这非常有用。

我们目前支持 Writer 使用原生工具进行上述两种方法的流式传输。

部分流式传输

import instructor
from writerai import Writer
from pydantic import BaseModel

client = instructor.from_writer(Writer())


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


resp = client.chat.completions.create_partial(
    model="palmyra-x-004",
    messages=[
        {
            "role": "user",
            "content": "Ivan is 27 and lives in Singapore",
        }
    ],
    response_model=Person,
)

for person in resp:
    print(person)
    # > name=None age=None
    # > name='Ivan' age=None
    # > name='Ivan' age=27