在与大型语言模型(LLM)交互时,一个常见的需求是从非结构化文本中提取信息并将其转换为结构化数据,例如 JSON。虽然我们可以在提示(Prompt)中要求模型返回 JSON,但结果有时并不可靠。模型可能会在 JSON 前后添加额外的解释性文本,或者在复杂情况下生成无效的 JSON 格式。
幸运的是,OpenAI API 提供了一个强大的功能——JSON 模式(JSON Mode),可以强制模型输出语法正确的 JSON 对象。本教程将通过一个实用的 Python 示例,带你一步步学习如何安全、可靠地调用 API 并获得稳定的 JSON 输出。
你将学到:
.env
文件安全地管理你的 API 密钥。response_format
参数启用 JSON 模式。首先,我们需要搭建好开发环境。
我们需要 openai
库来与 API 交互,以及 python-dotenv
库来管理环境变量。打开你的终端并运行以下命令:
pip install openai python-dotenv
.env
文件管理密钥在代码中硬编码 API 密钥是一个非常糟糕的做法,它不仅不安全,而且不灵活。我们将在项目根目录下创建一个名为 .env
的文件来存放我们的配置信息。
创建一个 .env
文件,并填入以下内容(请替换成你自己的信息):
# .env 文件
# 输入你在 uiuiapi.com 获取的 API 密钥或官方API秘钥
API_KEY="sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
# API 的基础 URL (例如 OpenAI 官方地址或uiuiAPI地址)
BASE_URL="https://uiuiapi地址/v1"
# 你希望使用的模型名称 (可选)
MODEL_NAME="gpt-4o"
💡 提示: 将
.env
文件添加到你的.gitignore
中,以避免意外地将敏感信息提交到代码仓库。
现在,让我们开始编写核心的 Python 代码。我们将创建一个名为 extract_info.py
的文件。
代码的开头部分负责导入所需模块,并从我们刚刚创建的 .env
文件中安全地加载配置。
import os
import json
from openai import OpenAI
from dotenv import load_dotenv
def main():
"""
主函数,从 .env 文件加载配置并执行API调用。
"""
# --- 1. 从 .env 文件加载环境变量 ---
load_dotenv()
# 使用 os.getenv() 安全地获取配置
api_key = os.getenv("API_KEY")
base_url = os.getenv("BASE_URL")
model_name = os.getenv("MODEL_NAME", "gpt-4o") # 提供默认值
# --- 检查配置是否存在 ---
if not api_key or not base_url:
print("错误:API_KEY 或 BASE_URL 未在 .env 文件中设置。")
return
print("--- 配置加载成功 ---")
print(f"将要使用的模型: {model_name}")
# ... 后续代码将在这里添加 ...
这段代码确保了我们的程序在运行前能够正确读取到所有必要的配置信息,如果配置缺失,它会友好地提示并退出。
接下来,我们初始化 OpenAI
客户端,并精心构造一个提示,告诉模型我们想要做什么。
# ... 接上文 ...
# --- 2. 初始化API客户端 ---
try:
client = OpenAI(
api_key=api_key,
base_url=base_url,
)
except Exception as e:
print(f"初始化OpenAI客户端时出错: {e}")
return
# --- 3. 准备API请求 ---
source_text = "user email is test@example.com, and the user id is 12345."
messages = [
{"role": "system", "content": "You are a helpful assistant designed to output JSON."},
{"role": "user", "content": f"From the text '{source_text}', extract the email and user ID. Please provide the output in a JSON format where the keys are exactly 'email' and 'user_id'."}
]
这里有两个关键点:
role: "system"
**): 我们给模型设定了一个角色:“你是一个旨在输出 JSON 的有用助手”。这为模型的行为提供了高级指导。role: "user"
**): 我们给出了具体的指令,包括要处理的文本和对输出 JSON 格式的明确要求(键名必须是 email
和 user_id
)。这是整个流程中最核心的一步。我们在调用 API 时,通过设置 response_format
参数来启用 JSON 模式。
# ... 接上文 ...
# --- 4. 调用API并处理响应 ---
print(f"\n--- 正在调用 API ... ---")
try:
response = client.chat.completions.create(
model=model_name,
# 这是启用 JSON 模式的关键!
response_format={"type": "json_object"},
messages=messages
)
json_content_string = response.choices[0].message.content
print("API 调用成功,已收到响应。")
print("\n--- API返回的原始JSON字符串 ---")
print(json_content_string)
# ... 后续解析代码 ...
except Exception as e:
print(f"\n调用API时发生错误: {e}")
return
```response_format={"type": "json_object"}` 会指示模型**必须**返回一个语法正确的 JSON 对象。这比任何在提示文本中的要求都更加可靠和强制。
API 返回的是一个 JSON 格式的字符串。我们需要将其解析为 Python 字典才能方便地使用。
# ... 接上文 ...
# 解析并提取结果
parsed_json = json.loads(json_content_string)
print("\n--- 解析后的Python字典 ---")
print(parsed_json)
email = parsed_json.get('email')
user_id = parsed_json.get('user_id')
print("\n--- 提取结果 ---")
print(f"Email: {email}" if email else "Email: 未找到")
print(f"ID: {user_id}" if user_id else "ID: 未找到")
except Exception as e:
print(f"\n调用API时发生错误: {e}")
return
if __name__ == "__main__":
main()
我们使用 json.loads()
将字符串转换为字典,然后通过 .get()
方法安全地提取所需信息。
将以上所有代码片段整合到 extract_info.py
文件中。现在,在你的终端中运行它:
python extract_info.py
如果一切顺利,你将看到类似以下的输出:
--- 配置加载成功 ---
将要使用的模型: gpt-4o
--- 正在调用 API ... ---
API 调用成功,已收到响应。
--- API返回的原始JSON字符串 ---
{
"email": "test@example.com",
"user_id": "12345"
}
--- 解析后的Python字典 ---
{'email': 'test@example.com', 'user_id': '12345'}
--- 提取结果 ---
Email: test@example.com
ID: 12345
如你所见,我们得到了一个干净、格式正确的 JSON,并且可以轻松地从中提取数据。
通过本教程,你掌握了使用 OpenAI API 的 JSON 模式来获取结构化数据的核心技巧。
关键要点回顾:
.env
文件)管理敏感信息。response_format={"type": "json_object"}
来确保获得可靠的 JSON 输出。try...except
块和 .get()
方法让你的代码更加健壮。现在,你可以尝试修改 source_text
和用户提示,来处理更复杂的文本提取任务了!
版权信息: 本文由界智通(jieagi)团队编写,保留所有权利。未经授权,不得转载或用于商业用途。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。