指定OpenAI的api返回json格式

2,968 阅读2分钟

前言

在2023年11月7日,OpenAI Dev Day 更新了不少好东西,如图

image.png

其中有一项是,Improved instruction following and JSON mode,就是支持直接返回JSON格式的数据。

接下来简单演示一下,分别在 openai的sdk 和 langchain框架下 ,如何让大模型返回json格式。

使用方法

一、前提

1、支持的大模型版本

当前支持返回json格式的 大模型只有 gpt-3.5-turbo-1106gpt-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': ['广东炒面', '白切鸡', '叉烧饭', '蚝油生菜', '糖醋排骨', '广东炖品']}