从原始文本到结构化数据:OpenAI 的 JSON 模式和结构化输出方式如何提升法律文件处理流程
想象你是一家律师事务所,正在试图简化你的合同审查过程。合同包含各种条款,每个合同都需要被组织以便突出管辖权、摘要、关键条款和法律影响等关键点。一开始,你手动阅读每份合同,但很快发现这个过程既费力又不一致。
探索自动化之路:从合同中提取结构化的数据 📑为了加快速度,你决定这样使用AI自动从非结构化的合同内容中提取结构化数据。这将通过生成一个包含所有关键信息的JSON输出来节省你团队数小时的工作时间。
第一次试用:JSON你从JSON 模式开始。这看起来很有希望——它保证了有效的 JSON 结果,这正是你需要的,是吧?你的 JSON 模式的设置可能如下所示:
from openai import OpenAI
import json
client = OpenAI()
# 定义合同文本
contract_text = """
标题:ABC Corp 与 XYZ Inc. 之间的服务协议
前言:此服务协议(“协议”)于 2024 年 1 月 15 日由加利福尼亚州的 ABC Corp 和德克萨斯州的 XYZ Inc. 签订。
服务范围:XYZ Inc. 将根据附录 A 所述向 ABC Corp 提供软件开发和维护服务。
合同期限:该合同将于 2024 年 1 月 15 日开始,持续一年,并在双方同意的情况下可以续签。
保密性:双方同意对交换的所有信息保密。
终止性:任何一方可以在符合第 9 节规定的条件下,提前 30 天发出书面通知终止合同。
法律管辖:本合同受加利福尼亚州法律管辖。
签署:本合同由 ABC Corp 和 XYZ Inc. 的代表签署。
"""
# 设置 JSON 模式的请求
completion = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "你是一个法律助理,负责帮忙将合同总结为 JSON 格式。"},
{
"role": "user",
"content": f"""分析以下合同,并以 JSON 格式返回标题、摘要、关键条款、法律管辖和法律后果。确保所有返回内容都是有效的 JSON 格式。
合同文本:
{contract_text}
"""
}
],
response_format={"type": "json_object"}
)
# 解析并打印 JSON 回应
json_response = completion.choices[0].message.content
parsed_response = json.loads(json_response)
print(json.dumps(parsed_response, indent=4))
这将返回以下对象:
{
"title": "ABC Corp与XYZ Inc.服务协议",
"summary": "本服务协议由ABC Corp和XYZ Inc.共同订立,用于由XYZ Inc.为ABC Corp提供的软件开发和维护服务。该协议自2024年1月15日起生效,为期一年,有续约可能。双方均需保守所有交流信息的秘密,任一方均可以在提前30天通知的情况下终止协议。适用法律为加利福尼亚州法律。",
"key_terms": {
"parties": [
"ABC Corp",
"XYZ Inc."
],
"effective_date": "自2024年1月15日起",
"duration": "1年",
"renewal": "双方一致同意后可续约",
"services": "提供软件开发和维护服务",
"confidentiality": "双方同意保守所有交换信息的秘密",
"termination": "30天书面通知",
"signatures": "由ABC Corp和XYZ Inc.的代表签署"
},
"jurisdiction": "加利福尼亚州法律管辖",
"legal_implications": "双方必须遵守保密协议,承认适用法律限于加利福尼亚州法律。终止条款允许任一方在提前30天书面通知的情况下终止合同,为不可预见的情形提供了灵活性。"
}
输出是有效的JSON!但是在进行几次测试后,你发现了一个问题:输出结构不一致。有时字段稍有不同,或者某些关键术语缺失了。你发现JSON模式并不强制特定格式,它仅保证输出的有效性,从而导致不一致。
结构化输出解决方案 🛠️
然后,你发现了结构化输出。与 JSON 模式不同,结构化输出强制使用严格的模式,确保每个响应都符合你定义的结构,所有必需的字段也都存在。
你为你的合同摘要定义一个结构。
import json
from openai import OpenAI
client = OpenAI()
# 合同摘要提示和模式设定
contract_summarizer_prompt = '''
您是一个AI法律助手。给定一份法律合同,将其关键点以结构化的JSON格式进行总结。
包括标题、简要总结、关键法律术语列表、管辖地以及任何法律影响或重要条款。
'''
MODEL = "gpt-4o"
def get_contract_summary(contract_text):
response = client.chat.completions.create(
model=MODEL,
messages=[
{
"role": "system",
"content": contract_summarizer_prompt
},
{
"role": "user",
"content": contract_text
}
],
response_format={
"type": "json_schema",
"json_schema": {
"name": "legal_summary",
"schema": {
"type": "object",
"properties": {
"title": {"type": "string"},
"summary": {"type": "string"},
"key_terms": {"type": "array", "items": {"type": "string"}},
"jurisdiction": {"type": "string"},
"implications": {"type": "string"}
},
"required": ["title", "summary", "key_terms", "jurisdiction", "implications"],
"additionalProperties": False
},
"strict": True
}
}
)
return response.choices[0].message
# 示例合同文本
contract_text = """
标题:ABC Corp和XYZ Inc之间的服务协议
引言:本服务协议("协议")由加州公司ABC Corp和德克萨斯公司XYZ Inc于2024年1月15日签订。
服务范围:XYZ Inc将按照附录A中概述的要求为ABC Corp提供软件开发和维护服务。
合同期限:本协议自2024年1月15日起生效,期限为一年,双方同意的情况下可续约。
保密条款:双方同意对交换的信息保密,
终止条款:任一方可在满足第9条规定的条件下,提前30天以书面形式通知另一方终止协议。
管辖法律:本协议受加利福尼亚州法律管辖。
签署:本协议由ABC Corp和XYZ Inc的代表签署。
"""
# 运行函数并打印结构化输出
result = get_contract_summary(contract_text)
# 解析JSON内容
parsed_content = json.loads(result.content)
# 以易于阅读的格式打印解析后的结果
print(json.dumps(parsed_content, indent=4))
这将返回如下 JSON 对象,并且每次运行此完成请求都会返回相同的 JSON 结构。
{
"title": "ABC Corp与XYZ Inc.服务协议",
"summary": "本服务协议是ABC Corp与XYZ Inc.之间关于软件开发和维护服务的协议。协议自2024年1月15日起生效,为期一年,且包含续约选项。该协议包括保密义务,并允许在提前30天通知的情况下终止。该协议受加州法律管辖。",
"key_terms": [
"服务协议",
"服务范围",
"期限",
"保密义务",
"终止",
"管辖权"
],
"jurisdiction": "加州",
"implications": "协议要求保密,并包含续约选项,允许任何一方在提前30天通知的情况下终止协议。这意味着任何法律争议都将依据加州法律解决。"
}
有了结构化的输出,每个回复都会严格按照格式生成,从而提供一致且可靠的摘要。每份合同审查都包含 标题、摘要、关键条款、管辖权和法律影响 —— 确保没有意外或缺失的字段。你和你的法律团队对这种可预测的格式非常满意,这使得自动搜索和分类合同变得简单。🎉
这里简单总结一下JSON模式下和结构化输出方式之间的主要区别
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦