前言
在2023年11月7日,OpenAI Dev Day 更新了不少好东西,如图
其中有一项是,Improved instruction following and JSON mode,就是支持直接返回JSON格式的数据。
接下来简单演示一下,分别在 openai的sdk 和 langchain框架下 ,如何让大模型返回json格式。
使用方法
一、前提
1、支持的大模型版本
当前支持返回json格式的 大模型只有 gpt-3.5-turbo-1106 和 gpt-4-1106-preview
注:在12月11日之后,gpt-3.5-turbo 也能用
二、官方SDK
1、支持的SDK版本
官方的 python openai 包,版本需要大于 1.1.0 以后
可以用 pip show openai 查看,如果不对,请更新pip install -U openai
2、用法示例
有两个变化
-
在申明的时候,传入
response_format={"type": "json_object"} -
prompt需要包含有返回json的提示,比如
请返回json格式
from openai import OpenAI
import os
os.environ['OPENAI_API_KEY']="sk-7Vl54xxxxxxxxxxxxxxx"
client = OpenAI() # 通过environ设置
#client = OpenAI(api_key="sk-7Vl54m90xxxxxxxxxxxxx") #或者通过参数传入类似
prompt = "中国首都是哪里?"
completion = client.chat.completions.create(
model="gpt-3.5-turbo-1106",
messages=[
{"role": "system", "content": '你是一个AI助手,将用JSON格式返回.}'},
{"role": "user", "content": prompt}
],
response_format={"type": "json_object"}
)
print(completion.choices[0].message.content)
返回
{ "response": "中国的首都是北京。" }
也可以制定返回的json格式,如
prompt = "中国首都是哪里?"
completion = client.chat.completions.create(
model="gpt-3.5-turbo-1106",
messages=[
{"role": "system", "content": '你是一个AI助手,请回答我的问题,同时把答案翻译成英语,将用JSON格式返回, 格式为 {"zh":"中文答案", "en":"翻译后的英语"}"}'},
{"role": "user", "content": prompt}
],
response_format={"type": "json_object"}
)
print(completion.choices[0].message.content)
返回
{"zh":"中国的首都是北京。", "en":"The capital of China is Beijing."}
3、常见错误
(1)模型选错,或者prompt没有说明需要返回json格式
Error code: 400 - {'error': {'message': "Invalid parameter: 'response_format' of type 'json_object' is not supported with this model.", 'type': 'invalid_request_error', 'param': 'response_format', 'code': None}}
三、Langchain
1、支持的版本
langchain 包,版本需要大于 0.0.335 以后。
同时因为langchain依赖官方的openai包,所以也确保 openai 的版本大于 1.1.0
可以通过 pip show openai 的命令查看,如果不对,请更新 pip install -U openai langchain
2、用法示例
-
在申明之后,通过bind的方式说明
response_format -
在prompt中,需要说明 用
json格式返回
from langchain.chat_models import ChatOpenAI
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
import json
import os
os.environ['OPENAI_API_KEY']="sk-7Vl54m9xxxxx"
chat=ChatOpenAI(model="gpt-3.5-turbo-1106").bind(response_format={"type": "json_object"})
## 建立模板
template = '''你的任务是根据用户所提供的地区给出相应的菜肴, 请用json格式返回, 格式为 {{"menu":["菜肴1","菜肴2", ....]}}。
% USER LOCATION
{user_location}
你的回复:
'''
prompt_template = PromptTemplate(input_variables=["user_location"], template=template)
# 建立location的chain
location_chain = LLMChain(llm=chat, prompt=prompt_template)
result = location_chain.run("广东")
print(json.loads(result))
返回
{'menu': ['广东炒面', '白切鸡', '叉烧饭', '蚝油生菜', '糖醋排骨', '广东炖品']}