【提示工程】询问GPT返回Json结构数据


theme: orange

众所周知,我们可以通过构建的Prompt获取期望的内容,但是通常都是以自然语言返回的,假如我们想得到结构化的数据,比如Json,XML那么怎么办,这篇文章给你一个思路。

理所当然的想法

要实现询问大模型后返回结构化的数据,首先能想到的是可以通过在提示末尾添加以 JSON 格式提供您的响应来进行一些“提示工程”,从而获得字符串化的 JSON。问题是这些响应通常包括错误的尾随逗号或介绍性的文字,导致中断错误。

接下来我们通过食谱应用中来实验下,用户在输入框中输入菜名,然后点击“获取食谱”。当您点击此按钮时,我们将运行 getRecipe() 函数:

``typescript function getRecipe() { // Create prompt text with user input. Include data model schema description. const prompt =return a recipe for ${userInput}. Provide your response as a JSON object with the following schema: {"dish": ${userInput}, "ingredients": ["", "", ...], "instructions": ["", "", ... ]}`; openai.createChatCompletion({ model: "gpt-3.5-turbo", messages: [ { role: "system", "content": "You are a helpful recipe assistant." }, { role: "user", content: prompt } ], }) .then((completion) => { // Handle API response const generatedText = completion.data.choices[0].message.content; setRecipe(JSON.parse(generatedText)); }) .catch((error) => { console.log(error); }); } }

```

我要求以 JSON 格式提供响应,然后即兴设计了一个模式来指示我希望如何格式化对象。该模式可以改进,但在很大程度上,它是有效的。然而,正如前面提到的,这些响应容易出现尾随逗号错误,这种非正式的模式需要更具可扩展性和易于维护。

当我使用上面的提示请求buttered toast食谱时,我收到了以下响应: ```text Here's a recipe for buttered toast in JSON format as requested:

{
"dish": "buttered toast",
"ingredients": [
"2 slices of bread",
"2 tablespoons of unsalted butter"
],
"instructions": [
"Preheat your toaster or toaster oven.",
"Place the slices of bread in the toaster or toaster oven.",
"Toast the bread for 1-2 minutes, or until it is golden brown.",
"Carefully remove the toasted bread from the toaster or toaster oven.",
"Place a tablespoon of butter on each slice of toast.",
"Use a knife to spread the butter evenly over the surface of the toast.",
"Serve immediately and enjoy!"
]
}
I hope this helps! 您可以看到响应的核心是正确的,并且非常符合我期望的结构,但这个响应包含了一个不必要的引导性介绍性文字,导致了下列的错误: shell SyntaxError: Unexpected token 'H', "Here's a r"... is not valid JSON
at JSON.parse ```

二次优化

我们可以进一步优化我们的提示以解决这些错误。我尝试添加“不要在大括号外返回响应中的任何内容。”这样做在很大程度上似乎可以消除那些引言和结论性的句子。

OpenAI API 的允许我们指定我们希望以 JSON 格式获得响应,但我们必须使用 JSON Schema 来实现。我通过创建一个 JSON Schema 对象并将其传递给新函数的参数来更新我们的功能。

typescript function getRecipe() { // Create prompt text with user input const prompt = `return a recipe for ${userInput}`; // Define the JSON Schema by creating a schema object const schema = { "type": "object", "properties": { "dish": { "type": "string", "description": "Descriptive title of the dish" }, "ingredients": { "type": "array", "items": {"type": "string"} }, "instructions": { "type": "array", "description": "Steps to prepare the recipe.", "items": {"type": "string"} } } } // Note the updated model and added functions and function_call lines // Note that we pass our schema object to parameters openai.createChatCompletion({ model: "gpt-3.5-turbo-0613", messages: [ { role: "system", "content": "You are a helpful recipe assistant." }, { role: "user", content: prompt } ], functions: [{ name: "set_recipe", parameters: schema }], function_call: {name: "set_recipe"} }) .then((completion) => { // Note the updated location for the response const generatedText = completion.data.choices[0].message.function_call.arguments; setRecipe(JSON.parse(generatedText)); }) .catch((error) => { console.log(error); }); } 经过这次更新,我收到了以下响应: text { "dish": "Buttered Toast", "ingredients": [ "Bread slices", "Butter" ], "instructions": [ "Heat a non-stick skillet or griddle over medium heat.", "Spread butter on one side of each bread slice.", "Place the bread slices on the hot skillet or griddle, butter side down.", "Cook for about 2-3 minutes or until the bottom side is golden brown and crispy.", "Flip the bread slices and cook for another 1-2 minutes.", "Remove from the skillet or griddle and serve immediately." ] }

当我将这个响应传递给 JSON.parse() 时,没有出现错误。现在,食谱应用程序更加可靠,不容易出现由于 OpenAI API 响应格式不一致而导致的错误。

结论

这种方法需要更多的代码行,而且,至少目前,JSON Schema 是唯一支持的声明性语言。一些开发人员可能仍然想尝试非正式地请求 JSON 对象。但是,如果您正在构建依赖于此 JSON 以将元素呈现到页面的项目,这种方法是值得一试的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/63232.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python类的属性和实例的属性有什么区别

在 Python 中,类属性和实例属性是两种不同类型的属性,它们在用途和作用域上有所不同。下面是关于它们的区别的详细解释: 定义位置: 类属性:定义在类的主体中,但在任何类方法之外。实例属性:通常…

【深度学习】ChatGPT

本文基于Andrej Karpathy(OpenAI 联合创始人,曾担任特斯拉的人工智能和自动驾驶视觉主管)在Microsoft Build 2023上的演讲整理而成(完整的视频在文末,直接拖到文章底部),主要分为2大部分: 1.如何训练GPT(可…

亚马逊的邮箱可以更改吗,修改亚马逊账户邮箱的方法

亚马逊的邮箱可以更改吗? 可以更改,但更改主户邮箱需要电话对身份进行深度验证。如果需要修改,可以先开case向客服说明情况,然后根据客服的指导步骤来操作即可。 修改亚马逊账户邮箱的方法 1、登录您的账户:打开亚马…

如何有效防止服务器被攻击?

随着互联网的快速发展,服务器安全问题日益引起人们的关注。近期,全球范围内频繁发生的服务器攻击事件引发了广泛关注。为了保护企业和个人的数据安全,有效防止服务器被攻击已成为迫在眉睫的任务。 首先,及时更新服务器的操作系统和…

《C和指针》笔记20:布尔值的注意事项

比较布尔值的时候下面的代码看起来是一样的。 #define FALSE 0 #define TRUE 1 if(flag FALSE) if(!f1ag) ... if(flag TRUE) if(flag) ...但是,如果flag设置为任意的整型值,那么第2对语句就不是等价的。只有当flag确实是TRUE或FALSE,或者…

C++|观察者模式

观察者模式: 定义对象间的一种一对多(变化)的依赖关系,以便当一个 对象(Subject)的状态发生改变时,所有依赖于它的对象都 得到通知并自动更新 动机: 在软件构建过程中,我们需要为某些对象建立…

数学之美 — 1

为什么你会想和他人共享那些美丽的事物呢?因为这会让他(她)感到愉悦,也能让你在分享的过程中重新欣赏一次事物的美。 ——David Blackwell 1、感官之美,对于那些有规律的事物,你可以利用自己的视觉、触觉、…

Java实战场景下的ElasticSearch

文章目录 前言一、环境准备二、RsetAPI操作索引库1.创建索引库2.判断索引库是否存在3.删除索引库 二、RsetAPI操作文档1.新增文档2.单条查询3.删除文档4.增量修改5.批量导入6.自定义响应解析方法 四、常用的查询方法1.MatchAll():查询所有2.matchQuery():单字段查询3.multiMatc…

【ES6】JavaScript中的异步编程:async和await

在JavaScript中,异步编程是一种处理长时间运行的操作的方法,这些操作包括读取文件、网络请求或处理大数据等。在传统的回调函数中,代码按照顺序执行,一旦遇到长时间运行的操作,就需要回调函数来处理结果。这使得代码变…

python自动化测试- 自动化框架及工具

1 概述 手续的关于测试的方法论,都是建立在之前的文章里面提到的观点: 功能测试不建议做自动化接口测试性价比最高接口测试可以做自动化 后面所谈到的 测试自动化 也将围绕着 接口自动化 来介绍。 本系列选择的测试语言是 python 脚本语言。由于其…

C# NetTopologySuite+ProjNet 任意图形类型坐标转换

添加引用:NetTopologySuite、ProjNet、ProjNet.SRID Program.cs文件: using ProjNet.CoordinateSystems; using ProjNet.CoordinateSystems.Transformations; using ProjNet.SRID; using System; using System.Collections.Generic; using System.Linq;…

python通过docker打包执行

背景 正常情况下,python脚本执行需要安装有python环境,那python环境虽然也可以通过移植的方法来安装,那总归是比较麻烦的,下面通过docker打包的方式来执行python脚本 1、安装python镜像 准备两个文件即可,dockerfile、requirements.txt两个文件的内容分别如下 同目录下…

泼辣修图Ploarr5.11.7电脑最新简体中文版下载

泼辣修图专业版是一款强大的专业修图软件,拥有上百款调色工具还有丰富的图层素材, 更有智能的人像修饰面板,具备物体识别的智能蒙板,高效的滤镜管理系统和强大的文字工具,支持批量处理。一切围绕摄影,无论是…

elasticsearch批量索引数据示例

示例数据文件document.json(index表示在索引中增加或替换现有文档,create表示如果文档不存在则添加文档,delete表示删除文档): { "index": { "_index": "addr", "_type": "contact", "_id": 1 }}{ &q…

更新Android Studio 到 4.1 后无法启动

更新Android Studio 到 4.1 后无法启动 环境问题解决 环境 升级 Android Studio 到 2022.3 问题 觉得C盘占用太高,就选择了安装到D盘,安装完成后,启动就一直停在启动界面,没有响应。 删除重装、重新下载新版本、下载免安装包、…

【ES6】 JavaScript 中的Object.assign

Object.assign() 是 JavaScript 中的一个方法,它用于复制源对象的所有可枚举属性到目标对象。该方法会返回目标对象。 这是其基本用法: let target Object.assign({}, source);在这个例子中,source 对象的所有可枚举属性都被复制到了 targ…

只考一门数据结构!安徽工程大学计算机考研

安徽工程大学 考研难度(☆) 内容:23考情概况(拟录取和复试分析)、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文992字,预计阅读:3分钟 2023考情概况 安徽工程大…

Kubernetes技术--k8s核心技术Helm

1.引入 我们先回顾一下之前部署一个应用的过程,如部署nginx,实现效果如下所示: -1.编写deployment的yaml文件,然后运行。 -2.使用service中的NodePort对外暴漏端口 -3.为了弥补Nodeport的缺陷,使用ingress实现转发 这样一个应用就部署完了,这一种情况相对于如果你需要部…

three.js(六):自适应设备分辨率

自适应设备分辨率 当今大多数的PC端和移动端显示器都是HD-DPI显示器。HD-DPI 是High Definition-Dots Per Inch 的简称,意思是高分辨率显示器。不同设备的显示器的分辨率是不一样的。 以上图中的iPhone6/7/8 为例:375*667 代表的手机的屏幕的物理尺寸&a…

海康机器人工业相机 Win10+Qt+Cmake 开发环境搭建

文章目录 一. Qt搭建海康机器人工业相机开发环境 一. Qt搭建海康机器人工业相机开发环境 参考这个链接安装好MVS客户端 Qt新建一个c项目 cmakeList中添加海康机器人的库,如下: cmake_minimum_required(VERSION 3.5)project(HIKRobotCameraTest LANG…