PHP和GO对接ChatGPT实现聊天机器人效果实例

 更新时间:2024年01月05日 14:13:12   作者:秋刀鱼儿啊  
这篇文章主要为大家介绍了PHP和GO对接ChatGPT实现聊天机器人效果实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

PHP部分主要是与ChatGPT API通信

<?php
// ChatGPT API Endpoint
$apiEndpoint = 'https://api.openai.com/v1/engines/gpt-3.5-turbo/completions';
// ChatGPT API密钥
$apiKey = 'YOUR_API_KEY'; // 替换为你在OpenAI上获得的API密钥
// 获取前端发送的消息
$message = $_POST['prompt'];
// 准备发送的数据
$data = [
    'prompt' => $message,
    'max_tokens' => 50,
    'temperature' => 0.7
];
// 构建HTTP请求头
$headers = [
    'Content-Type: application/json',
    'Authorization: Bearer ' . $apiKey,
    'OpenAI-Organization: org-TBIGMYjFzWqsshWUUQahkUng'
];
// 使用cURL发送HTTP POST请求
$ch = curl_init($apiEndpoint);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
// 执行cURL请求
$response = curl_exec($ch);
// 关闭cURL句柄
curl_close($ch);
// 处理ChatGPT API的响应
if ($response !== false) {
    $responseData = json_decode($response, true);
    $responseMessage = $responseData['choices'][0]['message']['content'];
    // 返回消息逐字输出
    for ($i = 0; $i < mb_strlen($responseMessage); $i++) {
        echo $responseMessage[$i];
        flush(); // 将输出立即发送给浏览器
        usleep(50000); // 等待一段时间,以实现逐字输出的效果
    }
} else {
    echo 'API请求失败。';
}
?>

使用Go语言对接ChatGPT API并实现逐字输出

在Go语言中,你可以使用net/http包来发送HTTP请求。以下是一个简单的示例代码,演示如何使用Go语言对接ChatGPT API并实现逐字输出:

package main
import (
  "bytes"
  "encoding/json"
  "fmt"
  "io/ioutil"
  "net/http"
  "os"
  "time"
)
// ChatGPT API Endpoint
const apiEndpoint = "https://api.openai.com/v1/engines/gpt-3.5-turbo/completions"
// ChatGPT API密钥
const apiKey = "YOUR_API_KEY" // 替换为你在OpenAI上获得的API密钥
func main() {
  // 获取用户输入的消息
  fmt.Print("输入消息: ")
  var message string
  fmt.Scanln(&message)
  // 准备发送的数据
  data := map[string]interface{}{
    "prompt":      message,
    "max_tokens":  50,
    "temperature": 0.7,
  }
  // 将数据转换为JSON格式
  jsonData, err := json.Marshal(data)
  if err != nil {
    fmt.Println("JSON编码错误:", err)
    os.Exit(1)
  }
  // 创建HTTP请求
  request, err := http.NewRequest("POST", apiEndpoint, bytes.NewBuffer(jsonData))
  if err != nil {
    fmt.Println("创建HTTP请求错误:", err)
    os.Exit(1)
  }
  // 设置请求头
  request.Header.Set("Content-Type", "application/json")
  request.Header.Set("Authorization", "Bearer "+apiKey)
  request.Header.Set("OpenAI-Organization", "org-TBIGMYjFzWqsshWUUQahkUng")
  // 发送HTTP请求
  client := http.Client{}
  response, err := client.Do(request)
  if err != nil {
    fmt.Println("发送HTTP请求错误:", err)
    os.Exit(1)
  }
  defer response.Body.Close()
  // 读取响应数据
  responseData, err := ioutil.ReadAll(response.Body)
  if err != nil {
    fmt.Println("读取响应数据错误:", err)
    os.Exit(1)
  }
  // 处理ChatGPT API的响应
  var jsonResponse map[string]interface{}
  err = json.Unmarshal(responseData, &jsonResponse)
  if err != nil {
    fmt.Println("JSON解码错误:", err)
    os.Exit(1)
  }
  // 获取生成的消息
  responseMessage := jsonResponse["choices"].([]interface{})[0].(map[string]interface{})["message"].(map[string]interface{})["content"].(string)
  // 返回消息逐字输出
  for _, char := range responseMessage {
    fmt.Print(string(char))
    time.Sleep(100 * time.Millisecond) // 每100毫秒输出一个字
  }
}

请注意,这是一个简单的示例,你可能需要根据实际需求进行修改和优化。确保将YOUR_API_KEY替换为你在OpenAI上获得的API密钥。同时,考虑到安全性,你可能需要采取措施来保护API密钥,比如在服务器端进行处理,而不是直接在前端处理

前端请求后端接口效果

以下是前端请求后端接口效果,示例代码:

<template>
  <view class="chat-container">
    <view class="message-list">
      <!-- 这里是消息列表,用于显示聊天记录 -->
      <view v-for="(message, index) in messages" :key="index" class="message-item">
        <view :class="message.isSender ? 'sender-message' : 'receiver-message'" class="message-bubble">
          {{ message.content }}
        </view>
      </view>
    </view>
    <view class="input-bar">
      <!-- 输入框和发送按钮 -->
      <input class="input-box" type="text" v-model="newMessage" placeholder="输入消息..." />
      <button @click="sendMessage" class="send-button">发送</button>
    </view>
  </view>
</template>
<script>
  export default {
    data() {
      return {
        messages: [],
        newMessage: '' // 用于存储新消息
      };
    },
    methods: {
      sendMessage() {
        if (this.newMessage.trim() !== '') {
          const message = this.newMessage
          this.messages.push({
            content: this.newMessage,
            isSender: true
          });
          this.newMessage = ''; // 清空输入框
          // 准备发送的数据
          const data = {
            prompt:message,
            max_tokens:50,
            temperature:0.7
          };
          uni.request({
            url: '',//后端请求接口
            method: 'POST',
            data: data,
            success: (res) => {
              console.log('ChatGPT Response:', res.data);
              // 返回消息逐字输出
              const responseMessage = res.data.message;
              let index = 0;
              this.messages.push({
                content: '',
                isSender: false
              });
              const printMessageInterval = setInterval(() => {
                const partialMessage = responseMessage.substring(0, index +
                1); // 获取部分消息
                this.messages[this.messages.length - 1].content = partialMessage; // 更新最后一条消息内容
                index++;
                // 当消息输出完毕后清除间隔函数
                if (index === responseMessage.length) {
                  clearInterval(printMessageInterval);
                }
              }, 100); // 每100毫秒输出一个字
            },
            fail: (err) => {
              console.error('ChatGPT Error:', err);
              // 处理错误
            }
          });
        }
      }
    }
  };
</script>
<style scoped>
  /* 页面容器 */
  .chat-container {
    display: flex;
    flex-direction: column;
    height: 100vh;
  }
  /* 消息列表 */
  .message-list {
    flex: 1;
    overflow-y: scroll;
    padding: 10px;
  }
  /* 消息项样式 */
  .message-item {
    display: flex;
    justify-content: flex-start;
    margin-bottom: 10px;
  }
  .sender-message {
    align-self: flex-end;
    background-color: #c3e88d;
    padding: 8px;
    border-radius: 8px;
    margin-left: auto;
    /* 将发送者消息框推到右侧 */
  }
  .receiver-message {
    align-self: flex-start;
    background-color: #f0f0f0;
    padding: 8px;
    border-radius: 8px;
    margin-right: auto;
    /* 将接收者消息框推到左侧 */
  }
  .message-bubble {
    max-width: 70%;
    /* 调整消息框的最大宽度 */
  }
  /* 输入框和发送按钮 */
  .input-bar {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 10px;
    position: fixed;
    bottom: 0;
    width: 100%;
    background-color: #ffffff;
  }
  .input-box {
    flex: 1;
    height: 36px;
    border: 1px solid #ccc;
    border-radius: 5px;
    padding: 5px;
    margin-right: 10px;
  }
  .send-button {
    background-color: #409eff;
    color: white;
    border: none;
    border-radius: 5px;
  }
</style>

以上就是PHP和GO对接ChatGPT实现聊天机器人效果实例的详细内容,更多关于PHP GO对接ChatGP聊天机器人的资料请关注脚本之家其它相关文章!

相关文章

  • 深入刨析Golang-map底层原理

    深入刨析Golang-map底层原理

    这篇文章主要介绍了深入刨析Golang-map底层原理,Go 语言的 map 的使用非常简易, 但其内部实现相对比较复杂,文中有相关的代码示例,,需要的朋友可以参考下
    2023-05-05
  • Go基础教程系列之回调函数和闭包详解

    Go基础教程系列之回调函数和闭包详解

    这篇文章主要介绍了Go基础教程系列之回调函数和闭包详解,需要的朋友可以参考下
    2022-04-04
  • 解决go语言ssh客户端密码过期问题

    解决go语言ssh客户端密码过期问题

    这篇文章主要介绍了go语言ssh客户端解决密码过期问题,本文给大家分享了解决的方法和原理,非常不错,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • Go语言学习之链表的使用详解

    Go语言学习之链表的使用详解

    链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。本文将详细为大家介绍Go语言中链表的使用,感兴趣的可以了解一下
    2022-04-04
  • Golang Mutex 原理详细解析

    Golang Mutex 原理详细解析

    这篇文章主要介绍了Golang Mutex原理详细解析,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • golang搭建静态web服务器的实现方法

    golang搭建静态web服务器的实现方法

    这篇文章主要介绍了golang搭建静态web服务器的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • golang cobra使用chatgpt qdrant实现ai知识库

    golang cobra使用chatgpt qdrant实现ai知识库

    这篇文章主要为大家介绍了golang cobra使用chatgpt qdrant实现ai知识库,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Go语言对JSON数据进行序列化和反序列化

    Go语言对JSON数据进行序列化和反序列化

    这篇文章介绍了Go语言对JSON数据进行序列化和反序列化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Go 加密解密算法小结

    Go 加密解密算法小结

    加密解密在实际开发中应用比较广泛,常见的加解密分为三种,本文就详细的介绍一下Go 加密解密算法,具有一定的参考价值,感兴趣的可以了解一下
    2022-01-01
  • GoLang中的sync包Once使用执行示例

    GoLang中的sync包Once使用执行示例

    这篇文章主要介绍了GoLang中的sync包Once使用执行示例,没有学习Once前,大家可能想到 声明一个标识,表示是否初始化过,然后初始化这个标识加锁,更新这个标识,Once包主要用于在并发执行代码的时候,某部分代码只会被执行一次
    2023-03-03

最新评论