Return arguments from function calling with OpenAI API when streaming?

news2024/9/24 15:28:39

题意:在使用OpenAI API进行流式传输时,如何返回函数调用的参数?

问题背景:

I've made a simple OpenAI API example with function calling. I'm only using function calling to format the response, I'm not calling multiple functions or any external APIs.

我做了一个简单的带有函数调用的OpenAI API示例。我只使用函数调用来格式化响应,并没有调用多个函数或任何外部API。

When I don't stream the response I can return the function arguments, which is the data that I need.

当我不进行流式传输响应时,我可以返回函数参数,而这些正是我需要的数据。

In my NextJS route handler:

export async function POST(request: Request) {
  try {
    const openai = new OpenAI({
      apiKey: process.env["OPENAI_API_KEY"],
    });
    const response = await openai.chat.completions.create({
      model: "gpt-4",
      // stream: true,
      messages: [
        {
          role: "user",
          content: "Give me 5 questions and answers for a pub quiz",
        },
      ],
      tools: [
        {
          type: "function",
          function: {
            name: "get_questions_and_answers",
            description: "Get questions and answers",
            parameters: simpleJsonSchema,
          },
        },
      ],
      tool_choice: {
        type: "function",
        function: { name: "get_questions_and_answers" },
      },
    });
    return Response.json(
       JSON.parse(
         response.choices[0].message.tool_calls?.[0].function.arguments || "",
       ),
    );
  } catch (serverError) {
    console.error({ serverError });
    throw new Error();
  }
}

simpleJsonSchema.json:

{
  "type": "object",
  "properties": {
    "getQuestions": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "Question": {"type": "string"},
          "Answer": {"type": "string"}
        },
        "required": ["Question", "Answer"]
      }
    }
  },
  "required": ["getQuestions"]
}

Response from API:        API的响应信息:

{"getQuestions":[{"Question":"What is the capital of Australia?","Answer":"Canberra"},{"Question":"Who wrote 'To Kill a Mockingbird'?","Answer":"Harper Lee"},{"Question":"What is the highest peak in the world?","Answer":"Mount Everest"},{"Question":"Who is known as the 'Father of Computers'?","Answer":"Charles Babbage"},{"Question":"What is the largest ocean in the world?","Answer":"Pacific Ocean"}]}

This is fine when developing locally, however when deployed to Vercel the request sometimes times out. I've tried to add streaming as this is the recommended solution:

在本地开发时,这一切都没问题,然而当部署到Vercel时,请求有时会超时。我已经尝试添加流式传输,因为这是推荐的解决方案:

const response = await openai.chat.completions.create({
  model: "gpt-4",
  stream: true,
  messages: [
    {
      role: "user",
      content: "Give me 5 questions and answers for a pub quiz",
    },
  ],
  tools: [
    {
      type: "function",
      function: {
        name: "get_questions_and_answers",
        description: "Get questions and answers",
        parameters: simpleJsonSchema,
      },
    },
  ],
  tool_choice: {
    type: "function",
    function: { name: "get_questions_and_answers" },
  },
});

const stream = OpenAIStream(response);
return new StreamingTextResponse(stream);

However now the response has a lot of unnecessary data. And when I try to JSON.parse on the client I get errors.

然而,现在响应中包含了很多不必要的数据。当我尝试在客户端使用`JSON.parse`时,会出现错误。

Response from API:        API响应

{"tool_calls":[ {"id": "call_IhxvzkZ5EsmZpHc6tOznTmzb", "type": "function", "function": {"name": "get_questions_and_answers", "arguments": "{\n  \"getQuestions\": [\n    {\n      \"Question\": \"Question 1\",\n      \"Answer\": \"Answer 1\"\n    },\n    {\n      \"Question\": \"Question 2\",\n      \"Answer\": \"Answer 2\"\n    },\n    {\n      \"Question\": \"Question 3\",\n      \"Answer\": \"Answer 3\"\n    },\n    {\n      \"Question\": \"Question 4\",\n      \"Answer\": \"Answer 4\"\n    },\n    {\n      \"Question\": \"Question 5\",\n      \"Answer\": \"Answer 5\"\n    }\n  ]\n}"}}

As far as I can see the docs only cover using useChat but I have some particular requirements so I need to handle the fetching and form state myself: 

据我所见,文档只涵盖了使用`useChat`的方法,但由于我有一些特殊要求,所以需要自己处理数据获取和表单状态。

https://sdk.vercel.ai/docs/api-reference/use-chat

Why am I getting invalid JSON?

为什么我会收到无效的JSON?

Here is a repository which reproduces the issue: 

这是一个重现该问题的代码库:

https://github.com/jameschetwood/openai-function-calling

问题解决:

this is the response you are getting:

这是你得到的响应:

{"tool_calls":[ {"id": "call_HRxqlP3yzeHsoN43tMyZjMlr", "type": "function", "function": {"name": "get_questions_and_answers", "arguments": "{\n  \"getQuestions\": [\n    {\n      \"Question\": \"What is the capital city of France?\",\n      \"Answer\": \"Paris\"\n    },\n    {\n      \"Question\": \"Who painted the Mona Lisa?\",\n      \"Answer\": \"Leonardo da Vinci\"\n    },\n    {\n      \"Question\": \"What is the largest planet in our solar system?\",\n      \"Answer\": \"Jupiter\"\n    },\n    {\n      \"Question\": \"What is the national flower of England?\",\n      \"Answer\": \"Rose\"\n    },\n    {\n      \"Question\": \"Which country is famous for its tulips?\",\n      \"Answer\": \"Netherlands\"\n    }\n  ]\n}"}}

I used JSON Editor Online: edit JSON, format JSON, query JSON to auto correct the json and it just adds "]}". for some reason openai is not sending correct json response. you have to add it

我使用了JSON Editor Online:编辑JSON、格式化JSON、查询JSON来自动修正JSON,它只是添加了“]}”。由于某种原因,OpenAI没有发送正确的JSON响应,你需要手动添加它。

accumulatedText += "]}";

then response works:

然后响应就会生效:

this is too specific error. if openai updates its response api, it might send the json data correctly. so a better approach would be parsing in try/catch

这是一个过于特定的错误。如果OpenAI更新了其响应API,它可能会正确发送JSON数据。因此,更好的方法是在解析时使用`try/catch`。

try {
      const parsed = JSON.parse(accumulatedText);
      console.log({ parsed });
    } catch (error) {
      // you should error for each specific case
      accumulatedText += "]}";
      console.log("correct accumulatedText in catch block", accumulatedText);
    }

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

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

相关文章

沪农商行半年报“双正增”:分红率提升,业绩增速却放缓明显

《港湾商业观察》施子夫 王璐 虽然上半年业绩增速上有所放缓,但沪农商行(601825.SH)33%的分红率至少对投资者来说无疑是个好消息。 今年上半年(报告期内),沪农商行实现营业收入139.17亿元,同比增长0.23%&#xff1b…

TikTok运营需要的独立IP如何获取?

TikTok作为当下炙手可热的社交媒体平台,吸引了众多个人创作者和企业进驻。在进行TikTok运营时,许多经验丰富的用户都倾向于选择独立IP。那么,TikTok运营为什么需要独立IP?又该如何获取呢?本文将详细为您解答这些问题。…

HivisionIDPhotos

在服务器Ubuntu22.04系统下,HivisionIDPhotos的部署 一、安装环境:ubuntu基本环境配置1.更新包列表:2. 安装GPU驱动程序3.查看显卡信息4.下载并安装 CUDA 12.3 二、安装miniconda环境1. 下载miniconda32. 安装miniconda33. 打开用户环境编辑页…

英文站外链如何建设?

在建设英文站外链时,关键在于高质量和低质量(数量多)链接的合理搭配。几百条外链想提升网站是不现实的,所以数量是绝对的,当然,更重要的是,这些外链能够为你的网站SEO带来实际的提升 GPB外链就是…

Vue学习:计算属性Computed

计算属性可以实时监听 data节点中数据的变化,并 return 一个计算后的新值,供组件渲染 DOM 时使用,计算属性需要以 function 函数的形式声明到组件的 computed 节点中。 计算属性的使用注意点: (1)计算属性…

PDF转换器竟能如此简单?这款工具让无数人为之疯狂,你试过吗?

现在大家都用电脑办公,PDF文件因为不管在哪儿都能打开,而且内容不会乱,所以特别受欢迎。但有时候也挺麻烦的,比如你得改改里面的内容或者转成别的格式。到了2024年,如果你还被PDF文件搞得头疼,那就试试这四…

Cross Explosion

考查找。 线性查找上下左右四个方向看到的第一个的墙的位置复杂度O(n^2)&#xff0c;在Q取到2e5的情况下直接爆掉。 这里应使用二分查找&#xff0c;对某一行、列进行二分&#xff0c;使用set实现墙的位置存储。 #include<bits/stdc.h> using namespace std; #define…

IBM中国研发部裁员:全球化背景下的IT产业变局与应对之道

裁员风波中的思考与机遇 前言了解霍尼韦尔的“东方服务东方”施耐德电气的“中国中心”战略对比与分析 中国信息技术(IT)行业展现出蓬勃发展的前景**政府支持与政策导向****技术创新与应用****市场规模与需求****人才培养与就业**国际化与开放合作总结 前言 如何看待IBM中国研发…

C#--CM+Fody+HCWPF开发组合

CM&#xff1a;Caliburn.Micro(简称CM)一经推出便备受推崇&#xff0c;作为一款MVVM开发模式的经典框架&#xff0c;越来越多的受到wpf开发者的青睐.我们看一下官方的描述&#xff1a;Caliburn是一个为Xaml平台设计的小型但功能强大的框架。Micro实现了各种UI模式&#xff0c;用…

大学生租房平台:SpringBoot技术实现详解

第3章 系统分析 面对即将开发的系统&#xff0c;进行提前的分析是必要的。这也是开发流程中必须有的环节。通常分析系统期间&#xff0c;主要涉及的内容包括系统开发可行性问题&#xff0c;对系统功能和性能的分析等问题。 3.1 可行性分析 在正式对需要建设的项目进行投资前&am…

Gmtracker_深度学习驱动的图匹配多目标跟踪项目启动与算法流程

Gmtracker深度学习驱动的图匹配多目标跟踪项目启动与算法流程 说明&#xff1a;对于Gmtracker多目标跟踪算法中涉及到的QP或者是QAP等一些有关图匹配的问题&#xff0c;不做过多的说明只提供源代码中通过图网络的具体实现细节。 对于配置环境时产生的报错的具体信息&#xff0c…

Unity Apple Vision Pro 开发(八):模型分离与组装

XR 开发者社区链接&#xff1a; SpatialXR社区&#xff1a;完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 课程试看&#xff1a;https://www.bilibili.com/video/BV11b421E74g 课程完整版&#xff0c;答疑仅社区成员可见&#xff0c;可以通过文章开头的链接加入…

调度算法及其性能指标

一、调度算法的评价指标 1.CPU利用率 由于早期的CPU造价极其昂贵&#xff0c;因此人们会希望让CPU尽可能多地工作 CPU利用率:指CPU“忙碌”的时间占总时间的比例。 利用率忙碌的时间/总时间 Eg: 某计算机只支持单道程序&#xff0c;某个作业刚开始需要在CPU上运行5秒&a…

python画图|极坐标中画散点图

python极坐标画图时&#xff0c;不仅可以画实线图&#xff0c;也可以画散点图。 实线图画法如下述链接。 python画图|极坐标画图基础教程-CSDN博客 今天我们一起学习一下散点图画法。 【1】官网教程 首先依然是导航到官网&#xff0c;乖乖学习官网教程&#xff1a; Scatt…

产品3D交互展示是什么?3D可视化有什么优势?

产品3D交互展示是一种通过互联网平台&#xff0c;利用3D技术对产品进行全方位、多角度展示的方式。它允许用户通过旋转、缩放、移动等操作&#xff0c;以更直观、更互动的方式了解产品的外观、结构和细节。这种展示方式不仅提升了用户的参与感和体验感&#xff0c;还增强了产品…

【触想智能】工业一体机在物流领域上的四大应用分析

随着物流业的快速发展&#xff0c;工业一体机在物流领域上的应用越来越普遍。工业一体机是一种高级智能设备&#xff0c;是多种技术的综合应用&#xff0c;包括机械、电子、计算机、通讯等。 在物流行业中&#xff0c;工业一体机可以发挥其先进的技术和功能&#xff0c;提高物流…

重磅资源来袭。快看看有没有你要的那一款!

Java 相关的技能主要包括以下几个方面‌&#xff1a; 资源在末尾 ‌Java编程语言基础‌&#xff1a;这是Java开发的基础&#xff0c;包括熟悉Java的语法、数据类型、控制结构、异常处理、面向对象编程&#xff08;OOP&#xff09;等基本概念。‌Java EE和Spring框架‌&#x…

【算法】模拟退火

一、引言 模拟退火算法&#xff08;Simulated Annealing, SA&#xff09;是一种启发式搜索算法&#xff0c;它通过模拟物理中的退火过程来解决优化问题。这种算法能够跳出局部最优解&#xff0c;寻找全局最优解&#xff0c;特别适用于解决复杂的优化问题。 二、算法原理 模拟退…

NS4263 3.0Wx2 双声道 AB/D 类双模音频功率放大器附加耳机模式

1 特性 ● 工作电压范围:3.0V-5.25V ● AB 类和 D类工作模式切换 ● 一线脉冲控制工作模式与关断模式 ● 内置立体声耳机输出功能 ● 输出功率 3WClass D/Load4ohm ● THDN0.1%VDD5V/Po1W ● 优异的全带宽 EMI抑制能力 ● 优异的“上电和掉电”噪声抑制 ● 内置过流保护、欠压保…

PMP证书可不可以挂靠?看看考过的人怎么说

或许我们经常听到人们说可以把律师证、注册会计师证等挂靠在单位&#xff0c;从而每年获得额外收入。但是需要说明的是&#xff0c;PMP证书并不适用于挂靠这种情况。因为PMP并不属于我国体制内的职业资格证书&#xff0c;企业升级资质也不需要使用PMP证书&#xff0c;所以PMP是…