使用链式调用进行结构化输出推理
最初发布的(2024 年 9 月)o1 推理模型版本具有先进的功能,但不支持结构化输出。
这意味着使用 o1 的请求没有可靠的类型安全,并且依赖于提示本身来返回有用的 JSON。
在本指南中,我们将探讨两种提示 o1 模型的方法,特别是 o1-preview
,在使用 OpenAI API 时返回有效的 JSON 格式。
提示
使用 o1-preview
返回 JSON 响应的最简单方法是明确提示它。
让我们通过一个示例来运行:
- 获取公司维基百科页面
- 确定哪些公司可以从人工智能能力中受益最多
- 以 JSON 格式返回它们,然后可以由其他系统进行处理
import requests
from openai import OpenAI
client = OpenAI()
def fetch_html(url):
response = requests.get(url)
if response.status_code == 200:
return response.text
else:
return None
url = "https://en.wikipedia.org/wiki/List_of_largest_companies_in_the_United_States_by_revenue"
html_content = fetch_html(url)
json_format = """
{
companies: [
{
\"company_name\": \"OpenAI\",
\"page_link\": \"https://en.wikipedia.org/wiki/OpenAI\",
\"reason\": \"OpenAI would benefit because they are an AI company...\"
}
]
}
"""
o1_response = client.chat.completions.create(
model="o1-preview",
messages=[
{
"role": "user",
"content": f"""
你是一位商业分析师,旨在了解人工智能技术如何在大型企业中应用。
- 阅读以下 html 并返回哪些公司将受益于使用人工智能技术:{html_content}。
- 通过比较来按机会对这些前景进行排名,并向我展示前 3 名。仅以以下格式的 JSON 返回:{json_format}
"""
}
]
)
print(o1_response.choices[0].message.content)
{
"companies": [
{
"company_name": "Walmart",
"page_link": "https://en.wikipedia.org/wiki/Walmart",
"reason": "Walmart 可以通过加强其供应链管理、优化库存水平、通过人工智能驱动的聊天机器人改善客户服务以及提供个性化的购物体验来受益于人工智能技术。人工智能可以帮助沃尔玛更准确地预测需求,降低运营成本,并提高整体效率。"
},
{
"company_name": "UnitedHealth Group",
"page_link": "https://en.wikipedia.org/wiki/UnitedHealth_Group",
"reason": "UnitedHealth Group 可以利用人工智能技术通过预测分析改善患者护理,个性化治疗计划,检测欺诈性索赔,并简化管理流程。人工智能可以协助早期疾病检测,提高诊断准确性,并增强数据分析以获得更好的健康结果。"
},
{
"company_name": "Ford Motor Company",
"page_link": "https://en.wikipedia.org/wiki/Ford_Motor_Company",
"reason": "福特汽车公司可以通过推进自动驾驶汽车开发、通过自动化和机器人技术优化制造流程、实施预测性维护以及通过人工智能驱动的功能增强车载体验来受益于人工智能技术。人工智能可以帮助福特降低生产成本并创新新的交通解决方案。"
}
]
}
请注意,响应已经相当不错了——它返回了具有适当响应的 JSON。但是,它遇到了与现有提示式 JSON 推理用例相同的陷阱:
- 您必须手动将此 JSON 处理到类型安全的结构中
- 模型拒绝不会从 API 中作为单独的结构明确返回
结构化输出
现在让我们使用结构化输出来完成此操作。为了启用此功能,我们将把 o1-preview
的响应与后续对 gpt-4o-mini
的请求链接起来,后者可以有效地处理从初始 o1-preview 响应返回的数据。
from pydantic import BaseModel
from devtools import pprint
class CompanyData(BaseModel):
company_name: str
page_link: str
reason: str
class CompaniesData(BaseModel):
companies: list[CompanyData]
o1_response = client.chat.completions.create(
model="o1-preview",
messages=[
{
"role": "user",
"content": f"""
你是一位商业分析师,旨在了解人工智能技术如何在大型企业中应用。
- 阅读以下 html 并返回哪些公司将受益于使用人工智能技术:{html_content}。
- 通过比较来按机会对这些前景进行排名,并向我展示前 3 名。使用 {CompanyData.__fields__.keys()} 中的每个字段返回
"""
}
]
)
o1_response_content = o1_response.choices[0].message.content
response = client.beta.chat.completions.parse(
model="gpt-4o-mini",
messages=[
{
"role": "user",
"content": f"""
鉴于以下数据,请使用给定的响应格式对其进行格式化:{o1_response_content}
"""
}
],
response_format=CompaniesData,
)
pprint(response.choices[0].message.parsed)
CompaniesData(
companies=[
CompanyData(
company_name='Walmart',
page_link='https://en.wikipedia.org/wiki/Walmart',
reason=(
'作为最大的零售商,沃尔玛可以通过优化供应链和库存管理、改善需求预测、个性化客户体验以及通过人工智能驱动的分析来增强店内运营,从而从人工智能中获益匪浅。'
),
),
CompanyData(
company_name='JPMorgan Chase',
page_link='https://en.wikipedia.org/wiki/JPMorgan_Chase',
reason=(
'作为一家领先的金融机构,摩根大通可以利用人工智能进行欺诈检测、风险管理、个性化银行服务、算法交易以及通过人工智能驱动的聊天机器人和虚拟助手增强客户服务。'
),
),
CompanyData(
company_name='UnitedHealth Group',
page_link='https://en.wikipedia.org/wiki/UnitedHealth_Group',
reason=(
'作为医疗保健领域的主要参与者,联合健康集团可以利用人工智能通过预测分析来改善患者护理,增强诊断,简化管理流程,并通过人工智能驱动的解决方案优化运营来降低成本。'
),
),
],
)
结论
结构化输出使您的代码能够拥有可靠的类型安全和更简单的提示。此外,它还允许您重用对象模式,以便更轻松地集成到现有工作流中。
o1 类模型目前没有结构化输出支持,但我们可以通过链接两个请求来重用 gpt-4o-mini
的现有结构化输出功能。此流程目前需要两次调用,但第二次 gpt-4o-mini
调用成本应与 o1-preview
/o1-mini
调用相比最低。