AIGC: 关于ChatGPT中Function Call的调用

这篇具有很好参考价值的文章主要介绍了AIGC: 关于ChatGPT中Function Call的调用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Function Call 概念

  • 关于 GPT 中API的function参数,提供了一些能力
    • 这个函数调用是 Open AI 在2023年的6.13号发布的新能力
    • 根据它的官方描述, 函数调用能力可以让模型输出一个请求调用函数的消息
    • 其中包含所需调用函数的信息,以及调用函数时所需携带的参数的信息
  • 这种方式是一种将GPT的能力和外部的工具,外部的API连接起来的新的方式

函数调用的机制

  • 那么应该如何去使用函数调用?
    • 首先我们需要去选择函数调用的新模型
    • 用户在构造message参数时候,需要主动的告诉模型有哪些函数
    • GPT 知道我们有哪些函数之后,根据对于自然语言的理解,根据用户的输入
    • GPT会自行的判断何时需要调用这些函数,然后会根据目标函数它的描述生成符合要求的请求的参数
    • 然后返回给我们,我们根据GPT的信息再去调用函数

函数的作用

  • 第一种,进行自然语言交流时,通过调用外部工具回答问题
    • 通过这种函数调用的能力,我们可以将GPT和第三方的工具去进行一个集成,形成类似于GPT插件的这种模式
  • 第二种,如果我们有特殊的对于自然语言处理的逻辑
    • 我们可以利用GPT, 将自然语言转换成调用API时使用的参数, 或转换成查询数据库时所使用的条件等等
  • 第三种,我们可以利用这种能力从文本当中去提取一些结构化的数据,这是函数的一些基础的作用。

函数调用的使用

  • 那么我们如何去使用函数调用呢?如何在它的聊天API的接口上去添加函数相关的这些参数呢?
  • 为了实现函数调用的能力, 在API里面有新的请求的参数就是function, function call等等, 在官方的API文档上可以查询
  • 在使用之前,我们先来了解一下函数调用的步骤
    • 第一步, 当我们去调用函数的时候,首先我们需要在请求参数当中向API也就是向GPT去传递信息, 我们要告诉GPT, 我们有哪些可以调用的函数
    • 第二步, 我们根据GPT的返回, 我们要去进行解析, 判断模型是不是需要调用函数, 如果不需要,我们则不处理
      • 如果需要调用函数,我们这里要根据需要调用的函数,根据GPT输入的参数去进行调用
      • 调用完成之后,得到函数调用的结果
    • 最后, 我们再将函数调用的结果添加到GPT的消息列表来告诉GPT

代码实现

  • 参考前文: https://blog.csdn.net/Tyro_java/article/details/134781021

1 )新增一些实现类,结构如下

  • src
    • main
      • java
        • com.xxx.gpt.client
          • entity
            • ChatFunction.java
            • FunctionCallResult.java
    • test
      • java
        • com.xxx.gpt.client.test
          • FunctionCallTest.java

ChatFunction.java

package com.xxx.gpt.client.entity;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ChatFunction {
    String name;
    String description;
    ChatParameter parameters;

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public static class ChatParameter {
        String type;
        List<String> required;
        Object properties;
    }
}
  • ChatFunction 类中包含:名称,描述,参数等等字段

FunctionCallResult.java

package com.xxx.gpt.client.entity;

import lombok.Data;

@Data
public class FunctionCallResult {
    String name;
    String arguments;
}
  • FunctionCallResult 定义了名称,参数的字段

FunctionCallTest.java文章来源地址https://www.toymoban.com/news/detail-763616.html

package com.xxx.gpt.client.test;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.xxx.gpt.client.ChatGPTClient;
import com.xxx.gpt.client.entity.*;
import com.xxx.gpt.client.util.Proxys;
import org.junit.Before;
import org.junit.Test;

import java.net.Proxy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class FunctionCallTest {
    private ChatGPTClient chatGPTClient;

    @Before
    public void before() {
        Proxy proxy = Proxys.http("127.0.0.1", 7890);
        chatGPTClient = ChatGPTClient.builder()
                .apiKey("sk-6kchn0DasdfqOJqkc3aI665ct") // 填入自己的 key
                .timeout(900)
                .proxy(proxy)
                .apiHost("https://api.openai.com/")
                .build()
                .init();
    }

    // 调用gpt的时候,带上函数信息,让GPT选择是否调用
    @Test
    public void chat() {
        List<ChatFunction> functions = new ArrayList<>();
        ChatFunction function = new ChatFunction();
        function.setName("getCurrentWeather"); // 设置函数信息
        function.setDescription("获取给定位置的当前天气");
        function.setParameters(ChatFunction.ChatParameter.builder()
                .type("object")
                .required(Arrays.asList("location"))
                .properties(JSON.parseObject("{\n" +
                        "          \"location\": {\n" +
                        "            \"type\": \"string\",\n" +
                        "            \"description\": \"The city and state, e.g. San Francisco, " +
                        "CA\"\n" +
                        "          },\n" +
                        "          \"unit\": {\n" +
                        "            \"type\": \"string\",\n" +
                        "            \"enum\": [\"celsius\", \"fahrenheit\"]\n" +
                        "          }\n" +
                        "        }"))
                .build());
        // 添加到列表中
        functions.add(function);
        // 构造 message
        Message message = Message.of("上海的天气怎么样?");
        // 构造调用 api 参数
        ChatCompletion chatCompletion = ChatCompletion.builder()
                .model(Model.GPT_3_5_TURBO_16K.getName())
                .messages(Arrays.asList(message))
                .functions(functions)
                .maxTokens(8000)
                .temperature(0.9)
                .build();
        // 调用
        ChatCompletionResponse response = chatGPTClient.chatCompletion(chatCompletion);
        ChatChoice choice = response.getChoices().get(0);
        Message res = choice.getMessage();
        System.out.println(res);
        // 基于 finish reason 判断,如果是 function_call 就需要调用函数
        if ("function_call".equals(choice.getFinishReason())) {
            FunctionCallResult functionCall = res.getFunctionCall();
            String functionCallName = functionCall.getName();
            // 如果需要调用的是 getCurrentWeather
            if ("getCurrentWeather".equals(functionCallName)) {
                String arguments = functionCall.getArguments();
                JSONObject jsonObject = JSON.parseObject(arguments);
                String location = jsonObject.getString("location");
                String unit = jsonObject.getString("unit");
                // 得到最终的结果
                String weather = getCurrentWeather(location, unit);
                res.setContent("");
                // 将结果 weather 告诉GPT
                callWithWeather(weather, res, functions);
            }
        }
    }

    // 将结果传送给GPT
    private void callWithWeather(String weather, Message res, List<ChatFunction> functions) {
        Message message = Message.of("上海的天气怎么样?");
        Message function1 = Message.ofFunction(weather);
        function1.setName("getCurrentWeather");
        ChatCompletion chatCompletion = ChatCompletion.builder()
                .model(Model.GPT_3_5_TURBO_16K.getName())
                .messages(Arrays.asList(message, res, function1))
                .functions(functions)
                .maxTokens(8000)
                .temperature(0.9)
                .build();
        ChatCompletionResponse response = chatGPTClient.chatCompletion(chatCompletion);
        ChatChoice choice = response.getChoices().get(0);
        Message res2 = choice.getMessage();
        //上海目前天气晴朗,气温为 22 摄氏度。
        System.out.println(res2.getContent());
    }

    // 首先我们添加一个函数,函数是获取天气的信息,这里需要传入 location
    // return 我们这里的返回值是根据location构造出来的一个JSON, 这里设置的固定的,就是模拟接口,或者对接天气网站接口都可
    public String getCurrentWeather(String location, String unit) {
        return "{ \"temperature\": 22, \"unit\": \"celsius\", \"description\": \"晴朗\" }";
    }
}
// 本地有一个函数,将函数信息告诉chatgpt,并告诉chatgpt什么情况需要调用这个函数。由chatgpt判断是否需要调用该函数,如果需要在交互中进行调用。类似于委托机制
  • 第一步,需要告诉GPT我们有哪些函数?也就是这些函数是我们本地定义的
  • 第二步,是在调用GPT的时候带上函数信息,然后让GPT选择是否调用函数
  • 第三步,解析GPT的返回,如果GPT需要调用函数,我们在本地根据GPT返回的参数,调用函数获取结果,在获取结果之后,将结果告诉GPT
  • 通过GPT的函数调用的一个简单的示例
    • 看到通过 GPT函数调用的这种方式,可以将我们本地的一些函数
    • 可以和外部的一些第三方的工具做一个更好的集成
    • 整体的这个模式,就类似于委托的机制
  • GPT根据我们的自然语言,也就是我们的 Prompt 自行去判断是不是需要调用函数
  • 如果需要调用的话,然后再告诉我们,由我们完成调用
  • 完成调用之后,再将调用的结果返回给它
  • 整个过程是我们和GPT的程序上的密切交互

到了这里,关于AIGC: 关于ChatGPT中Function Call的调用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于AI和ChatGPT的使用,AI编程(AIGC),AI绘画(2)

            AI绘画技术是指利用人工智能技术来创作、生成或修改图像、照片、插图、漫画等艺术品以及各种视觉效果。常见的AI绘画技术包括机器学习、深度学习和计算机视觉等领域的技术,通过训练神经网络模型来实现自动化地生成图像,其应用范围相当广泛,包括数字

    2024年02月08日
    浏览(45)
  • 关于AI和ChatGPT的使用,AI编程(AIGC),AI绘画(3)

    1.版权和知识产权:使用别人的AI模型进行绘画可能会侵犯其版权和知识产权,需遵守相关法律法规。 2.数据隐私:在使用AI绘画应用时,可能需要提供个人图像或图片等数据,要谨慎保护数据隐私,防止被滥用。 3.算法可解释性:需要考虑AI绘画算法的可解释性,确保结果符

    2024年02月11日
    浏览(48)
  • 【OpenAI】ChatGPT函数调用(Function Calling)实践 | 京东云技术团队

    6月13日OpenAI在Chat Completions API中添加了新的函数调用(Function Calling)能力,帮助开发者通过API方式实现类似于ChatGPT插件的数据交互能力。 本文在作者上一篇文章《私有框架代码生成实践》的基础上,依旧使用自然语言低代码搭建场景作为案例,将嵌入向量搜索(Embedding)获

    2024年02月12日
    浏览(52)
  • ChatGPT 教程——关于如何使用 OpenAI ChatGPT 的指南

    OpenAI 去年 11 月推出了他们的新产品 OpenAI ChatGPT,全世界都为之疯狂。本文“  ChatGPT 教程 – 如何使用 OpenAI ChatGPT 指南”  将涵盖您需要了解的有关 ChatGPT 的所有内容。 OpenAI 开发了 ChatGPT 作为其 GPT-3 AI-NLP 模型的产品。这种生成式 AI 模型的开发方式可以对任何给定提示提供

    2024年02月09日
    浏览(44)
  • AIGC: 关于ChatGPT中对输出文本进行审核

    违禁词 与 logit_bias 参数 前文,通过GPT的API实现了一个简单的聊天机器人, 当然也可以做一些内容审核相关的应用 这里有一个非常核心,需要重点关注的一个方向,就是对于文本的审核 对于一些违禁词,我们需要准确的识别出来,避免出现 对于我们构建的 Prompt,其实还比较

    2024年02月04日
    浏览(50)
  • AIGC: 关于ChatGPT中进行情感分析的功能

    概念 GPT是基于大模型去进行的机器学习的训练,对于机器学习相关的概念它是比较了解的 比如: 文本的分类, 文本的情感分析等等 相关的机器学习的功能,GPT如何支持?是否有相关接口供我们调用? 有的,文档地址: https://platform.openai.com/docs/api-reference/embeddings/create 基于这个接

    2024年02月04日
    浏览(47)
  • AIGC: 关于ChatGPT中实现一个聊天机器人

    规划一个聊天机器人 智能化完全于依托于GPT, 而产品化是我们需要考虑的事情 比如,如何去构建一个聊天机器人 聊天机器人它的处理逻辑其实非常的清晰 我们输入问题调用 GPT 然后,GPT 给我们生成回答就可以了 需要注意的是,聊天机器人不同于调用API进行一个简单的测试

    2024年02月04日
    浏览(63)
  • AIGC: 关于ChatGPT抽象Prompt提问模板的设计

    为什么需要Prompt模板 基于前文我们具备了Prompt构建的基础能力,但是我们在实际编写Prompt的过程当中,可能还会存在一些的问题 比如对于背景和细节的描述还是不够 或者为了描述的清楚堆砌了大量的文字, 导致整个Prompt的结构化和可读性是比较差的 从而GPT没有正确理解需求

    2024年02月04日
    浏览(55)
  • 关于ChatGPT等AIGC技术对人类社会的影响

    梗概 横空出世的ChatGPT作为新一代人工智能技术,开启了通用人工智能时代,标志着人工智能具有广泛的学习能力并在大多数领域达到或超过普通人类的水平,其社会影响将巨大而深远。面对这一新传播范式,对其原理架构与应用创新解析、风险认知、应对策略的相关研究刻

    2024年02月08日
    浏览(50)
  • AIGC: 关于ChatGPT这个智能工具带来的几点思考

    ChatGPT的出现 2022年11月底,ChatGPT 上线,引爆 AI 圈 和 科技圈,2023年春节后, 人人都开始关注并讨论这项新技术 它是 OpenAI 研发的智能聊天工具, 基于GPT语言模型,模拟人类的对话方式 默认只能用文字进行交互,理解多种语言,有一些插件,可用语音,图表等 截止现在,Chat

    2024年02月04日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包