OpenAI与Vue结合的详细步骤和示例

以下是将OpenAI与Vue结合的详细步骤和示例,帮助你构建一个可以与OpenAI的服务(如ChatGPT等模型)进行交互的Vue应用:

一、环境搭建与准备

  1. 创建Vue项目
    确保已安装Node.js和npm(Node Package Manager),然后通过命令行使用 vue create 命令创建一个Vue项目。例如:
vue create openai-vue-project

按照提示选择相应配置(如是否使用TypeScript、路由、状态管理等),创建完成后进入项目目录:

cd openai-vue-project
  1. 获取OpenAI API Key
    登录OpenAI官网(https://platform.openai.com/)注册账号,在账户相关设置中找到“View API Keys”选项,点击“Create new secret key”来创建新的API密钥,并妥善保存该密钥,后续代码中会用它来调用OpenAI的API服务。

二、安装相关依赖

在Vue项目中,需要安装用于向OpenAI API发送HTTP请求的库,常用的是 axios,在项目根目录下的命令行执行以下安装命令:

npm install axios

三、在Vue组件中集成OpenAI

以下以在Vue组件中调用OpenAI的 gpt-3.5-turbo 模型进行问答交互为例进行说明,在 src/components 目录下创建一个名为 OpenAIChat.vue 的组件文件,示例代码如下:

<template>
  <div>
    <input v-model="userQuestion" placeholder="请输入你的问题" />
    <button @click="sendQuestionToOpenAI">向OpenAI提问button>
    <div v-if="openAIResponse">{{openAIResponse}}div>
  div>
template>

<script>
import axios from 'axios';
export default {
  data() {
    return {
      userQuestion: '',
      openAIResponse: null
    };
  },
  methods: {
    async sendQuestionToOpenAI() {
      try {
        const apiKey = 'YOUR_API_KEY'; // 将此处替换为你自己获取的OpenAI API Key
        const question = this.userQuestion;
        const response = await axios.post(
          'https://api.openai.com/v1/chat/completions',
          {
            model: "gpt-3.5-turbo",
            messages: [{"role": "user", "content": question}]
          },
          {
            headers: {
              'Authorization': `Bearer ${apiKey}`,
              'Content-Type': 'application/json'
            }
          }
        );
        this.openAIResponse = response.data.choices[0].message.content;
      } catch (error) {
        console.error(error);
        this.openAIResponse = '很抱歉,请求出现错误,请稍后再试。';
      }
    }
  }
};
script>

<style scoped>
/* 这里可以添加组件相关的样式,比如输入框、按钮等的样式 */
style>

在上述组件代码中:

  • 模板(template)部分
    • 创建了一个输入框,通过 v-model 指令将输入框的值与组件的 userQuestion 数据属性进行双向绑定,方便获取用户输入的问题。
    • 定义了一个按钮,绑定 sendQuestionToOpenAI 点击事件,用于触发向OpenAI发送问题的操作。
    • 还有一个 div 元素,通过 v-if 指令根据 openAIResponse 的值来决定是否显示,用于展示OpenAI返回的回复内容。
  • 脚本(script)部分
    • 首先导入 axios 库,用于发送HTTP请求到OpenAI API。
    • data 函数中定义了两个数据属性:userQuestion 用于存储用户输入的问题,openAIResponse 用于存储OpenAI返回的回复内容,初始值设为 null
    • sendQuestionToOpenAI 方法是核心逻辑所在,它是一个异步方法。在方法内部:
      • 先获取之前保存的OpenAI API Key,然后拿到用户输入的问题。
      • 使用 axios 向OpenAI API的 https://api.openai.com/v1/chat/completions 端点发送POST请求,按照API要求,在请求体中传入要使用的模型(这里是 gpt-3.5-turbo)以及包含用户问题的消息对象(格式为 [{"role": "user", "content": question}]),同时在请求头中添加授权信息(即 Authorization 字段,格式为 Bearer YOUR_API_KEY)和内容类型信息(Content-Typeapplication/json)。
      • 当请求成功后,将从返回的数据中提取出回复内容,并赋值给 openAIResponse 属性;若请求出现错误,则在控制台打印错误信息,并给 openAIResponse 设置相应的错误提示内容。

四、在Vue应用中使用该组件

src/App.vue 文件中引入并使用 OpenAIChat.vue 组件,示例代码如下:

<template>
  <div id="app">
    <OpenAIChat />
  div>
template>

<script>
import OpenAIChat from './components/OpenAIChat.vue';
export default {
  components: {
    OpenAIChat
  }
};
script>

<style>
/* 可以添加全局的样式 */
style>

这样,运行Vue项目后,在页面上就能通过输入框输入问题,点击按钮向OpenAI发送请求,并展示相应的回复内容,实现了OpenAI与Vue的基本结合应用。

五、功能扩展与优化

  1. 实现多轮对话功能
    要实现多轮对话,需要在每次向OpenAI发送请求时,携带之前的对话历史信息。修改 OpenAIChat.vue 组件的 script 部分代码,示例如下:
<script>
import axios from 'axios';
export default {
  data() {
    return {
      userQuestion: '',
      openAIResponse: null,
      conversationHistory: [] // 新增对话历史数组
    };
  },
  methods: {
    async sendQuestionToOpenAI() {
      try {
        const apiKey = 'YOUR_API_KEY';
        const question = this.userQuestion;
        // 将当前问题添加到对话历史中
        this.conversationHistory.push({"role": "user", "content": question});
        const response = await axios.post(
          'https://api.openai.com/v1/chat/completions',
          {
            model: "gpt-3.5-turbo",
            messages: this.conversationHistory // 传递对话历史
          },
          {
            headers: {
              'Authorization': `Bearer ${apiKey}`,
              'Content-Type': 'application/json'
            }
          }
        );
        const answer = response.data.choices[0].message.content;
        // 将OpenAI的回复添加到对话历史中
        this.conversationHistory.push({"role": "assistant", "content": answer});
        this.openAIResponse = answer;
      } catch (error) {
        console.error(error);
        this.openAIResponse = '很抱歉,请求出现错误,请稍后再试。';
      }
    }
  }
};
</script>

在上述代码中:

  • data 函数里新增了 conversationHistory 属性,用于存储对话历史信息,初始化为空数组。
  • sendQuestionToOpenAI 方法内,先将用户当前输入的问题以正确的格式添加到 conversationHistory 数组中,然后将整个对话历史数组作为消息内容传递给OpenAI API请求。当获取到回复后,同样把回复内容以相应格式添加到 conversationHistory 数组中,以便后续的对话轮次可以参考之前的交流内容,并且将回复内容展示在页面上。
  1. 优化用户界面与交互体验
    • 添加加载提示:可以在发送请求时,显示一个加载动画(例如使用Vue的过渡效果或者引入第三方的加载动画组件),让用户知道正在等待回复,避免用户误操作或者产生疑惑。
    • 输入框验证:对用户输入的问题进行验证,比如限制输入长度、禁止输入特殊非法字符等,确保发送给OpenAI的请求数据格式正确,提高交互的稳定性。
    • 清除对话历史功能:添加一个按钮,点击可以清空 conversationHistory 数组以及 openAIResponse 等相关数据,方便用户重新开始对话。

通过以上这些步骤和优化方式,能够更加有效地将OpenAI与Vue相结合,构建出功能丰富、交互友好的应用,满足不同场景下与OpenAI服务交互的需求。

你可能感兴趣的:(前端)