使用 Writer 实现结构化输出:一个完整的指导(含 instructor)¶
本指南演示了如何使用 Writer 及其最新的 Palmyra-X-004 模型来实现结构化输出,以获得更可靠的系统输出。
你需要注册一个账户并获取 API 密钥。你可以在这里完成。
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 提供了两种主要的流式输出响应的方式:
- 可迭代对象:当您希望流式传输同一类型的对象列表时,这非常有用(例如,使用结构化输出提取多个用户)
- 部分流式传输:当您希望流式传输单个对象并希望在响应到达时立即开始处理它时,这非常有用。
我们目前支持 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