Cogito-V1-Preview-Llama-3B 微信小程序开发集成AI对话功能实战最近在做一个宠物社区的小程序用户总在后台问一些关于养宠的常见问题比如“狗狗拉肚子怎么办”、“猫咪吃什么猫粮好”。人工回复效率低还经常半夜被消息吵醒。我就琢磨着能不能给小程序加个智能客服让它来回答这些基础问题。正好看到了Cogito-V1-Preview-Llama-3B这个模型它体积不大但对话能力据说不错特别适合集成到移动端应用里。最关键的是它支持上下文记忆这意味着用户可以和它进行多轮对话体验会更自然不像那些“一问一答”的机器人那么呆板。于是我花了几天时间把Cogito模型成功接入了我的微信小程序。现在这个“AI宠物顾问”已经能流畅地回答用户的大部分基础咨询解放了我不少时间。整个过程比想象中要简单核心就是通过云函数调用模型API再在小程序前端做好交互。如果你也想给自己的小程序增加点“智能”不妨跟着我的步骤试试看。1. 项目准备与环境搭建在开始敲代码之前我们需要把“舞台”搭好。这里主要涉及两件事一是创建并配置好微信小程序项目二是准备好能够调用Cogito模型的后端服务。对于小程序开发者来说云函数是个省心省力的选择。1.1 创建微信小程序项目打开微信开发者工具点击“新建项目”。项目名称可以随意比如“SmartChatMiniProgram”。AppID如果你有就填上没有的话选择“测试号”也能进行开发只是部分功能会受限。项目创建好后我们重点关注两个地方一个是项目根目录下的project.config.json它记录了项目配置另一个是app.json这是小程序的全局配置文件。为了让小程序能使用网络请求和云开发能力我们需要在app.json里声明一下。// app.json { pages: [ pages/index/index ], window: { backgroundTextStyle: light, navigationBarBackgroundColor: #fff, navigationBarTitleText: AI智能助手, navigationBarTextStyle: black }, permission: { scope.userLocation: { desc: 你的位置信息将用于展示天气等上下文信息 } }, // 确保网络请求相关配置正确 requiredBackgroundModes: [audio], networkTimeout: { request: 10000, connectSocket: 10000, uploadFile: 10000, downloadFile: 10000 } }1.2 启用并初始化云开发我们计划用云函数来调用AI模型API这样安全又方便。在开发者工具顶部菜单栏找到“云开发”按钮并点击开通云开发环境。开通后你会得到一个环境ID比如env-xxx。接下来要在小程序中初始化云开发。在app.js的onLaunch生命周期函数里添加初始化代码。// app.js App({ onLaunch: function () { // 初始化云开发 if (!wx.cloud) { console.error(请使用 2.2.3 或以上的基础库以使用云能力); } else { wx.cloud.init({ // 替换成你的云开发环境ID env: your-env-id, traceUser: true, // 记录用户访问 }); } } });初始化完成后在开发者工具的“云开发”控制台里我们点击“云函数”然后新建一个云函数名字就叫callCogitoAI。这个函数将作为我们小程序和Cogito模型之间的桥梁。2. 构建后端桥梁云函数调用AI模型云函数相当于我们部署在微信云上的一个小型服务器端程序。它的任务是接收小程序发来的用户对话内容去调用部署好的Cogito模型API拿到AI的回复后再传回给小程序。2.1 编写云函数核心逻辑在刚创建的callCogitoAI云函数目录下找到index.js文件。我们需要在这里编写主要的逻辑。假设你的Cogito模型已经部署在某个服务器上并提供了一个HTTP API接口例如https://your-model-server.com/v1/chat/completions。// cloudfunctions/callCogitoAI/index.js const cloud require(wx-server-sdk); cloud.init(); // 引入axios用于发送HTTP请求需要在云函数目录下安装npm install axios const axios require(axios); exports.main async (event, context) { try { // 1. 接收从小程序前端传来的数据 const { messages, maxTokens 500 } event; // messages 应该是一个数组格式类似 // [{role: user, content: 你好}, {role: assistant, content: 你好有什么可以帮您}] if (!messages || messages.length 0) { return { code: 400, msg: 消息内容不能为空 }; } // 2. 构建请求体调用Cogito模型API // 注意这里需要替换成你实际部署的模型API地址和可能的API Key const apiEndpoint https://your-model-server.com/v1/chat/completions; const requestData { model: cogito-v1-preview-llama-3b, // 模型名称根据实际调整 messages: messages, // 包含历史上下文的对话列表 max_tokens: maxTokens, // 生成回复的最大长度 temperature: 0.7, // 控制回复的随机性0.0-1.0值越高越有创意 stream: false, // 我们先用非流式简单些 }; const response await axios.post(apiEndpoint, requestData, { headers: { Content-Type: application/json, // 如果有API Key在这里添加 // Authorization: Bearer YOUR_API_KEY }, timeout: 15000, // 设置超时时间避免长时间等待 }); // 3. 处理模型返回的数据 const aiReply response.data.choices[0]?.message?.content; if (!aiReply) { throw new Error(模型返回数据格式异常); } // 4. 将AI回复返回给小程序前端 return { code: 200, data: { reply: aiReply, // 你也可以把完整的对话上下文返回方便前端维护 fullMessage: [...messages, { role: assistant, content: aiReply }] } }; } catch (error) { console.error(云函数调用AI模型失败:, error); // 返回错误信息前端可以展示给用户 return { code: 500, msg: 请求AI助手时出错: ${error.message || 网络或服务异常}, data: null }; } };写完代码后记得在callCogitoAI目录下打开终端运行npm install axios来安装依赖。然后右键点击云函数选择“上传并部署云端安装依赖”。2.2 处理上下文记忆Cogito模型支持上下文这是实现连贯对话的关键。上下文其实就是把之前你和AI的对话历史每次提问时都一起发给模型。在我们的云函数里messages参数就承载了这个历史。小程序前端需要维护一个对话列表。每次用户发送新消息就把这条user消息追加到列表末尾然后连同整个列表发给云函数。云函数处理完后返回的fullMessage里包含了AI的新回复前端再把这个列表更新用于下一次对话。这样就形成了一个滚动的记忆窗口。3. 设计前端聊天界面与交互后端通了接下来就是让用户能看得见、用得爽。我们需要一个小程序页面来展示聊天界面。3.1 构建基础聊天页面在pages/index目录下我们主要修改三个文件index.wxml结构、index.wxss样式、index.js逻辑。首先是结构一个典型的聊天界面包含消息列表、输入框和发送按钮。!-- pages/index/index.wxml -- view classcontainer !-- 聊天消息区域 -- scroll-view classchat-list scroll-y scroll-into-view{{scrollToView}} scroll-with-animation block wx:for{{messageList}} wx:keyindex !-- 用户消息 -- view wx:if{{item.role user}} classmessage-row user-row view classmessage-bubble user-bubble{{item.content}}/view /view !-- AI消息 -- view wx:if{{item.role assistant}} classmessage-row ai-row view classavatarAI/view view classmessage-bubble ai-bubble{{item.content}}/view /view /block !-- 加载指示器 -- view wx:if{{isLoading}} classmessage-row ai-row view classavatarAI/view view classmessage-bubble ai-bubble typing-indicator text./texttext./texttext./text /view /view /scroll-view !-- 输入区域 -- view classinput-area input classinput-box value{{inputValue}} bindinputonInput placeholder请输入您的问题... confirm-typesend bindconfirmsendMessage focus{{autoFocus}} / button classsend-btn bindtapsendMessage disabled{{isLoading}}发送/button /view /view接着是样式让界面看起来舒服些。/* pages/index/index.wxss */ .container { height: 100vh; display: flex; flex-direction: column; background-color: #f5f5f5; } .chat-list { flex: 1; padding: 20rpx; box-sizing: border-box; overflow: auto; } .message-row { display: flex; margin-bottom: 30rpx; } .user-row { justify-content: flex-end; } .ai-row { justify-content: flex-start; align-items: flex-start; } .avatar { width: 80rpx; height: 80rpx; border-radius: 50%; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; display: flex; align-items: center; justify-content: center; font-size: 28rpx; font-weight: bold; margin-right: 20rpx; flex-shrink: 0; } .message-bubble { max-width: 70%; padding: 20rpx 30rpx; border-radius: 12rpx; font-size: 32rpx; line-height: 1.5; word-wrap: break-word; } .user-bubble { background-color: #95ec69; color: #000; border-bottom-right-radius: 4rpx; } .ai-bubble { background-color: #fff; color: #333; border-bottom-left-radius: 4rpx; box-shadow: 0 2rpx 12rpx rgba(0,0,0,0.1); } .typing-indicator { display: flex; } .typing-indicator text { animation: blink 1.4s infinite both; margin-right: 4rpx; } .typing-indicator text:nth-child(2) { animation-delay: 0.2s; } .typing-indicator text:nth-child(3) { animation-delay: 0.4s; } keyframes blink { 0%, 100% { opacity: 0.2; } 50% { opacity: 1; } } .input-area { display: flex; padding: 20rpx; background-color: #fff; border-top: 1rpx solid #eee; align-items: center; } .input-box { flex: 1; border: 1rpx solid #ddd; border-radius: 40rpx; padding: 20rpx 30rpx; font-size: 32rpx; margin-right: 20rpx; background-color: #f9f9f9; } .send-btn { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border-radius: 40rpx; padding: 0 40rpx; height: 80rpx; line-height: 80rpx; font-size: 32rpx; } .send-btn[disabled] { opacity: 0.6; }3.2 实现聊天逻辑与数据绑定最后是页面的逻辑部分负责处理用户输入、调用云函数、更新界面。// pages/index/index.js Page({ data: { inputValue: , // 输入框内容 messageList: [], // 所有消息列表用于维护上下文 isLoading: false, // 是否正在加载AI回复 scrollToView: , // 用于控制滚动到底部 autoFocus: true // 自动聚焦输入框 }, onInput(e) { // 监听输入框变化 this.setData({ inputValue: e.detail.value }); }, async sendMessage() { const userInput this.data.inputValue.trim(); if (!userInput || this.data.isLoading) return; // 1. 清空输入框并将用户消息添加到列表 this.setData({ inputValue: }); const newUserMessage { role: user, content: userInput }; const updatedList [...this.data.messageList, newUserMessage]; this.setData({ messageList: updatedList, isLoading: true }); this.scrollToBottom(); try { // 2. 调用云函数发送当前完整的对话历史 const res await wx.cloud.callFunction({ name: callCogitoAI, data: { messages: updatedList, // 将包含用户新消息的完整历史发送过去 maxTokens: 300 } }); // 3. 处理云函数返回结果 if (res.result.code 200) { // 成功将AI回复添加到消息列表 const aiMessage { role: assistant, content: res.result.data.reply }; this.setData({ messageList: [...updatedList, aiMessage], isLoading: false }); } else { // 失败显示错误信息 throw new Error(res.result.msg || AI服务异常); } } catch (error) { console.error(发送消息失败:, error); // 在界面上显示一个错误提示 const errorMessage { role: assistant, content: 抱歉我暂时无法回答。(${error.message}) }; this.setData({ messageList: [...updatedList, errorMessage], isLoading: false }); } finally { this.scrollToBottom(); } }, scrollToBottom() { // 滚动到最新消息setTimeout确保在渲染完成后滚动 setTimeout(() { const lastIndex this.data.messageList.length; this.setData({ scrollToView: msg-${lastIndex} }); }, 100); }, onLoad() { // 页面加载时可以初始化一条欢迎语 const welcomeMsg { role: assistant, content: 你好我是你的AI助手有什么可以帮您 }; this.setData({ messageList: [welcomeMsg] }); } });到这一步一个具备基础对话功能的小程序就完成了。你可以运行一下试试和AI聊天。它会记住你之前说的话给出相关的回复。4. 功能增强与体验优化基础功能跑通后我们可以再打磨一下让这个聊天机器人更好用、更健壮。4.1 添加流式输出效果上面我们是一次性等待AI生成完整回复再显示。更优的体验是让AI一个字一个字地“吐”出来就像真人打字一样。这需要你的模型API支持流式输出stream: true然后云函数和小程序前端配合处理数据流。思路是云函数不再一次性返回而是建立一个长连接将模型生成的数据块实时转发给小程序。小程序端则使用wx.connectSocket或云函数的实时数据推送能力来接收这些数据块并逐步拼接到界面上。这会让交互感觉更即时、更生动。4.2 实现对话历史管理聊天记录越来越多全存在小程序的data里不是长久之计。我们可以用微信小程序的本地存储wx.setStorageSync来保存最近的几十条对话这样用户下次打开小程序还能看到。对于更长期或跨设备的记录可以考虑将对话历史上传到云数据库。// 保存对话历史到本地 saveChatHistory() { try { wx.setStorageSync(chatHistory, this.data.messageList); } catch (e) { console.error(保存聊天记录失败:, e); } } // 页面加载时读取历史 onLoad() { try { const history wx.getStorageSync(chatHistory) || []; if (history.length 0) { this.setData({ messageList: history }); } else { // 没有历史则显示欢迎语 const welcomeMsg { role: assistant, content: 你好我是你的AI助手有什么可以帮您 }; this.setData({ messageList: [welcomeMsg] }); } } catch (e) { console.error(读取聊天记录失败:, e); } }4.3 优化错误处理与用户体验网络请求总有失败的可能。除了在云函数里捕获错误前端也要有友好的提示。我们可以使用微信的wx.showToast或wx.showModal来告知用户。// 在sendMessage的catch块中增加用户提示 catch (error) { console.error(发送消息失败:, error); wx.showToast({ title: 网络似乎不太稳定请稍后重试, icon: none, duration: 2000 }); // ... 其余错误处理逻辑 }另外在AI思考时isLoading为true我们禁用了发送按钮并显示了“...”的动画这已经是一种反馈。你还可以考虑在输入框上方显示一个“AI正在思考”的提示条。5. 总结整个集成过程走下来感觉最关键的环节其实就两步一是通过云函数安全地调用外部AI模型API二是在小程序前端维护好对话上下文并呈现出来。Cogito-V1-Preview-Llama-3B模型本身对上下文的理解能力让多轮对话变得非常顺畅这是提升用户体验的核心。实际开发中可能会遇到模型响应速度、网络稳定性等问题。对于响应慢可以在前端设置更明显的加载状态甚至考虑先返回一个“正在思考”的占位回复。网络问题则要靠良好的错误处理和重试机制来兜底。这个功能一旦跑起来能应用的场景就很多了。不只是智能客服还可以做成知识问答助手、创意写作伙伴、语言学习陪练等等。你可以根据自己小程序的定位为这个AI助手设计不同的系统提示词让它扮演不同的角色。代码框架是通用的剩下的就是发挥你的想象力了。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。
Cogito-V1-Preview-Llama-3B 微信小程序开发:集成AI对话功能实战
发布时间:2026/6/23 20:38:32
Cogito-V1-Preview-Llama-3B 微信小程序开发集成AI对话功能实战最近在做一个宠物社区的小程序用户总在后台问一些关于养宠的常见问题比如“狗狗拉肚子怎么办”、“猫咪吃什么猫粮好”。人工回复效率低还经常半夜被消息吵醒。我就琢磨着能不能给小程序加个智能客服让它来回答这些基础问题。正好看到了Cogito-V1-Preview-Llama-3B这个模型它体积不大但对话能力据说不错特别适合集成到移动端应用里。最关键的是它支持上下文记忆这意味着用户可以和它进行多轮对话体验会更自然不像那些“一问一答”的机器人那么呆板。于是我花了几天时间把Cogito模型成功接入了我的微信小程序。现在这个“AI宠物顾问”已经能流畅地回答用户的大部分基础咨询解放了我不少时间。整个过程比想象中要简单核心就是通过云函数调用模型API再在小程序前端做好交互。如果你也想给自己的小程序增加点“智能”不妨跟着我的步骤试试看。1. 项目准备与环境搭建在开始敲代码之前我们需要把“舞台”搭好。这里主要涉及两件事一是创建并配置好微信小程序项目二是准备好能够调用Cogito模型的后端服务。对于小程序开发者来说云函数是个省心省力的选择。1.1 创建微信小程序项目打开微信开发者工具点击“新建项目”。项目名称可以随意比如“SmartChatMiniProgram”。AppID如果你有就填上没有的话选择“测试号”也能进行开发只是部分功能会受限。项目创建好后我们重点关注两个地方一个是项目根目录下的project.config.json它记录了项目配置另一个是app.json这是小程序的全局配置文件。为了让小程序能使用网络请求和云开发能力我们需要在app.json里声明一下。// app.json { pages: [ pages/index/index ], window: { backgroundTextStyle: light, navigationBarBackgroundColor: #fff, navigationBarTitleText: AI智能助手, navigationBarTextStyle: black }, permission: { scope.userLocation: { desc: 你的位置信息将用于展示天气等上下文信息 } }, // 确保网络请求相关配置正确 requiredBackgroundModes: [audio], networkTimeout: { request: 10000, connectSocket: 10000, uploadFile: 10000, downloadFile: 10000 } }1.2 启用并初始化云开发我们计划用云函数来调用AI模型API这样安全又方便。在开发者工具顶部菜单栏找到“云开发”按钮并点击开通云开发环境。开通后你会得到一个环境ID比如env-xxx。接下来要在小程序中初始化云开发。在app.js的onLaunch生命周期函数里添加初始化代码。// app.js App({ onLaunch: function () { // 初始化云开发 if (!wx.cloud) { console.error(请使用 2.2.3 或以上的基础库以使用云能力); } else { wx.cloud.init({ // 替换成你的云开发环境ID env: your-env-id, traceUser: true, // 记录用户访问 }); } } });初始化完成后在开发者工具的“云开发”控制台里我们点击“云函数”然后新建一个云函数名字就叫callCogitoAI。这个函数将作为我们小程序和Cogito模型之间的桥梁。2. 构建后端桥梁云函数调用AI模型云函数相当于我们部署在微信云上的一个小型服务器端程序。它的任务是接收小程序发来的用户对话内容去调用部署好的Cogito模型API拿到AI的回复后再传回给小程序。2.1 编写云函数核心逻辑在刚创建的callCogitoAI云函数目录下找到index.js文件。我们需要在这里编写主要的逻辑。假设你的Cogito模型已经部署在某个服务器上并提供了一个HTTP API接口例如https://your-model-server.com/v1/chat/completions。// cloudfunctions/callCogitoAI/index.js const cloud require(wx-server-sdk); cloud.init(); // 引入axios用于发送HTTP请求需要在云函数目录下安装npm install axios const axios require(axios); exports.main async (event, context) { try { // 1. 接收从小程序前端传来的数据 const { messages, maxTokens 500 } event; // messages 应该是一个数组格式类似 // [{role: user, content: 你好}, {role: assistant, content: 你好有什么可以帮您}] if (!messages || messages.length 0) { return { code: 400, msg: 消息内容不能为空 }; } // 2. 构建请求体调用Cogito模型API // 注意这里需要替换成你实际部署的模型API地址和可能的API Key const apiEndpoint https://your-model-server.com/v1/chat/completions; const requestData { model: cogito-v1-preview-llama-3b, // 模型名称根据实际调整 messages: messages, // 包含历史上下文的对话列表 max_tokens: maxTokens, // 生成回复的最大长度 temperature: 0.7, // 控制回复的随机性0.0-1.0值越高越有创意 stream: false, // 我们先用非流式简单些 }; const response await axios.post(apiEndpoint, requestData, { headers: { Content-Type: application/json, // 如果有API Key在这里添加 // Authorization: Bearer YOUR_API_KEY }, timeout: 15000, // 设置超时时间避免长时间等待 }); // 3. 处理模型返回的数据 const aiReply response.data.choices[0]?.message?.content; if (!aiReply) { throw new Error(模型返回数据格式异常); } // 4. 将AI回复返回给小程序前端 return { code: 200, data: { reply: aiReply, // 你也可以把完整的对话上下文返回方便前端维护 fullMessage: [...messages, { role: assistant, content: aiReply }] } }; } catch (error) { console.error(云函数调用AI模型失败:, error); // 返回错误信息前端可以展示给用户 return { code: 500, msg: 请求AI助手时出错: ${error.message || 网络或服务异常}, data: null }; } };写完代码后记得在callCogitoAI目录下打开终端运行npm install axios来安装依赖。然后右键点击云函数选择“上传并部署云端安装依赖”。2.2 处理上下文记忆Cogito模型支持上下文这是实现连贯对话的关键。上下文其实就是把之前你和AI的对话历史每次提问时都一起发给模型。在我们的云函数里messages参数就承载了这个历史。小程序前端需要维护一个对话列表。每次用户发送新消息就把这条user消息追加到列表末尾然后连同整个列表发给云函数。云函数处理完后返回的fullMessage里包含了AI的新回复前端再把这个列表更新用于下一次对话。这样就形成了一个滚动的记忆窗口。3. 设计前端聊天界面与交互后端通了接下来就是让用户能看得见、用得爽。我们需要一个小程序页面来展示聊天界面。3.1 构建基础聊天页面在pages/index目录下我们主要修改三个文件index.wxml结构、index.wxss样式、index.js逻辑。首先是结构一个典型的聊天界面包含消息列表、输入框和发送按钮。!-- pages/index/index.wxml -- view classcontainer !-- 聊天消息区域 -- scroll-view classchat-list scroll-y scroll-into-view{{scrollToView}} scroll-with-animation block wx:for{{messageList}} wx:keyindex !-- 用户消息 -- view wx:if{{item.role user}} classmessage-row user-row view classmessage-bubble user-bubble{{item.content}}/view /view !-- AI消息 -- view wx:if{{item.role assistant}} classmessage-row ai-row view classavatarAI/view view classmessage-bubble ai-bubble{{item.content}}/view /view /block !-- 加载指示器 -- view wx:if{{isLoading}} classmessage-row ai-row view classavatarAI/view view classmessage-bubble ai-bubble typing-indicator text./texttext./texttext./text /view /view /scroll-view !-- 输入区域 -- view classinput-area input classinput-box value{{inputValue}} bindinputonInput placeholder请输入您的问题... confirm-typesend bindconfirmsendMessage focus{{autoFocus}} / button classsend-btn bindtapsendMessage disabled{{isLoading}}发送/button /view /view接着是样式让界面看起来舒服些。/* pages/index/index.wxss */ .container { height: 100vh; display: flex; flex-direction: column; background-color: #f5f5f5; } .chat-list { flex: 1; padding: 20rpx; box-sizing: border-box; overflow: auto; } .message-row { display: flex; margin-bottom: 30rpx; } .user-row { justify-content: flex-end; } .ai-row { justify-content: flex-start; align-items: flex-start; } .avatar { width: 80rpx; height: 80rpx; border-radius: 50%; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; display: flex; align-items: center; justify-content: center; font-size: 28rpx; font-weight: bold; margin-right: 20rpx; flex-shrink: 0; } .message-bubble { max-width: 70%; padding: 20rpx 30rpx; border-radius: 12rpx; font-size: 32rpx; line-height: 1.5; word-wrap: break-word; } .user-bubble { background-color: #95ec69; color: #000; border-bottom-right-radius: 4rpx; } .ai-bubble { background-color: #fff; color: #333; border-bottom-left-radius: 4rpx; box-shadow: 0 2rpx 12rpx rgba(0,0,0,0.1); } .typing-indicator { display: flex; } .typing-indicator text { animation: blink 1.4s infinite both; margin-right: 4rpx; } .typing-indicator text:nth-child(2) { animation-delay: 0.2s; } .typing-indicator text:nth-child(3) { animation-delay: 0.4s; } keyframes blink { 0%, 100% { opacity: 0.2; } 50% { opacity: 1; } } .input-area { display: flex; padding: 20rpx; background-color: #fff; border-top: 1rpx solid #eee; align-items: center; } .input-box { flex: 1; border: 1rpx solid #ddd; border-radius: 40rpx; padding: 20rpx 30rpx; font-size: 32rpx; margin-right: 20rpx; background-color: #f9f9f9; } .send-btn { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border-radius: 40rpx; padding: 0 40rpx; height: 80rpx; line-height: 80rpx; font-size: 32rpx; } .send-btn[disabled] { opacity: 0.6; }3.2 实现聊天逻辑与数据绑定最后是页面的逻辑部分负责处理用户输入、调用云函数、更新界面。// pages/index/index.js Page({ data: { inputValue: , // 输入框内容 messageList: [], // 所有消息列表用于维护上下文 isLoading: false, // 是否正在加载AI回复 scrollToView: , // 用于控制滚动到底部 autoFocus: true // 自动聚焦输入框 }, onInput(e) { // 监听输入框变化 this.setData({ inputValue: e.detail.value }); }, async sendMessage() { const userInput this.data.inputValue.trim(); if (!userInput || this.data.isLoading) return; // 1. 清空输入框并将用户消息添加到列表 this.setData({ inputValue: }); const newUserMessage { role: user, content: userInput }; const updatedList [...this.data.messageList, newUserMessage]; this.setData({ messageList: updatedList, isLoading: true }); this.scrollToBottom(); try { // 2. 调用云函数发送当前完整的对话历史 const res await wx.cloud.callFunction({ name: callCogitoAI, data: { messages: updatedList, // 将包含用户新消息的完整历史发送过去 maxTokens: 300 } }); // 3. 处理云函数返回结果 if (res.result.code 200) { // 成功将AI回复添加到消息列表 const aiMessage { role: assistant, content: res.result.data.reply }; this.setData({ messageList: [...updatedList, aiMessage], isLoading: false }); } else { // 失败显示错误信息 throw new Error(res.result.msg || AI服务异常); } } catch (error) { console.error(发送消息失败:, error); // 在界面上显示一个错误提示 const errorMessage { role: assistant, content: 抱歉我暂时无法回答。(${error.message}) }; this.setData({ messageList: [...updatedList, errorMessage], isLoading: false }); } finally { this.scrollToBottom(); } }, scrollToBottom() { // 滚动到最新消息setTimeout确保在渲染完成后滚动 setTimeout(() { const lastIndex this.data.messageList.length; this.setData({ scrollToView: msg-${lastIndex} }); }, 100); }, onLoad() { // 页面加载时可以初始化一条欢迎语 const welcomeMsg { role: assistant, content: 你好我是你的AI助手有什么可以帮您 }; this.setData({ messageList: [welcomeMsg] }); } });到这一步一个具备基础对话功能的小程序就完成了。你可以运行一下试试和AI聊天。它会记住你之前说的话给出相关的回复。4. 功能增强与体验优化基础功能跑通后我们可以再打磨一下让这个聊天机器人更好用、更健壮。4.1 添加流式输出效果上面我们是一次性等待AI生成完整回复再显示。更优的体验是让AI一个字一个字地“吐”出来就像真人打字一样。这需要你的模型API支持流式输出stream: true然后云函数和小程序前端配合处理数据流。思路是云函数不再一次性返回而是建立一个长连接将模型生成的数据块实时转发给小程序。小程序端则使用wx.connectSocket或云函数的实时数据推送能力来接收这些数据块并逐步拼接到界面上。这会让交互感觉更即时、更生动。4.2 实现对话历史管理聊天记录越来越多全存在小程序的data里不是长久之计。我们可以用微信小程序的本地存储wx.setStorageSync来保存最近的几十条对话这样用户下次打开小程序还能看到。对于更长期或跨设备的记录可以考虑将对话历史上传到云数据库。// 保存对话历史到本地 saveChatHistory() { try { wx.setStorageSync(chatHistory, this.data.messageList); } catch (e) { console.error(保存聊天记录失败:, e); } } // 页面加载时读取历史 onLoad() { try { const history wx.getStorageSync(chatHistory) || []; if (history.length 0) { this.setData({ messageList: history }); } else { // 没有历史则显示欢迎语 const welcomeMsg { role: assistant, content: 你好我是你的AI助手有什么可以帮您 }; this.setData({ messageList: [welcomeMsg] }); } } catch (e) { console.error(读取聊天记录失败:, e); } }4.3 优化错误处理与用户体验网络请求总有失败的可能。除了在云函数里捕获错误前端也要有友好的提示。我们可以使用微信的wx.showToast或wx.showModal来告知用户。// 在sendMessage的catch块中增加用户提示 catch (error) { console.error(发送消息失败:, error); wx.showToast({ title: 网络似乎不太稳定请稍后重试, icon: none, duration: 2000 }); // ... 其余错误处理逻辑 }另外在AI思考时isLoading为true我们禁用了发送按钮并显示了“...”的动画这已经是一种反馈。你还可以考虑在输入框上方显示一个“AI正在思考”的提示条。5. 总结整个集成过程走下来感觉最关键的环节其实就两步一是通过云函数安全地调用外部AI模型API二是在小程序前端维护好对话上下文并呈现出来。Cogito-V1-Preview-Llama-3B模型本身对上下文的理解能力让多轮对话变得非常顺畅这是提升用户体验的核心。实际开发中可能会遇到模型响应速度、网络稳定性等问题。对于响应慢可以在前端设置更明显的加载状态甚至考虑先返回一个“正在思考”的占位回复。网络问题则要靠良好的错误处理和重试机制来兜底。这个功能一旦跑起来能应用的场景就很多了。不只是智能客服还可以做成知识问答助手、创意写作伙伴、语言学习陪练等等。你可以根据自己小程序的定位为这个AI助手设计不同的系统提示词让它扮演不同的角色。代码框架是通用的剩下的就是发挥你的想象力了。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。