100 行代码手写 ChatGPT 应用

ChatGPT 推出了面向企业和个人的 API 服务 gpt-3.5-turbo,好奇心驱使,立马动手实践!

手写 ChatGPT ?这里当然不是实现 AI 算法与大模型这些核心能力。仅仅演示如何使用开放 API 实现自己的 ChatGPT 问答小工具,作为 AI 产品化探索的第一步,抛砖引玉。

学会了,你也可以定制自己的阿猫阿狗 GPT、CheatPPT、PUA GPT …

1. 开发准备

3 月 2 日,OpenAI 发布了最新的 GPT 3.5 turbo API,该款产品更快、更强、更便宜。本文基于官方文档使用 JavaScript 调用官方 API 接口,仅 100 行前端代码的 index.html,实现定制版的 ChatGPT 问答工具。

Step 1 注册 OpenAI 账号

首先需要注册 openai 账号,可以参考这个教程:https://sms-activate.org/cn/info/ChatGPT

由于注册 OpenAI 需要使用海外的手机号,可以使用 sms-activate 这个网站购买一个印度的手机号接收验证码即可,充值1美元(大概7块钱人民币)即可获得 70+ 卢布,足够了。

如果嫌以上注册太麻烦,直接淘宝 15 块一个购买即可

Step 2 获取 API KEY

登录 OPenAI 个人中心,https://platform.openai.com/signup 获取自己的 API_KEY 以及查看使用量额度。

Tips:目前每个新账户有 18$ 的免费额度,价格是 $0.002 / 1k tokens

每输出 100 万个单词,价格才 2.7 美元(约 18 元人民币)

2. 代码实现

前端实现一个单聊对话 Web 应用,其实难度不大,尤其使用 Vue 等现代前端框架后,只需要维护好聊天数据源 Array 与请求逻辑即可,渲染这块无需过多关注。

直接上代码:

<!DOCTYPE html>
<html>
  <head>
    <title>100 行代码手写 chatgpt</title>
    <meta charset="UTF-8" />
    <script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no,viewport-fit=cover"
    />
  </head>

  <body>
    <div id="app" style="padding: 4rem 0;">
      <h1 style="text-align: center;">Dengju GPT  </h1>
      <p style="text-align: center;">@dengjudeng</p>

      <br />

      <div style="text-align: center;">
        <input
		   :disabled="isTyping"
          v-model="message"
          style="width: calc(100% - 4rem); padding: 0.5rem;"
          autofocus
          :placeholder="isTyping ? 'ChatGPT 正在组织语言 ...' : '问问 ChatGPT ...'"
          type="text"
		   @blur="handleSend"
          @keyup.enter="handleSend"
        />
      </div>

      <br />

      <ul v-for="(message, key) in [...messages].reverse()" :key="key">
        <li>
          <div style="color: #6b7280;">{{ message.role }}</div>
          <div style="white-space: pre-wrap;">{{message.content}}</div>
        </li>
      </ul>
    </div>
    <script>
      new Vue({
        el: "#app",
        data() {
          return {
            message: "",
            isTyping: false,
            messages: [
              {
                content: "Hi, 我是 ChatGPT!你可以问我任何事情! ",
                role: "assistant"
              }
            ]
          };
        },
        methods: {
          handleSend: async function () {
			if(!this.message) return
            const newMessage = {
              content: this.message,
              role: "user"
            };
            const newMessages = [...this.messages, newMessage];
            this.messages = newMessages;
            this.isTyping = true;
            await this.processMessageToChatGPT(newMessages);
            this.isTyping = false;
          },
          processMessageToChatGPT: async function (messages) {
            const API_KEY = "sk-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
            const apiRequestBody = {
              model: "gpt-3.5-turbo",
              messages: messages
            };
            this.message = "";
            const data = await fetch(
              "https://api.openai.com/v1/chat/completions",
              {
                method: "POST",
                headers: {
                  Authorization: "Bearer " + API_KEY,
                  "Content-Type": "application/json"
                },
                body: JSON.stringify(apiRequestBody)
              }
            ).then((data) => data.json());
            this.messages = [
              ...messages,
              {
                content: data.choices[0].message.content,
                role: "assistant"
              }
            ];
          }
        }
      });
    </script>
  </body>
</html>

写到这里,刚好是100 行代码,直接落地一个 ChatGPT 聊天应用 ~

100 行代码手写 chagpt – CodeSandbox

3. 重点难点

一)不建议前端直接调用

虽然直接调用官方 OpenAPI 不会跨域,但实际生产中不建议在前端直接调用 API,会泄露你的 API_KEY,需要后台同学包一个接口给前端使用。

[POST] https://api.openai.com/v1/chat/completions

二)返回内容文本如何换行?

返回结果文本换行,可以使用 CSS white-space: pre-wrap;

<div style="white-space: pre-wrap;">{{message.content}}</div>

三)如何实现返回结果打字动画效果?

推荐一个我之前使用过的库 typical,仅仅 55 行代码一气呵成。

四)返回结果是代码格式的话,如何实现代码高亮效果?

这里推荐使用 prism.js 进行语法高亮,还能使用最近比较火的 WebContainer 在聊天中运行代码。

4. 小结

AIGC 大模型时代来临了,在日常办公协同中,一定程度上确实能提升工作效率,辅助我们做很多事情。

这波浪潮,使得 AI 应用落地的门槛非常低。无需再招聘百万高薪的 NLP 工程师来训练和调参,只需不断用人类自然语言 Prompts 引导微调就能完成这一过程。

理论上,你只需要找一个做前端的老婆,结合一个应用场景,你们俩就能做一家 AI 创业公司。

免责声明:以上报告均系本平台通过公开、合法渠道获得,报告版权归原撰写/发布机构所有,如涉侵权,请联系删除;资料为推荐阅读,仅供参考学习,如对内容存疑,请与原撰写/发布机构联系。
蝉鸣AI生产力-教你用AI卷别人(原AIGC知识星球) » 100 行代码手写 ChatGPT 应用

发表回复

收集国内外1200+ AI工具

了解AI工程学 关于我们