AIGC: 关于ChatGPT中实现一个聊天机器人

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

规划一个聊天机器人

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

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

  • 以下Java版代码来源于网络,可基于此逻辑,改造成其他编程语言

  • src

    • main
      • java
        • com.xxx.gpt.client
          • util
            • ChatContextHolder.java
          • ChatBotClient.java
    • test
      • java
        • com.xxx.gpt.client.test
          • FunctionCallTest.java

ChatContextHolder.java

package com.xxx.gpt.client.util;

import com.xxx.gpt.client.entity.Message;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ChatContextHolder {
    private static Map<String, List<Message>> context = new HashMap<>();

    public static List<Message> get(String id) {
        // TODO  限制轮数,或者限制token数量
        List<Message> messages = context.get(id);
        if (messages == null) {
            messages = new ArrayList<>();
            context.put(id, messages);
        }
        return messages;
    }

    public static void add(String id, String msg) {
        Message message = Message.builder().content(msg).build();
        add(id, message);
    }

    public static void add(String id, Message message) {
        List<Message> messages = context.get(id);
        if (messages == null) {
            messages = new ArrayList<>();
            context.put(id, messages);
        }
        messages.add(message);
    }

    public static void remove(String id) {
        context.remove(id);
    }
}
  • 这里需要来添加一个类,就是我们GPT的上下文的类
  • 我们创建一个类,用于保存我们和GPT聊天的相关的 message
    • 实例化一个Map的对象, 里面的 key 是我们chat的一个id, 一个会话的id
    • 然后,对应的这个key就会有它的一个消息的列表,也就是一个message的list
    • 添加相关的方法
      • 比如说像get方法,根据我们的会话id,获取到所有的message
      • add方法,去对指定的会话id去添加message
      • remove方法, 去删除message
    • 这是我们的上下文处理的类

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

package com.xxx.gpt.client;

import com.xxx.gpt.client.entity.Message;
import com.xxx.gpt.client.listener.ConsoleStreamListener;
import com.xxx.gpt.client.util.ChatContextHolder;
import com.xxx.gpt.client.util.Proxys;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Proxy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.CountDownLatch;
import java.util.stream.Collectors;

@Slf4j

public class ChatBotClient {
    public static Proxy proxy = Proxy.NO_PROXY;
    public static void main(String[] args) {

        System.out.println("ChatGPT - Java command-line interface");
        System.out.println("Press enter twice to submit your question.");
        System.out.println();
        System.out.println("按两次回车以提交您的问题!!!");
        String chatUuid = UUID.randomUUID().toString();
        String key = "sk-adfas";
        proxy = Proxys.http("127.0.0.1", 7890);
        while (true) {
            String prompt = getInput("\nYou:\n");
            ChatGPTStreamClient chatGPT = ChatGPTStreamClient.builder()
                    .apiKey(key)
                    .proxy(proxy)
                    .build()
                    .init();
            System.out.println("AI: ");
            // 卡住
            CountDownLatch countDownLatch = new CountDownLatch(1);
            Message message = Message.of(prompt);
            ChatContextHolder.add(chatUuid, message);
            ConsoleStreamListener listener = new ConsoleStreamListener() {
                @Override
                public void onError(Throwable throwable, String response) {
                    throwable.printStackTrace();
                    countDownLatch.countDown();
                }
            };
            listener.setOnComplate(msg -> {
                ChatContextHolder.add(chatUuid, Message.ofAssistant(msg));
                countDownLatch.countDown();
            });
            chatGPT.streamChatCompletion(ChatContextHolder.get(chatUuid), listener);
            try {
                countDownLatch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }

    @SneakyThrows
    public static String getInput(String prompt) {
        System.out.print(prompt);
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        List<String> lines = new ArrayList<>();
        String line;
        try {
            while ((line = reader.readLine()) != null && !line.isEmpty()) {
                lines.add(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return lines.stream().collect(Collectors.joining("\n"));
    }
}
  • 它的实现其实也比较简单
    • 第一步,需要等待用户输入,用户输入完成之后,调用GPT
      • 添加一下相关的我们的 API KEY 和 proxy
      • getInput 去接收用户输入
    • 第二步,需要保存多轮会话
      • 我们是多轮会话,我们这里写一个循环在前面
      • chatUuid 是我们用于标识会话的id
    • 第三步,为了效果更好,更加顺畅,采用流式的方式
      • 创建一个 StreamClient 去调用GPT的 API
      • 调用完成进行输出

测试

  • 完成之后,可以测试一下
    • 程序等待我们的输出,我们去询问一下: “你是谁?”
    • 这里需要敲两次回车进行确认
  • 调用之后,我们获取到了 GPT 它的返回的结果
    • 然后,我们问: “请介绍一下ChatGPT”
    • GPT生成了相关的答案
  • 在这次问答当中,也能看到流式Client的一个效果
  • 整体上和我们通过界面去访问GPT是没有什么区别的
  • 假如说,我们现在再问: “这是我的第几个问题?”
    • 理论上讲,这是我们本轮会话的第三个问题
    • 由于我们没有在刚刚的调用里面, 去关联我们会话上下文的信息
    • 这样,GPT会回答: “这是第3个问题”
  • 将会话的上下文信息传递给 GPT, 就可以去结合这些上下文的信息,给予我们比较精确的一个答案
    • 这是我们在构造一个聊天机器人的时候和前面测试所不一样的,需要我们注意的地方
    • 但是在这里,其实就会有一个问题就是token的问题。
    • GPT它的模型对于 token 是有限制的
  • 如果我们一轮轮会话的叠加,最终我们的token, 一定会超过模型它本身的token
    • 所以在上下文的管理类里面,我们这里是需要去进行处理
  • 上述问题如何处理?
    • 方案一就是保留最近一轮的会话轮数,比如只保留最近五轮
      • 对于历史的消息,不再保存,不再发送给GPT这样,可以达到小于指定token数量的目的
      • 但是当我们一轮的消息比较长的话,也有可能会超过token的阈值
    • 方案二,就是在方案一的基础之上,我们不再以单纯会话的轮数去做一个迭代
      • 这里,根据计算后的token的数量,去进行判断
      • 如果小于模型的 max_token,我们就保留相关的这些会话
      • 如果大于,我们就要去做相关消息的一个删减
    • 目前并未实现,可在上述 ChatContextHolder.java 类中进行实现

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

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

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

相关文章

  • AIGC:ChatGPT(一个里程碑式的对话聊天机器人)的简介(意义/功能/核心技术等)、使用方法(七类任务)、案例应用(提问基础性/事实性/逻辑性/创造性/开放性的问题以及编程相关)之详细攻略

    AIGC:ChatGPT(一个里程碑式的对话聊天机器人)的简介(意义/功能/核心技术等)、使用方法(七类任务)、案例应用(提问基础性/事实性/逻辑性/创造性/开放性的问题以及编程相关)之详细攻略 导读 :回拨到2020年5月,OpenAI提出了更强大的GPT-3模型,如今已经过去2年多了,当人们还在

    2024年02月03日
    浏览(48)
  • AIGC:ColossalChat(基于LLM和RLHF技术的类似ChatGPT的聊天机器人)的简介、安装、使用方法之详细攻略

    LLMs:ColossalChat(基于LLM和RLHF技术的类似ChatGPT的聊天机器人)/ColossalAI的简介、安装、使用方法之详细攻略 导读 :ColossalChat 是 第一个 基于LLaMA预训练模型 开源完整RLHF pipline实现 ,包括有监督数据收集、有监督微调、奖励模型训练和强化学习微调。只需要 不到100亿个参数 ,就

    2024年02月09日
    浏览(55)
  • 从零开始,三分钟内用Python快速自建一个私有化 ChatGpt 聊天机器人网站

    用 Python 构建由 gpt-3.5-turbo API 支持的聊天机器人网站 自2023年3月1日发布“ChatGPT API”以来,已经开发出了数千个基于该API的应用程序,为企业和个人开启了新的可能性时代。借助GPT-3.5的自然语言处理能力,用户可以创建能够无缝与人交互的聊天机器人,以回答问题、创作小说

    2023年04月14日
    浏览(52)
  • 我开发了一个温柔的智能客服聊天机器人ChatBot,并回答为什么不是ChatGPT(附思路和代码)

    若问2023年科技领域什么最火,那当然是ChatGPT了,这么智能的对话机器人,给人带来无限的想象,围绕着ChatpGPT的各种热点和创意层出不穷。作为一个多年从事编程开发的程序员,我对于这么大的一个热点也很兴奋,每天琢磨着围绕ChatGPT干点啥。 当然还是先要认清现实,心再

    2023年04月20日
    浏览(101)
  • ChatGPT聊天机器人问答实录

    最近ChatGPT爆火,我也在网上找到一个ChatGPT的接口(文末附链接),尝试了一下与人工智能对话的乐趣。我下载的这个应用是基于GPT-3的聊天机器人,我与它的几个问答对话实际记录如下: 答:百度和谷歌是世界上最大的搜索引擎之一,虽然它们在不同的市场中运营,但它们

    2024年02月01日
    浏览(52)
  • ChatGPT聊天机器人如何发图片????

    问题一、怎么让聊天机器人ChatGPT回复你一张图片? 有问题可以在评论区留言。

    2024年02月11日
    浏览(50)
  • 制作一个Python聊天机器人

    我们学习一下如何使用 ChatterBot 库在 Python 中创建聊天机器人,该库实现了各种机器学习算法来生成响应对话,还是挺不错的 聊天机器人也称为聊天机器人、机器人、人工代理等,基本上是由人工智能驱动的软件程序,其目的是通过文本或语音与用户进行对话。 我们日常接触

    2024年01月19日
    浏览(66)
  • ChatGPT 4.0:AI 聊天机器人

    当 ChatGPT 问世时,人们对它作为 AI 聊天机器人的自然语言能力印象深刻,人们感到敬畏。但是,当备受期待的 GPT-4 大型语言模型问世时,它揭开了我们认为 AI 可能实现的盖子,有人称其为 AGI(通用人工智能)的早期一瞥。 该模型的创建者OpenAI称其为该公司“最先进的系统

    2024年02月02日
    浏览(85)
  • ai聊天机器人chatgpt收费版

        AI聊天机器人的功能通常包括以下几个方面:     自然语言理解。该功能可以识别并理解用户输入的自然语言,如文本、语音等,以便进行后续的处理和回复。     对话管理。该功能可以管理对话的上下文和流程,并根据用户的输入和意图来产生相应的回复和行为。  

    2024年02月03日
    浏览(56)
  • 中文版ChatGPT:智能中文聊天机器人

    2017年,AlphaGo在与世界冠军柯洁的人机大战中获胜,引发了人们对人工智能的激烈讨论。 如果说,对于AlphaGo,人们更多是围观者的角色,而最新的人工智能爆款程序ChatGPT,更多人已经参与其中,上线短短两个月内,ChatGPT收获了一亿用户。而且此刻,国内版的ChatGPT也已经正式

    2024年02月12日
    浏览(73)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包