Vue 3 + OpenAI API 实战:打造多场景智能对话系统(附上下文记忆与角色切换)

张开发
2026/6/6 5:22:50 15 分钟阅读
Vue 3 + OpenAI API 实战:打造多场景智能对话系统(附上下文记忆与角色切换)
1. 项目背景与核心功能最近两年AI对话系统已经从实验室走向了千家万户。想象一下你正在开发一个在线教育平台需要让AI老师记住学生上周的学习进度或者你在做一个电商客服系统希望AI能根据用户之前的咨询记录提供个性化回复。这些场景都需要一个能记住对话历史、还能随时切换身份的智能对话系统。我用Vue 3和OpenAI API做了一个多场景对话系统原型核心功能包括上下文记忆像真人聊天一样记住之前的对话内容角色切换一键让AI变成翻译官、写作导师或心理咨询师流畅交互自动滚动、加载动画等细节优化这个系统特别适合用在三类场景在线教育AI老师能记住学生的学习弱点智能客服根据用户历史问题提供精准解答内容创作快速切换不同风格的写作助手2. 技术选型与环境搭建2.1 为什么选择Vue 3 OpenAIVue 3的Composition API让状态管理变得特别清晰正好适合处理对话这种有复杂状态交互的场景。相比ReactVue的响应式系统在管理对话历史这类嵌套数据时更省心。技术栈搭配方案核心框架Vue 3 TypeScriptUI库Tailwind CSS轻量级适合快速迭代HTTP客户端AxiosAI能力OpenAI Chat Completion API2.2 五分钟快速配置首先去OpenAI官网获取API Key注意要保管好别直接写在代码里。然后在项目根目录创建.env文件VITE_OPENAI_API_KEY你的key安装依赖我用的是pnpmnpm/yarn也行pnpm add axios pnpm add -D tailwindcss postcss autoprefixer npx tailwindcss init -p提示如果遇到网络问题可以尝试配置镜像源。Tailwind可以替换成你熟悉的UI库比如Element Plus。3. 实现智能对话核心功能3.1 封装OpenAI接口在utils/openai.ts里创建基础请求import axios from axios const instance axios.create({ baseURL: https://api.openai.com/v1, headers: { Content-Type: application/json, Authorization: Bearer ${import.meta.env.VITE_OPENAI_API_KEY} } }) export async function chatWithGPT( messages: ChatMessage[], model gpt-3.5-turbo ) { try { const res await instance.post(/chat/completions, { model, messages, temperature: 0.7 }) return res.data.choices[0].message } catch (error) { console.error(API请求出错:, error) throw error } }这里有几个实用技巧加了temperature参数控制回答的随机性用try-catch包裹请求便于错误处理类型声明让代码更健壮3.2 上下文记忆实现消息结构设计是关键要符合OpenAI的格式要求interface ChatMessage { role: system | user | assistant content: string timestamp?: number // 可选的时间戳 }在Vue组件中管理对话状态const messages refChatMessage[]([ { role: system, content: 你是一个乐于助人的AI助手回答要简明扼要, timestamp: Date.now() } ]) const sendMessage async () { if (!input.value.trim()) return // 添加用户消息 messages.value.push({ role: user, content: input.value, timestamp: Date.now() }) // 清空输入框 const currentMessage input.value input.value try { loading.value true const reply await chatWithGPT(messages.value) messages.value.push({ ...reply, timestamp: Date.now() }) } catch (error) { messages.value.push({ role: assistant, content: 抱歉我遇到了一些问题请稍后再试, timestamp: Date.now() }) } finally { loading.value false } }4. 多角色切换实战4.1 角色预设系统在constants/roles.ts定义角色模板export const ROLE_TEMPLATES { DEFAULT: 你是一个乐于助人的AI助手, TRANSLATOR: 你是一个专业翻译官遵守以下规则 1. 用户说中文时翻译成英文 2. 用户说英文时翻译成中文 3. 保持原意不变 , WRITING_COACH: 你是一个写作教练帮助用户改进文本 1. 先指出语法错误 2. 提供三个优化版本 3. 解释修改原因 , PSYCHOLOGIST: 你是一个心理咨询师需要 1. 先共情用户的情绪 2. 提出开放式问题 3. 避免直接给建议 }4.2 动态切换实现在组件中添加角色选择器template select v-modelcurrentRole changehandleRoleChange classpx-3 py-2 border rounded option valueDEFAULT默认助手/option option valueTRANSLATOR翻译官/option option valueWRITING_COACH写作导师/option option valuePSYCHOLOGIST心理咨询师/option /select /template script setup const currentRole ref(DEFAULT) const handleRoleChange () { messages.value [ { role: system, content: ROLE_TEMPLATES[currentRole.value], timestamp: Date.now() } ] } /script5. 高级功能与优化技巧5.1 对话持久化使用pinia localStorage实现聊天记录保存// stores/chat.ts import { defineStore } from pinia export const useChatStore defineStore(chat, { state: () ({ history: [] as ChatMessage[] }), actions: { saveMessages(messages: ChatMessage[]) { this.history messages localStorage.setItem(chat_history, JSON.stringify(messages)) }, loadMessages() { const saved localStorage.getItem(chat_history) if (saved) this.history JSON.parse(saved) } } })5.2 Markdown渲染安装marked库并创建自定义组件pnpm add marked types/markedtemplate div v-htmlrenderedContent classprose/div /template script setup import { marked } from marked import { computed } from vue const props defineProps{ content: string }() const renderedContent computed(() marked(props.content, { breaks: true }) ) /script5.3 性能优化对于长对话可以启用摘要功能减少token消耗async function summarizeHistory(messages: ChatMessage[]) { const prompt 请用100字以内总结以下对话的核心内容 保留关键信息和决策点 ${messages.map(m ${m.role}: ${m.content}).join(\n)} const res await chatWithGPT([ { role: user, content: prompt } ], gpt-3.5-turbo-16k) return res.content }6. 常见问题排查问题1API返回速度慢解决方案检查模型选择gpt-3.5-turbo比gpt-4快很多适当降低temperature值问题2上下文丢失解决方案确保每次请求都发送完整的messages数组检查system message是否在最前面问题3token超限解决方案使用gpt-3.5-turbo-16k模型实现自动摘要功能截断过长的历史消息我在实际项目中发现当对话超过20轮时最好主动提示用户开启新话题。另外对于客服场景建议设置5分钟无交互自动结束会话的机制避免资源浪费。

更多文章