ChatGPT搭建AI网站实战

news2025/1/13 13:55:36

1.概述
ChatGPT是一款基于GPT-3.5架构的大型语言模型,它能够进行自然语言处理和生成对话等任务。作为一款智能化的聊天机器人,ChatGPT有着广泛的应用场景,如在线客服、智能助手、个性化推荐等。今天笔者给大家分享一下如何使用ChatGPT的API模型快速搭建一个AI网站。

2.内容
在实战中,我发现ChatGPT的最大优势在于其自然流畅的对话交互能力。ChatGPT能够自动理解用户的意图和提出的问题,并针对性地给出回答和建议。同时,它还可以基于已有的上下文信息生成更加丰富的回复,从而实现更加自然和贴近人类的交互效果。

下面我将分享一些关于如何使用ChatGPT的实战经验,大概流程如下所示:

在这里插入图片描述

在使用ChatGPT前,我们需要对数据进行预处理。预处理的目的是将原始文本转换为模型可以理解的格式。具体来说,需要进行的预处理步骤包括:分词、标记化、向量化等。这些步骤都可以使用常见的NLP工具库来实现,如NLTK、spaCy、transformers等。在预处理完数据后,我们需要使用训练数据来训练ChatGPT模型。通常情况下,我们会使用一些优秀的深度学习框架来实现模型的训练,如PyTorch、TensorFlow等。在模型训练过程中,我们需要设置一些超参数,如学习率、批量大小、模型深度等。在模型训练完成后,我们需要对模型进行评估。评估的目的是了解模型的性能和表现,从而决定是否需要进行进一步的调整和优化。常见的模型评估指标包括:准确率、召回率、F1值等。在完成模型训练和评估后,我们需要将ChatGPT应用到实际场景中。通常情况下,我们需要将ChatGPT集成到我们的应用程序中,如在线客服、智能助手等。在部署过程中,我们需要考虑一些问题,如性能、可靠性、安全性等。

3.如何使用ChatGPT快速实现一个AI网站呢?
使用ChatGPT实现一个AI网站,大概步骤如下所示:

在这里插入图片描述

首先,您需要确定您的AI网站将用于哪些目的和哪些受众。您的目标可能是提供在线客服、智能问答、语音识别、自动翻译等功能。您的受众可能是您的客户、读者、访问者等。通过明确您的目标和受众,您可以更好地规划您的网站架构和设计。要构建一个AI网站,您需要选择一个Web开发框架。常用的Web开发框架包括Django、Flask、Express等。这些框架提供了许多常见的功能和模板,可以帮助您更快速地开发网站,并提高开发效率。集成ChatGPT是实现AI网站的关键步骤。您可以使用Python或JavaScript等编程语言来调用ChatGPT API并将其嵌入到您的Web应用程序中。这样,您的网站就可以通过ChatGPT提供更好的用户体验和服务。例如,用户可以通过与ChatGPT交互来获取问题的答案、进行语音交互等。

为了让用户能够更好地与ChatGPT交互,您需要创建一个用户友好的界面。您可以使用HTML、CSS、JavaScript等技术来设计和创建您的用户界面。您需要考虑到用户的需求和体验,并确保您的界面简洁、易用、美观等。为了让ChatGPT能够准确地回答用户的问题,您需要对ChatGPT进行训练。您可以使用自然语言处理技术来训练ChatGPT,以便它能够理解和响应用户的问题。您可以使用开源的数据集和算法来训练ChatGPT,并优化模型以提高精度和效率。

在将您的网站部署到生产环境之前,您需要对它进行测试和优化。您应该检查所有功能并确保它们能够正常运行,同时还应该优化性能和用户体验,以提高用户满意度。您可以使用自动化测试工具来测试您的网站,并使用性能分析工具来识别瓶颈和优化点。您可以收集用户反馈并进行改进,以不断改善您的网站。

当您准备好将您的网站部署到生产环境时,您需要选择一个合适的Web服务器和数据库。常用的Web服务器包括Apache、Nginx等,常用的数据库包括MySQL、PostgreSQL等。您还需要选择一个合适的云服务提供商,如AWS、Google Cloud等,并将您的应用程序部署到云服务器上。一旦您的网站部署到生产环境,您需要进行定期的维护和升级。您应该定期备份您的数据并更新您的应用程序以确保安全性和稳定性。您还应该持续地优化您的用户体验和功能,以满足用户的需求和期望。

4.基于promptable快速实现
如果你不懂算法,那么可以通过在promptable 快速建立prompt,然后部署生成一个PromptID,通过这个PromptID直接调用OpenAI的接口得到模型输出的结果。操作如下:

4.1 编写一个hook模块
用来调用OpenAI的接口,获取输出结果,实现代码如下所示:

import { addMessage, getHistoryString } from "@/utils/chatHistory";
import React, { useEffect } from "react";

export const useChatGpt = (message, promptId, chatHistory) => {
  // Send user meesage to api, meesage and prompt in body
  // then update state value with response
  //   console.log("Hook api call", message, promptId);
  const [data, setData] = React.useState("");
  const [isLoading, setIsLoading] = React.useState(false);
  const [isError, setIsError] = React.useState(false);
  const [history, setHistory] = React.useState(chatHistory);
  const [isSuccess, setIsSuccess] = React.useState(false);

  const fetchData = async () => {
    setIsLoading(true);
    try {
      const response = await fetch("/api/chatgpt", {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          message,
          promptId,
          chatHistory: getHistoryString(chatHistory),
        }),
      }).then((res) => res.json());
      if (response.reply) {
        console.log("Hook api call response", response.reply);
        setData(response.reply);
        setIsSuccess(true);
        setHistory(addMessage(chatHistory, response.reply, "agent"));
      } else {
        setIsError(true);
      }
    } catch (error) {
      setIsError(true);
    }
    setIsLoading(false);
  };

  useEffect(() => {
    setIsError(false);
    setIsSuccess(false);
    if (message) {
      fetchData();
    }
  }, [message]);

  useEffect(() => {
    setHistory(chatHistory);
  }, [chatHistory]);

  useEffect(() => {
    if (promptId) {
      setIsError(false);
      setIsSuccess(false);
      setHistory([]);
    }
  }, [promptId]);

  return {
    data,
    isLoading,
    isError,
    history,
    isSuccess,
  };
};

4.2 编写一个页面组件
通过编写一个页面组件,用来实现与后台接口服务交互使用,该模块用来调用模型并得到输出结果,实现代码如下所示:

import { useChatGpt } from "@/hook/useChatGpt";
import { addMessage } from "@/utils/chatHistory";
import { Button, TextField } from "@mui/material";
import React, { useEffect } from "react";
import { ChatHistoryFrame } from "./ChatHistoryFrame";

const promptId = "xxxxxx"; // 通过Prompt自动生成获取ID

export const ChatContainer = () => {
  const [pendingMessage, setPendingMessage] = React.useState("");
  const [message, setMessage] = React.useState("");
  const [chatHistory, setChatHistory] = React.useState([]);
  const { isLoading, history, isSuccess, isError } = useChatGpt(
    message,
    promptId,
    chatHistory
  );

  useEffect(() => {
    if (isSuccess || isError) {
      setMessage("");
    }
  }, [isSuccess, isError]);

  return (
    <div id="chat-container">
        <h1>MOVIE to emoji</h1>
      </a>
      <ChatHistoryFrame chatHistory={chatHistory} isLoading={isLoading} />
      <div id="chat-input">
        <TextField
          type="text"
          onChange={(e) => {
            setPendingMessage(e.target.value);
          }}
        />
        <Button
          style={{
            backgroundColor: "black",
            width: "80px",
          }}
          variant="contained"
          onClick={() => {
            setMessage(pendingMessage);
            setChatHistory(addMessage(history || [], pendingMessage, "user"));
          }}
        >
          Send
        </Button>
        <Button
          style={{
            color: "black",
            width: "80px",
            borderColor: "black",
          }}
          variant="outlined"
          onClick={() => {
            setMessage("");
            setChatHistory([]);
          }}
        >
          Clear
        </Button>
      </div>
    </div>
  );
};

4.3 ChatGPT核心模块
编写一个调用ChatGPT接口逻辑的核心模块,用来与API交互得到输出结果,具体实现细节如下:

import { PromptableApi } from "promptable";
import { Configuration, OpenAIApi } from "openai";
import GPT3Tokenizer from "gpt3-tokenizer";

const configuration = new Configuration({
  apiKey: process.env.OPENAI_API_KEY,
});
const openai = new OpenAIApi(configuration);
const tokenizer = new GPT3Tokenizer({ type: "gpt3" });

const chatgpt = async (req, res) => {
  const { message, promptId, chatHistory } = req.body;
  console.log("api call entry", message, promptId);
  if (!message) {
    res.status(400).json({ error: "Message is required" });
    return;
  }
  if (!promptId) {
    res.status(400).json({ error: "Prompt ID is required" });
    return;
  }
  // call prompt ai api and openai api
  const reply = await getReply(message, promptId, chatHistory || "");
  res.status(200).json({ reply });
  return;
};

const getReply = async (message, promptId, chatHistory) => {
  // get prompt from prompt ai api based on promptId
  if (!promptId) {
    throw new Error("Prompt ID is required");
  }
  const promptDeployment = await PromptableApi.getActiveDeployment({
    promptId: promptId,
  });
  console.log("prompt deployment", promptDeployment);
  if (!promptDeployment) {
    throw new Error("Prompt deployment not found");
  }
  // replace prompt with message

  const beforeChatHistory = promptDeployment.text.replace("{{input}}", message);

  const numTokens = countBPETokens(beforeChatHistory);
  const afterChatHistory = beforeChatHistory.replace(
    "{{chat history}}",
    chatHistory
  );

  const finalPromptText = leftTruncateTranscript(
    afterChatHistory,
    4000 - numTokens
  );

  const revisedPrompt = {
    ...promptDeployment,
    text: finalPromptText,
  };

  console.log("revised prompt", revisedPrompt);
  // call openai api
  const response = await openai.createCompletion({
    model: revisedPrompt.config.model,
    prompt: revisedPrompt.text,
    temperature: revisedPrompt.config.temperature,
    max_tokens: revisedPrompt.config.max_tokens,
    top_p: 1.0,
    frequency_penalty: 0.0,
    presence_penalty: 0.0,
    stop: revisedPrompt.config.stop,
  });
  console.log("openai response", response.data);
  if (response.data.choices && response.data.choices.length > 0) {
    return response.data.choices[0].text;
  } else {
    return "I'm sorry, I don't understand.";
  }
};

function countBPETokens(text) {
  const encoded = tokenizer.encode(text);
  return encoded.bpe.length;
}

function leftTruncateTranscript(text, maxTokens) {
  const encoded = tokenizer.encode(text);
  const numTokens = encoded.bpe.length;
  const truncated = encoded.bpe.slice(numTokens - maxTokens);
  const decoded = tokenizer.decode(truncated);
  return decoded;
}

export default chatgpt;

4.4 使用依赖
最后,我们工程所使用的依赖包,如下所示:

"dependencies": {
    "@emotion/react": "^11.10.5",
    "@emotion/styled": "^11.10.5",
    "@mui/material": "^5.11.6",
    "@next/font": "13.1.6",
    "eslint": "8.32.0",
    "eslint-config-next": "13.1.6",
    "gpt3-tokenizer": "^1.1.5",
    "next": "13.1.6",
    "openai": "^3.2.1",
    "promptable": "^0.0.5",
    "react": "18.2.0",
    "react-dom": "18.2.0"
  }

4.5 编写Prompt
在完成核心模块的后台逻辑编写后,可以访问Prompt后台,通过编写Prompt来获取ID,操作如下:
在这里插入图片描述

4.6 部署Prompt
完成Prompt编写后,我们就可以部署Prompt了,部署成功后会生成一个PromptID,如下图所示:

在这里插入图片描述

这里,在部署Prompt里面有参考代码实现,具体如下:

import axios from 'axios'


// 这里面的xxxxxxx是部署Prompt自动生成的ID,这里我用xxxxxxx替换了
const { data } = await axios.get('https://promptable.ai/api/prompt/xxxxxxx/deployment/active')

const prompt = data.inputs?.reduce((acc, input) => {
  // Replace input.value with your value!
  return acc.replaceAll(`{{${input.name}}}, ${input.value}`)
}, data.text)

const res = await axios.get('https://openai.com/v1/completions', {
  data: {
    // your prompt
    prompt,

    // your model configs from promptable
    config: {
      ...data.config,
      // add any other configs here
    }
  }
})

// Your completion!
console.log(res.data.choices[0].text)

4.7 ChatGPT实现的AI网站预览
最后,我们基于OpenAI最新的gpt-3.5-turbo模型,开发一个AI网站,效果如下:

在这里插入图片描述

这里为了节省token费用,通过点击“停止对话”按钮暂时输出了。因为使用OpenAI的接口是按照token来算费用的,英文字母算一个token,一个汉字算两个token,收费明细如下:
在这里插入图片描述

5.总结
本文介绍了如何使用ChatGPT来实现一个AI网站。通过选择合适的Web开发框架、集成ChatGPT、创建用户界面、训练ChatGPT、测试和优化、部署到生产环境以及进行维护和升级等步骤,您可以构建一个功能强大的AI网站,并提供更好的用户体验和服务。

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

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

相关文章

创业一定要要组建团队吗?可以一个人独自创业吗,不能一概而论

创业团队&#xff0c;我们需要了解一个概念&#xff0c;那就是“群体”。 在生活中&#xff0c;我们经常会说这样一句话&#xff0c;人以群分&#xff0c;物以类聚。 每个人都不可能离开他人而独立存在&#xff0c;俗话说&#xff0c;“一个篱笆三个桩&#xff0c;一个好汉三个…

SAP批次分类完整检查的使用 (TCODE : BMCC)<转载>

原文链接&#xff1a;https://mp.weixin.qq.com/s/xzG6UqLmTcoLdEBeOnzfwA 最近批次物料收货遇到报错如下 分类数据中的不一致性>交易中止&#xff0c;消息号12126. 从报错字面意思看应该是批次分类属性出现了问题&#xff0c;具体是哪里不一致呢&#xff1f; 可以通过报…

20230427-tortoisegit报错-unsafe-repository

20230427-tortoisegit报错-unsafe-repository 一、软件环境 windows 11 x64 22H2git 2.35.3tortoisegit 2.14.0.0标签&#xff1a;git tortoisegit分栏&#xff1a;GIT 二、报错现象 右键打开tortoisegit&#xff0c;点击commit报错【fatal: unsafe … is owned by someone…

httphtml(HTML语法)

目录 1.http协议 1.Http简介 2.Http特点 3.Http协议格式 1&#xff09;客户端请求消息格式 2&#xff09;服务器响应消息格式&#xff1a; 2.Html简介 3.Html标签 1.标签格式&#xff1a; 2.标签分类&#xff1a; 3. 常用标签&#xff1a; 1&#xff09;h1-h6标题标…

高压放大器在医疗行业生物监测中的应用

最近几年&#xff0c;随着医学领域和先进技术的不断发展&#xff0c;生物监测也变得越来越重要&#xff0c;但是各种影响因素往往会导致研究出现很多问题。这个时候就需要高压放大器发挥作用。那么高压放大器在医疗行业生物监测中如何应用呢&#xff0c;我们一起来看看。 什么是…

这8个摸鱼神器,千万别让你老板知道!

工欲善其事&#xff0c;必先利其器&#xff0c;对于程序员来说也是如此&#xff0c;想早点下班就不能死脑筋&#xff0c;必须借助于一些开发工具来提高自己的工作效率&#xff0c;小编选取了8款任务/项目管理工具&#xff0c;能助你[打通任督二脉]&#xff0c;工作效率大大提升…

Linux 安装 Jenkins

#使用yum命令安装wget yum -y install wget# 进入usr目录,创建java文件夹 cd /usr mkdir Jenkins# 进入Jenkins目录 cd ./Jenkins# 配置jenkins的环境变量 vim /etc/profile# 输入i&#xff0c;进入编辑模式&#xff0c;加入以下配置 export JENKINS_HOME/usr/Jenkins# 保存并退…

二叉搜索树(BST)

二叉搜索树是一种二叉树&#xff0c;但它对树中元素的顺序作了限制。在二叉搜索树中&#xff0c;对于任意一个结点&#xff0c;它的左子树&#xff08;如果有&#xff09;中的所有元素值都小于它&#xff0c;它的右子树中的所有元素值都大于它。那么基于这个性质&#xff0c;对…

[计算机图形学]蒙特卡洛积分与路径追踪(前瞻预习/复习回顾)

一、Monte Carlo Integration—蒙特卡洛积分 我们学过如可求解不定积分&#xff0c;前提是我们可以求出这个函数的解析式&#xff0c;但是如果我们不知道这个函数解析式是什么怎么办呢&#xff1f;我们知道黎曼积分&#xff0c;它可以把整个函数图像切分成无限密的小长方形来求…

达梦数据库中注释的使用

在管理规模较大的数据库时&#xff0c;我们往往需要面对大量的表与视图&#xff0c;与此同时在表与视图中可能会存在着许多的字段&#xff0c;让人难以迅速分辨&#xff0c;不利于对于数据库对象的管理。除了在命名时&#xff0c;对于有意义的表、视图及列&#xff0c;应尽量赋…

EPIT定时器实验(一)

EPIT定时器简介 EPIT&#xff1a;Enhanced Periodic Interrupt Timer&#xff0c;直译就是增强的周期中断定时器&#xff0c;它主要完成周期性中断定时的。 STM32里面的定时器有很多其它功能&#xff0c;比如输入捕获、PWM输出等&#xff0c;但是I.MX6U的的EPIT定时器只是完成…

c#对c++动态库的调用全流程以及详解

如果对pcl里的函数导出为动态库&#xff0c;分为以下几部分&#xff1a; 对c动态库的导出&#xff1b;c#对c动态库的加载&#xff1b;c#对第2步的调用 一、对c动态库的导出 定义导出的宏定义&#xff1a; #ifndef EXPORT # define EXPORT(rettype) __declspec( dllexport …

数据结构之单链表oJ练习

目录 1.移除单链表中与给数相同的元素 2.反转链表 3.找中间节点 4.找倒数第k个 5.合并两个有序链表 6.链表分割 7.链表的回文结构 8.找公共节点 1.移除单链表中与给数相同的元素 解题思路&#xff1a; 初始化一个新链表&#xff0c;从头结点开始遍历&#xff0c;若相同…

天猫数据分析:2023年Q1空气净化器TOP10品牌销量排行榜

随着全球工业化程度的提高&#xff0c;全球空气污染程度仍将继续增加&#xff0c;各领域对空气净化器的需求不断增长&#xff0c;这也有望带动国内空气净化器行业的市场规模保持增长。 根据鲸参谋电商数据平台的相关数据显示&#xff0c;2023年Q1在天猫平台上&#xff0c;空气净…

02_Lock锁

首先看一下JUC的重磅武器——锁&#xff08;Lock&#xff09; 相比同步锁&#xff0c;JUC包中的Lock锁的功能更加强大&#xff0c;它提供了各种各样的锁&#xff08;公平锁&#xff0c;非公平锁&#xff0c;共享锁&#xff0c;独占锁……&#xff09;&#xff0c;所以使用起来…

shell终端敲入命令计算机都做了什么?

本文参考&#xff1a; linux命令行的运行原理是什么&#xff1f; - 知乎 (zhihu.com) 8.1 键盘敲入 A 字母时&#xff0c;操作系统期间发生了什么&#xff1f; | 小林coding (xiaolincoding.com) shell命令背后的执行过程_shell 命令执行的产生的进程_kyrieguard的博客-CSDN博客…

三维动画渲染用什么软件好?

三维渲染是通过计算机应用程序把 3D 模型生成图像&#xff08;照片级真实感或非照片级真实感&#xff09;的自动化过程&#xff0c;三维动画渲染是动画制作过程的最后一步&#xff0c;该过程将各种视觉效果应用于最终模型&#xff0c;例如阴影、纹理、灯光反射和运动模糊等&…

史上最全的接口测试,吐血整理从零到接口自动化实战...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 接口测试&#xf…

04_并发容器类

1. 重现线程不安全&#xff1a;List 首先以List作为演示对象&#xff0c;创建多个线程对List接口的常用实现类ArrayList进行add操作。 public class NotSafeDemo {public static void main(String[] args) {List<String> list new ArrayList<>();for (int i 0; i…

keil移植linux(makefile)

文章目录 运行环境&#xff1a;1.1 freeRTOS_LED工程移植1)修改cubeMX配置2)setting设置3)launch设置4)修改makefile5)修改代码6)实验效果 运行环境&#xff1a; ubuntu18.04.melodic 宏基暗影骑士笔记本 stm32f427IIH6 stlink 9-24v可调电源 robomaster A 板 1.1 freeRTOS_L…