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

9次阅读
没有评论

共计 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
评论(没有评论)