Vue3 + ChatGPT 界面搭建实战:从零构建高效对话应用

7次阅读
没有评论

共计 3181 个字符,预计需要花费 8 分钟才能阅读完成。

image.webp

背景与痛点

在当今快速发展的 AI 领域,ChatGPT 等大语言模型为开发者提供了强大的对话能力。然而,在实际开发过程中,将 ChatGPT API 与前端框架 Vue3 结合时,开发者常常会遇到一些挑战:

Vue3 + ChatGPT 界面搭建实战:从零构建高效对话应用

  • 状态管理复杂 :对话历史、用户输入、AI 回复等多状态需要高效同步
  • API 调用优化 :避免频繁请求带来的性能问题和 API 费用增加
  • 响应式设计 :确保 UI 能够实时反映对话状态变化
  • 错误处理 :网络波动、API 限制等异常情况需要妥善处理

技术选型

状态管理方案对比

  1. Pinia
  2. Vue3 官方推荐的状态管理库
  3. 更轻量、TypeScript 支持更好
  4. 更简单的 API 设计和模块化管理

  5. Vuex

  6. Vue 生态中的老牌状态管理方案
  7. 功能全面但相对复杂
  8. 对大型项目有成熟解决方案

推荐选择 :对于 ChatGPT 界面这种中等复杂度的应用,Pinia 是更优选择。

API 调用库对比

  1. Axios
  2. 功能全面,支持请求 / 响应拦截
  3. 自动 JSON 转换
  4. 取消请求和超时处理

  5. Fetch API

  6. 浏览器原生支持,无需额外依赖
  7. 更现代的 Promise-based API
  8. 需要手动处理 JSON 转换

推荐选择 :Axios 更适合生产环境,因其完善的错误处理和拦截器功能。

核心实现

项目结构

src/
├── stores/          # Pinia 状态管理
│   └── chat.js
├── api/            # API 相关
│   └── chatgpt.js
├── components/     # 可复用组件
│   └── Message.vue
└── views/
    └── ChatView.vue # 主界面 

Pinia 状态管理实现

// stores/chat.js
import {defineStore} from 'pinia'

export const useChatStore = defineStore('chat', {state: () => ({messages: [],
    isLoading: false,
    error: null
  }),
  actions: {addMessage(message) {this.messages.push(message)
    },
    setLoading(status) {this.isLoading = status},
    setError(error) {this.error = error},
    clearError() {this.error = null}
  }
})

API 服务封装

// api/chatgpt.js
import axios from 'axios'

const api = axios.create({
  baseURL: 'https://api.openai.com/v1',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${import.meta.env.VITE_OPENAI_KEY}`
  },
  timeout: 10000
})

export const sendMessage = async (messages) => {
  try {
    const response = await api.post('/chat/completions', {
      model: 'gpt-3.5-turbo',
      messages
    })
    return response.data.choices[0].message
  } catch (error) {console.error('API 调用失败:', error)
    throw error
  }
}

主组件实现

<!-- views/ChatView.vue -->
<template>
  <div class="chat-container">
    <div class="messages">
      <Message 
        v-for="(message, index) in messages" 
        :key="index" 
        :message="message" 
      />
    </div>

    <form @submit.prevent="handleSubmit">
      <input 
        v-model="inputMessage" 
        :disabled="isLoading"
        placeholder="输入消息..."
      />
      <button type="submit" :disabled="isLoading">
        {{isLoading ? '发送中...' : '发送'}}
      </button>
    </form>

    <div v-if="error" class="error">
      {{error}}
    </div>
  </div>
</template>

<script setup>
import {ref, computed} from 'vue'
import {useChatStore} from '@/stores/chat'
import {sendMessage} from '@/api/chatgpt'
import Message from '@/components/Message.vue'

const chatStore = useChatStore()
const inputMessage = ref('')

const messages = computed(() => chatStore.messages)
const isLoading = computed(() => chatStore.isLoading)
const error = computed(() => chatStore.error)

const handleSubmit = async () => {if (!inputMessage.value.trim()) return

  const userMessage = {role: 'user', content: inputMessage.value}
  chatStore.addMessage(userMessage)
  chatStore.setLoading(true)

  try {const aiMessage = await sendMessage([...messages.value, userMessage])
    chatStore.addMessage(aiMessage)
    inputMessage.value = ''
  } catch (err) {chatStore.setError('发送消息失败,请稍后再试')
  } finally {chatStore.setLoading(false)
  }
}
</script>

性能与安全

API 调用优化

  1. 节流处理
  2. 避免用户快速连续发送请求
  3. 可在前端添加 debounce 或 throttle

  4. 缓存策略

  5. 对常见查询结果进行本地缓存
  6. 使用 LRU 算法管理缓存大小

  7. 请求取消

  8. 当用户发起新请求时,取消未完成的旧请求
  9. Axios 提供了 CancelToken 机制

安全实践

  1. API 密钥保护
  2. 永远不要在前端代码中硬编码 API 密钥
  3. 使用环境变量 (如 Vite 的 import.meta.env)
  4. 生产环境应考虑使用后端代理

  5. 输入验证

  6. 对用户输入进行基本过滤
  7. 防止 XSS 攻击

  8. 速率限制

  9. 在前端实现基本速率限制
  10. 防止滥用导致 API 费用激增

避坑指南

  1. 错误处理不完善
  2. 确保捕获所有可能的错误
  3. 提供友好的用户反馈

  4. 状态管理混乱

  5. 保持状态单一来源
  6. 避免直接修改 Pinia 状态,使用 actions

  7. 性能问题

  8. 长对话历史可能导致性能下降
  9. 考虑分页或虚拟滚动

  10. API 限制

  11. 了解并遵守 ChatGPT API 的 token 限制
  12. 实现自动截断过长历史

总结与思考

通过本文的实践,我们成功构建了一个基于 Vue3 和 ChatGPT API 的高效对话界面。这种架构具有以下优势:

  • 响应式设计 :利用 Vue3 的响应式系统,界面自动更新
  • 模块化结构 :清晰分离状态管理、API 调用和 UI 组件
  • 良好性能 :通过优化避免不必要的 API 调用

未来可能的改进方向包括:

  1. 实现对话历史持久化(本地存储或数据库)
  2. 添加多语言支持
  3. 集成语音输入 / 输出功能
  4. 添加富文本格式支持(Markdown 渲染等)

希望这篇指南能帮助你顺利构建自己的 ChatGPT 对话应用。在实际开发中,记得根据具体需求进行调整和优化。

正文完
 0
评论(没有评论)