当前位置: 首页 > article >正文

通义千问1.5-1.8B-Chat-GPTQ-Int4项目实战:微信小程序智能客服后端开发

通义千问1.5-1.8B-Chat-GPTQ-Int4项目实战微信小程序智能客服后端开发最近在做一个微信小程序项目客户想在里面加个智能客服能自动回答一些常见问题比如产品咨询、订单状态查询这些。一开始想用现成的云服务但考虑到数据隐私和长期成本还是决定自己搭一个。正好手头有台带GPU的服务器就琢磨着把通义千问这个轻量级模型用起来。通义千问1.5-1.8B-Chat这个版本经过GPTQ-Int4量化后模型体积小推理速度也快对硬件要求不高特别适合部署成API服务。今天我就把整个从模型服务封装到微信小程序集成的过程以及中间遇到的一些坑和解决方案跟大家详细聊聊。如果你也想在小程序里加个AI客服或者想了解怎么把大模型变成可调用的后端服务这篇应该能给你一些参考。1. 项目整体思路与准备工作做这个事核心目标就一个让微信小程序能像调用普通接口一样和部署在自家服务器上的通义千问模型对话。听起来简单但拆开来看得搞定好几件事。首先模型得能跑起来并且提供一个标准的HTTP接口。其次微信小程序那边要能安全、稳定地调用这个接口。最后对话不能是“一问一答”就忘得有点记忆力能联系上下文这才像个客服。我用的硬件是一台Ubuntu 20.04的服务器显卡是RTX 306012GB显存这个配置跑1.8B的Int4模型绰绰有余。软件环境方面Python 3.8以上装好CUDA和对应的PyTorch就行。模型我用的是通义千问1.5-1.8B-Chat的GPTQ-Int4量化版。选择它一是因为体积小部署方便二是因为Int4量化在几乎不损失精度的情况下大幅提升了推理速度并降低了显存占用这对响应速度要求高的客服场景很关键。2. 模型服务的封装与启动模型下载下来后不能直接裸奔着用。我们需要把它包装成一个Web服务这里我用的是FastAPI因为它轻量、异步支持好写起来也快。首先安装必要的库pip install fastapi uvicorn transformers torch accelerate接下来是核心的服务端代码。我创建了一个app.py文件from fastapi import FastAPI, HTTPException from pydantic import BaseModel from transformers import AutoTokenizer, AutoModelForCausalLM, TextIteratorStreamer from threading import Thread import uvicorn import torch app FastAPI(titleQwen-Chat-API) # 定义请求和响应的数据格式 class ChatRequest(BaseModel): message: str session_id: str default # 用于区分不同对话会话 max_new_tokens: int 512 temperature: float 0.7 class ChatResponse(BaseModel): response: str session_id: str # 全局加载模型和分词器避免每次请求重复加载 print(正在加载模型和分词器...) MODEL_PATH ./Qwen-1_8B-Chat-GPTQ-Int4 # 替换为你的模型实际路径 tokenizer AutoTokenizer.from_pretrained(MODEL_PATH, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained( MODEL_PATH, device_mapauto, # 自动分配模型层到GPU/CPU torch_dtypetorch.float16, trust_remote_codeTrue ) print(模型加载完毕) # 一个简单的内存字典用于存储不同会话的对话历史生产环境请用Redis等 conversation_histories {} def build_prompt(history, new_message): 构建符合通义千问Chat格式的对话Prompt prompt for old_query, old_response in history: prompt f|im_start|user\n{old_query}|im_end|\n|im_start|assistant\n{old_response}|im_end|\n prompt f|im_start|user\n{new_message}|im_end|\n|im_start|assistant\n return prompt app.post(/chat, response_modelChatResponse) async def chat_with_model(request: ChatRequest): try: # 1. 获取或初始化当前会话的历史记录 history conversation_histories.get(request.session_id, []) # 2. 构建完整Prompt full_prompt build_prompt(history, request.message) inputs tokenizer(full_prompt, return_tensorspt).to(model.device) # 3. 生成回复 with torch.no_grad(): outputs model.generate( **inputs, max_new_tokensrequest.max_new_tokens, temperaturerequest.temperature, do_sampleTrue, pad_token_idtokenizer.eos_token_id ) # 4. 解码并提取助理的新回复 full_response tokenizer.decode(outputs[0][inputs[input_ids].shape[1]:], skip_special_tokensTrue) # 5. 更新对话历史限制历史长度避免过长 history.append((request.message, full_response)) if len(history) 5: # 只保留最近5轮对话历史 history history[-5:] conversation_histories[request.session_id] history return ChatResponse(responsefull_response, session_idrequest.session_id) except Exception as e: raise HTTPException(status_code500, detailf模型生成错误: {str(e)}) if __name__ __main__: # 启动服务host0.0.0.0允许外部访问生产环境务必放在Nginx等反向代理后 uvicorn.run(app, host0.0.0.0, port8000)这段代码干了这么几件事定义了一个标准的/chat的POST接口。用session_id来区分不同用户的对话这样每个用户的聊天记录是独立的。用conversation_histories这个字典在内存里存历史对话注意这只是demo服务器重启数据就没了后面会讲怎么优化。按照通义千问Chat模型要求的格式|im_start|和|im_end|标签来拼接对话历史让模型知道上下文。生成回复后把新的问答对存到历史里并限制只保留最近5轮防止Prompt太长。启动服务很简单python app.py服务跑起来后你可以在浏览器访问http://你的服务器IP:8000/docs看到自动生成的API文档并且可以在这里手动测试接口。3. 微信小程序端API调用设计服务端准备好了小程序那头怎么调呢直接调用wx.request当然可以但不够优雅也不好维护。我的做法是封装一个专门的聊天模块。在小程序项目的utils目录下我创建了一个aiChat.js文件// utils/aiChat.js const API_BASE_URL https://你的域名或IP:8000; // 务必使用HTTPS小程序要求。 class AIChatService { constructor(sessionId null) { // 如果没有传入sessionId则生成一个唯一ID用于标识一次完整的对话会话 this.sessionId sessionId || mini_ Date.now() _ Math.random().toString(36).substr(2, 9); this.isGenerating false; } /** * 发送消息给AI客服 * param {string} message 用户输入的消息 * param {function} onSuccess 成功回调 * param {function} onError 失败回调 */ async sendMessage(message, onSuccess, onError) { if (this.isGenerating) { wx.showToast({ title: AI正在思考中..., icon: none }); return; } this.isGenerating true; wx.showLoading({ title: AI思考中..., mask: true }); try { const response await new Promise((resolve, reject) { wx.request({ url: ${API_BASE_URL}/chat, method: POST, data: { message: message, session_id: this.sessionId, max_new_tokens: 256, // 小程序回复不宜过长 temperature: 0.8, // 稍高的温度让回复更活泼 }, header: { content-type: application/json, }, success: (res) { if (res.statusCode 200) { resolve(res.data); } else { reject(new Error(请求失败: ${res.statusCode})); } }, fail: (err) { reject(err); }, }); }); wx.hideLoading(); this.isGenerating false; if (onSuccess typeof onSuccess function) { onSuccess(response.response); // 返回AI的回复文本 } } catch (error) { console.error(AI聊天请求错误:, error); wx.hideLoading(); wx.showToast({ title: 客服暂时走神了请稍后再试, icon: none }); this.isGenerating false; if (onError typeof onError function) { onError(error); } } } // 可选重置当前会话清空历史 resetSession(newSessionId null) { this.sessionId newSessionId || mini_ Date.now() _ Math.random().toString(36).substr(2, 9); } } module.exports AIChatService;然后在你的小程序页面比如chatPage.js里就可以这样用了// pages/chat/chatPage.js const AIChatService require(../../utils/aiChat.js); Page({ data: { messageList: [], // 消息列表 {type: user/ai, content: ...} inputValue: , aiService: null, }, onLoad() { // 初始化AI聊天服务可以传入一个固定的sessionId实现“记住我”功能 const sessionId wx.getStorageSync(ai_chat_session_id) || null; this.setData({ aiService: new AIChatService(sessionId) }); // 保存sessionId下次进入同一会话 if (!sessionId) { wx.setStorageSync(ai_chat_session_id, this.data.aiService.sessionId); } }, onInputChange(e) { this.setData({ inputValue: e.detail.value }); }, sendMessage() { const userMsg this.data.inputValue.trim(); if (!userMsg) return; // 1. 更新UI显示用户消息 const newList this.data.messageList.concat([{ type: user, content: userMsg }]); this.setData({ messageList: newList, inputValue: }); // 2. 调用AI服务 this.data.aiService.sendMessage( userMsg, // 成功回调 (aiResponse) { const updatedList this.data.messageList.concat([{ type: ai, content: aiResponse }]); this.setData({ messageList: updatedList }); // 滚动到底部 wx.pageScrollTo({ selector: #chat-end, duration: 300 }); }, // 失败回调 (error) { console.error(发送失败, error); } ); }, })这样封装的好处很明显业务逻辑清晰调用简单还能方便地控制加载状态、错误提示以及管理对话会话。4. 关键问题对话上下文管理与性能优化刚才的Demo版用内存字典存历史问题很大。一是数据丢二是如果用户多了内存肯定撑不住。在实际项目里我换成了Redis。# 改进后的历史管理部分 (utils/redis_manager.py) import redis import json import hashlib class ConversationManager: def __init__(self, redis_urlredis://localhost:6379, max_history_len5): self.redis_client redis.from_url(redis_url, decode_responsesTrue) self.max_len max_history_len self.key_prefix chat_history: def _get_key(self, session_id): # 对session_id做简单哈希作为Redis key的一部分 return self.key_prefix hashlib.md5(session_id.encode()).hexdigest() def get_history(self, session_id): key self._get_key(session_id) history_json self.redis_client.get(key) if history_json: return json.loads(history_json) return [] def save_history(self, session_id, history): key self._get_key(session_id) # 只保存最近N轮对话 trimmed_history history[-self.max_len:] self.redis_client.setex(key, 3600 * 24, json.dumps(trimmed_history)) # 设置24小时过期 # 然后在FastAPI app中替换掉原来的字典 from utils.redis_manager import ConversationManager conv_manager ConversationManager() app.post(/chat) async def chat_with_model(request: ChatRequest): history conv_manager.get_history(request.session_id) # ... 构建prompt、生成回复 ... history.append((request.message, full_response)) conv_manager.save_history(request.session_id, history) # ...用了Redis之后对话历史能持久化保存并且可以设置过期时间管理起来方便多了。另一个问题是性能。虽然1.8B模型不算大但如果小程序用户突然暴增一个GPU实例可能处理不过来请求。我采取了两个简单的策略异步生成与超时控制使用asyncio和模型本身的流式生成或异步支持避免一个长请求阻塞其他请求。同时在代码里设置合理的超时时间。请求队列与限流在FastAPI前面加一个简单的内存队列比如用asyncio.Queue或者用更专业的celery把生成任务丢到后台队列里处理前端轮询结果。对于公开服务一定要在Nginx或API网关层做限流防止被刷。# 简单的异步处理思路伪代码 from fastapi import BackgroundTasks import asyncio task_queue asyncio.Queue() result_cache {} # 用redis更好 async def worker(): while True: session_id, message await task_queue.get() # ... 调用模型生成 ... result_cache[session_id] generated_text task_queue.task_done() app.post(/chat/async) async def async_chat(request: ChatRequest, background_tasks: BackgroundTasks): task_id request.session_id _ str(time.time()) await task_queue.put((task_id, request.message)) return {task_id: task_id, status: queued} app.get(/chat/result/{task_id}) async def get_result(task_id: str): result result_cache.get(task_id) if result: return {status: completed, response: result} else: return {status: processing}对于小程序来说短轮询每隔几秒查一次结果是可以接受的这样能有效缓解瞬时高并发对模型推理的直接冲击。5. 总结把通义千问这样的模型集成到微信小程序里做客服技术上已经非常可行了。整个过程就像搭积木先把模型用FastAPI包装成一个可靠的HTTP服务处理好对话上下文然后在小程序端用清晰的方式封装调用逻辑最后根据实际访问量考虑用Redis存历史、用队列缓解并发压力。我按照这个思路做的客服模块已经稳定运行了一段时间。对于常见问题比如“你们的服务怎么收费”、“我的订单到哪了”模型都能给出准确、流畅的回答用户体验还不错。当然它毕竟不是万能的对于特别复杂或者需要实时查数据库的问题我们设定了规则让AI引导用户转接人工客服。这个方案的好处是自主可控数据都在自己服务器上心里踏实。成本也主要就是一台带GPU的云服务器如果访问量不大甚至中等配置的显卡都够用。如果你也想试试建议先从简单的内存版本开始跑通整个流程然后再逐步引入Redis、队列这些组件这样迭代起来会更顺畅。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

相关文章:

通义千问1.5-1.8B-Chat-GPTQ-Int4项目实战:微信小程序智能客服后端开发

通义千问1.5-1.8B-Chat-GPTQ-Int4项目实战:微信小程序智能客服后端开发 最近在做一个微信小程序项目,客户想在里面加个智能客服,能自动回答一些常见问题,比如产品咨询、订单状态查询这些。一开始想用现成的云服务,但考…...

AD9854 DDS芯片SPI驱动开发与工程实践

1. AD9854直接数字频率合成器底层驱动技术解析AD9854是Analog Devices公司推出的高性能、高集成度直接数字频率合成器(Direct Digital Synthesizer, DDS),采用32位相位累加器与14位正弦查找表,支持最高120 MHz系统时钟输入&#x…...

终极指南:使用Xenia Canary模拟器畅玩Xbox 360游戏

终极指南:使用Xenia Canary模拟器畅玩Xbox 360游戏 【免费下载链接】xenia-canary 项目地址: https://gitcode.com/gh_mirrors/xe/xenia-canary Xenia Canary是一款功能强大的开源Xbox 360模拟器,让您在现代PC上重温经典游戏。通过精密的硬件仿真…...

Inno Setup 进阶技巧:如何自定义安装界面并支持多语言(含中文)

Inno Setup 高级定制:打造品牌化多语言安装向导的完整指南 当你的软件需要面向全球市场发布时,一个专业、本地化的安装体验至关重要。Inno Setup作为Windows平台最受欢迎的免费安装程序制作工具,其强大的定制能力往往被大多数开发者低估。本文…...

技术分析:OmenSuperHub如何实现惠普OMEN游戏本轻量级硬件控制

技术分析:OmenSuperHub如何实现惠普OMEN游戏本轻量级硬件控制 【免费下载链接】OmenSuperHub 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub OmenSuperHub是一款专为惠普OMEN游戏本设计的开源硬件控制工具,通过WMI与BIOS底层交互实…...

释放多屏潜能:AlwaysOnTop如何重构你的数字工作流

释放多屏潜能:AlwaysOnTop如何重构你的数字工作流 【免费下载链接】AlwaysOnTop Make a Windows application always run on top 项目地址: https://gitcode.com/gh_mirrors/al/AlwaysOnTop 在信息洪流中,每个窗口都像是一个独立的思维岛屿&#…...

百度网盘下载加速终极指南:5分钟学会免费高速下载技巧

百度网盘下载加速终极指南:5分钟学会免费高速下载技巧 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 你是否曾经因为百度网盘的下载速度而烦恼?作为国…...

Python解析高分六号/资源三号原始数据:从CCSDS帧头解析到几何精校正的12步军工级流程(附国产卫星私有格式SDK逆向笔记)

第一章:Python卫星遥感数据解析工具概览与工程定位Python在卫星遥感数据处理领域已形成成熟生态,其核心价值在于将多源异构遥感数据(如Landsat、Sentinel、MODIS)的读取、辐射定标、几何校正、大气校正及特征提取等流程封装为可复…...

FirmAE实战安装:从网络报错到依赖修复的完整排错指南

1. 环境准备与初始安装 FirmAE作为物联网设备仿真工具链,在安全研究和漏洞复现领域越来越受欢迎。但第一次安装时,我遇到了比预想更多的麻烦。记得那天下午,我按照官方文档在Ubuntu 20.04上执行git clone时,系统提示"Failed …...

解放ASMR收藏烦恼:开源工具asmr-downloader如何高效管理音频资源

解放ASMR收藏烦恼:开源工具asmr-downloader如何高效管理音频资源 【免费下载链接】asmr-downloader A tool for download asmr media from asmr.one(Thanks for the asmr.one) 项目地址: https://gitcode.com/gh_mirrors/as/asmr-downloader 在数字时代&…...

深度剖析抖音无水印下载架构:从解析算法到跨平台实现

深度剖析抖音无水印下载架构:从解析算法到跨平台实现 【免费下载链接】douyin_downloader 抖音短视频无水印下载 win编译版本下载:https://www.lanzous.com/i9za5od 项目地址: https://gitcode.com/gh_mirrors/dou/douyin_downloader 在短视频内容…...

BetterNCM安装器:3分钟搞定网易云音乐插件管理,让音乐体验升级

BetterNCM安装器:3分钟搞定网易云音乐插件管理,让音乐体验升级 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 还在为网易云音乐插件安装繁琐而烦恼吗&#xff…...

SecureCRT自动化测试脚本实战:从零开始搭建你的第一个设备监控系统

SecureCRT自动化测试脚本实战:从零开始搭建你的第一个设备监控系统 在嵌入式开发和测试领域,设备监控是确保产品质量的关键环节。想象一下,当你需要连续72小时监测设备电池状态,手动操作不仅效率低下,还容易出错。这就…...

OneButton嵌入式单按键状态机原理与实践

1. OneButton 库概述:面向嵌入式系统的轻量级单按键状态机实现OneButton 是一个专为资源受限嵌入式系统设计的开源 C 语言库,其核心目标是在单个 GPIO 输入引脚上可靠识别并区分四种基础用户交互模式:短按(click)、双击…...

实战指南:如何用Python实现说话人分离中的Agglomerative聚类(附代码)

实战指南:用Python实现说话人分离中的层次聚类算法 在语音处理领域,说话人分离技术正变得越来越重要。想象一下这样的场景:你有一段长达数小时的会议录音,里面有五位不同的人轮流发言。如何快速将每个人的语音片段自动分离出来&am…...

保姆级攻略:Qwen3-Embedding-4B镜像部署及语义搜索实战演示

保姆级攻略:Qwen3-Embedding-4B镜像部署及语义搜索实战演示 1. 引言:为什么选择Qwen3-Embedding-4B? 在信息爆炸的时代,传统的基于关键词的搜索方式已经无法满足我们对精准信息获取的需求。想象一下,当你想查找"…...

OpenCV4.8.0安装路径自由配置:不再强制C盘,彻底解决opencv_world480d.dll找不到问题

OpenCV4.8.0自定义安装路径全攻略:从环境配置到DLL问题根治 在C计算机视觉开发领域,OpenCV作为行业标准库的地位无可撼动。但许多开发者都曾经历过这样的困扰:安装OpenCV时被迫接受默认的C盘路径,或者在自定义安装路径后遭遇恼人的…...

终极指南:如何用Zotero国标参考文献格式轻松搞定学术写作

终极指南:如何用Zotero国标参考文献格式轻松搞定学术写作 【免费下载链接】Chinese-STD-GB-T-7714-related-csl GB/T 7714相关的csl以及Zotero使用技巧及教程。 项目地址: https://gitcode.com/gh_mirrors/chi/Chinese-STD-GB-T-7714-related-csl GB/T 7714参…...

华为ENSP-AC实战:Web界面快速部署AP直连网络

1. 华为ENSP-AC与Web界面配置入门 刚接触华为ENSP-AC的朋友可能会觉得配置WLAN网络是个复杂活儿,但其实用Web界面操作就像玩积木一样简单。ENSP(Enterprise Network Simulation Platform)是华为推出的企业级网络仿真平台,而AC&…...

5分钟上手MiniMax海螺AI:用一张照片生成动态视频的保姆级教程

5分钟玩转MiniMax海螺AI:零门槛实现照片变电影级动态视频 想象一下,你手机里那张静态的日落照片突然有了流动的云彩,宠物呆萌的瞬间开始对你眨眼,或是全家福中的人物自然地微笑互动——这一切现在只需5分钟就能实现。MiniMax海螺…...

告别死记硬背:用NIOS II软核处理器和SOPC Builder快速搭建你的第一个‘片上系统’

从零构建你的第一个片上系统:NIOS II软核处理器实战指南 当你第一次拿到FPGA开发板时,是否曾好奇过这片小小的芯片如何能运行完整的处理器系统?传统的嵌入式开发往往从现成的微控制器开始,但FPGA给了我们更底层的自由——直接在可…...

互联网产品经理利器:MiniCPM-V-2_6快速生成PRD与用户画像

互联网产品经理利器:MiniCPM-V-2_6快速生成PRD与用户画像 作为一名在互联网行业摸爬滚打多年的产品人,我深知产品策划初期的痛苦。面对一个模糊的想法,要从零开始梳理需求、分析用户、撰写文档,这个过程往往耗时耗力,…...

若依SpringCloud实战:手把手教你实现Token生成与验证(附完整代码)

若依SpringCloud深度实践:构建企业级Token认证体系的完整指南 在微服务架构中,认证授权是保障系统安全的第一道防线。若依(RuoYi)SpringCloud作为国内广泛使用的企业级开发框架,其内置的Token认证机制融合了JWT与Redis的优势,既保…...

人工智能赋能中小企业高质量发展研究报告(2025年)

报告系统性梳理了中小企业人工智能规模化应用的演进态势,分析了模型创新、算力普惠、产品成熟及开源生态蓬勃发展对降低技术壁垒、提升场景适配度的关键驱动作用。关注公众号:【互联互通社区】,回复【AI940】获取全部报告内容。报告系统性梳理…...

Face Fusion人脸融合实战:影视概念预演,低成本验证创意

Face Fusion人脸融合实战:影视概念预演,低成本验证创意 1. 影视概念预演的技术痛点 在影视项目前期筹备阶段,导演和美术团队常常面临一个关键挑战:如何快速、低成本地验证角色造型设计的可行性?传统解决方案存在三大…...

Matlab 2018b下用SimMechanics搭建二连杆机械臂:从参数配置到3D可视化全流程

Matlab 2018b下SimMechanics二连杆机械臂建模实战指南 在工业机器人研发领域,机械臂的动态仿真一直是验证控制算法和运动规划的关键环节。Matlab的SimMechanics工具箱为工程师提供了一套完整的多体系统建模解决方案,特别适合刚接触物理建模的开发者快速搭…...

终极空洞骑士模组管理器:Lumafly如何让模组管理变得简单高效

终极空洞骑士模组管理器:Lumafly如何让模组管理变得简单高效 【免费下载链接】Lumafly A cross platform mod manager for Hollow Knight written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/lu/Lumafly 你是否曾经花费数小时在空洞骑士的模组…...

Matlab机器人工具箱,欧拉角RPY角位姿变换。 机器人技术基础,位姿变换演示小基于Matl...

Matlab机器人工具箱,欧拉角RPY角位姿变换。 机器人技术基础,位姿变换演示小基于Matlab开发,可编辑。 p代码版本不可编辑与查看代码,只可使用。 源代码版本可以任意编辑 两个版本的功能完全相同。 带操作使用说明。涉及机器人学相关…...

Parabolic视频下载神器:200+网站支持的终极下载解决方案

Parabolic视频下载神器:200网站支持的终极下载解决方案 【免费下载链接】Parabolic Download web video and audio 项目地址: https://gitcode.com/GitHub_Trending/pa/Parabolic 还在为找不到好用的视频下载工具而烦恼吗?尝试了十几个软件却总是…...

QMCDecode:打破音乐平台壁垒,让你的数字音乐资产真正自由流动

QMCDecode:打破音乐平台壁垒,让你的数字音乐资产真正自由流动 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录…...