ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SpringBoot3 接入大模型:微信智能客服文本语音图片处理实战

SpringBoot3 接入大模型:微信智能客服文本语音图片处理实战 简介本资源是一套基于SpringBoot3与JDK17构建的微信聊天机器人完整项目源码面向希望将大模型能力落地到实际业务中的Java开发者与AI应用爱好者。项目已接入OpenAI、Azure OpenAI、ollama、智普AI等多种大模型服务能够处理文本、语音和图片消息并支持基于自有知识库定制企业智能客服适合用于学习大模型集成、微信生态对接与智能问答系统搭建。压缩包共32个文件以21个Java源码为核心辅以yml配置、xml依赖、properties参数、md说明文档及少量png示意图整体约2.46MB结构紧凑便于快速导入IDE运行调试。目前已有268人学习下载。通过阅读源码可掌握多模型适配、消息路由、语音图片处理与知识库检索等关键实现思路为二次开发与企业级智能客服落地提供可复用的工程参考。1. 从一条微信消息到一次大模型调用这套 SpringBoot3 智能客服到底在做什么用户发来一句「我上周买的鞋开胶了能换吗」三秒后公众号弹出回复还顺手把订单号、售后政策、换货入口一起给了出来。这不是某个 SaaS 后台的演示而是一套跑在自己服务器上的 SpringBoot3 应用微信侧只负责收发消息真正的理解、检索、生成全部交给大模型。标题里说的「能处理文本、语音和图片」落到工程上其实是三条不同的入口——文本直接进对话链语音先走一遍识别再进对话链图片则要先判断是商品图、截图还是随手拍再决定走视觉理解还是走 OCR。智能客服这个词听着大但拆开就是「意图识别 知识召回 话术生成 人工兜底」四件事大模型把前三件做得比以前顺很多第四件仍然得靠人。这套方案适合谁适合已经有微信侧流量、想用最低成本把重复咨询压下去的小团队也适合想拿一个真实项目练手 SpringBoot3 接大模型的开发者。它不解决「零代码上线」但能把接入这件事从两周压到两三天。2. 选型先定死SpringBoot3 接大模型哪些组件不能省2.1 为什么是 SpringBoot3 而不是 SpringBoot2SpringBoot3 最实际的变化是基线抬到了 Java 17虚拟线程Virtual Threads在 3.2 之后可以正式用。聊天机器人是典型的 IO 密集型场景一条用户消息进来要等大模型返回、要等向量库检索、要等微信接口回执线程大部分时间在阻塞。用虚拟线程处理这些等待单机并发能拉高一个量级而代码几乎不用改只要把处理消息的线程池换成虚拟线程执行器。另一个原因是 SpringBoot3 对 Jakarta EE 9 的命名空间做了统一新项目没必要再背javax.*的历史包袱。如果你的团队还在 Java 8硬上 SpringBoot3 会连带升级一堆依赖这时候要权衡是升 JDK 还是先用 SpringBoot2.7 顶一阵。我的建议是新项目直接上 3.x老项目别为了这个机器人单独升。2.2 大模型接入层别把 OpenAI SDK 写死在业务里热搜里「openai 的 api key 获取方法」「openai api key」出现频率很高说明很多人卡在第一步。但工程上更该关心的是不要把某一家 SDK 直接写进 Service。常见做法是抽一层ChatModelClient接口下面挂不同实现配置里用provider字段切换。这样以后换模型、加备用通道、做灰度都不用动业务代码。public interface ChatModelClient { // 统一入参系统提示词 历史消息 当前用户输入 ChatResponse chat(String systemPrompt, ListMessage history, String userInput); // 多模态入口图片/语音转成的文本或 base64 走这里 ChatResponse chatWithMedia(String systemPrompt, ListMessage history, MediaPayload media); }逻辑说明systemPrompt承载客服人设和边界比如「不确定就转人工」history用来维持多轮上下文media是图片或语音的封装。参数上要注意history不能无限增长一般保留最近 6 到 10 轮再往前做摘要压缩否则 token 成本和延迟都会失控。2.3 微信侧接入消息去重和 5 秒超时是两条硬约束微信公众平台对被动回复有 5 秒超时限制超时用户会收到「该公众号暂时无法提供服务」。而大模型一次生成动辄 2 到 8 秒直接同步等结果很容易翻车。常见做法是收到消息先落库、立即返回「正在为您查询」然后用客服消息接口异步推送最终结果。同时微信会重试推送必须用MsgId做幂等去重否则用户会收到两条一样的回复。// 幂等去重以微信 MsgId 为唯一键处理前先查 if (messageRepo.existsByMsgId(msgId)) { return success; // 已处理过直接应答避免重复调用大模型 } messageRepo.save(new InboundMessage(msgId, openId, content, Instant.now()));参数说明MsgId是微信侧消息唯一标识openId是用户标识。去重表建议加 TTL 或定期清理不然半年后这张表会大到影响查询。异步推送要用客服消息接口注意它要求用户 48 小时内有过互动超过窗口就发不出去这是很多人上线后才发现的血泪经验。2.4 语音和图片先转文本还是直接上多模态语音这块常见做法是先用识别服务把语音转成文本再进对话链因为客服场景里语音内容大多是口语化咨询转文本后走文本链路成本更低、可控性更强。图片则分两类如果是商品图或截图走视觉理解模型直接描述如果是带文字的截图比如订单页OCR 往往比视觉模型更准更便宜。选型时别一上来就全用多模态大模型先按「语音转文本、图片分 OCR 和视觉」做路由能省下不少调用成本。3. 把对话链跑通意图识别、知识召回、话术生成的三段式实现3.1 意图识别先用规则兜底再用大模型兜语义纯靠大模型做意图分类遇到「你们这个能退吗」这种模糊表达还行但遇到「订单号 12345 帮我查下物流」这种带明确实体的规则反而更快更准。我一般会做两级第一级用正则和关键词匹配高频意图查物流、查订单、退换货、转人工命中就直接走对应处理器没命中再交给大模型做意图分类返回一个枚举值。public Intent recognize(String text) { // 第一级规则命中零成本零延迟 if (text.matches(.*(物流|快递|到哪了).*)) return Intent.QUERY_LOGISTICS; if (text.matches(.*(退货|换货|退款).*)) return Intent.AFTER_SALE; if (text.contains(人工) || text.contains(客服)) return Intent.HUMAN; // 第二级大模型分类提示词里限定只能返回枚举名 String prompt 判断用户意图只返回以下之一QUERY_LOGISTICS, AFTER_SALE, PRODUCT_CONSULT, HUMAN, OTHER。用户说 text; String result chatModelClient.chat(prompt, List.of(), text).content().trim(); return Intent.valueOf(result); }逻辑说明规则层负责高频、确定性强的意图大模型层负责长尾。参数上大模型返回要做白名单校验防止它返回枚举外的值导致valueOf抛异常。这一步的提示词要短、要限定输出格式别让它自由发挥。3.2 知识召回向量检索不是万能关键词召回要留着智能客服的核心是「答得准」而准的前提是召回对。很多团队一上来就上向量库结果发现「运费多少」这种问题向量检索反而不如关键词匹配稳。常见做法是混合召回向量检索负责语义相近的表述BM25 或关键词负责精确匹配两路结果合并去重后再排序。public ListKnowledgeChunk recall(String query, int topK) { // 向量召回语义相近 ListKnowledgeChunk vectorHits vectorStore.search(embeddingClient.embed(query), topK); // 关键词召回精确命中 ListKnowledgeChunk keywordHits keywordIndex.search(query, topK); // 合并去重按分数排序 return mergeAndRank(vectorHits, keywordHits, topK); }参数说明topK一般设 3 到 5太多会稀释提示词、增加 token太少可能漏掉关键信息。合并时给两路结果加权向量分和关键词分不在一个量纲要先归一化。知识库要定期更新商品下架、政策变更后如果不同步模型会一本正经地答错这是最容易被投诉的坑。3.3 话术生成提示词里必须写死「不知道就说不知道」生成环节最容易出的问题是模型「编」。客服场景里编造政策、编造订单状态后果比答不上来严重得多。提示词里要明确只根据召回的知识回答知识里没有的就说「这个问题我需要帮您转人工确认」。同时把客服人设、语气、禁用词写进去。String systemPrompt 你是XX品牌的客服助手。规则 1. 只根据下方【知识】回答知识中没有的内容不要编造 2. 涉及订单、退款金额等具体数据必须引导用户提供订单号或转人工 3. 语气友好简洁不超过三句话 4. 无法回答时回复这个问题我帮您转人工确认请稍等。 【知识】%s .formatted(recalledText);逻辑说明把知识拼进系统提示词是最直接的做法知识量大时再考虑单独的消息角色。参数上temperature建议设 0.2 到 0.5客服场景不需要太发散max_tokens要限制防止模型长篇大论。生成结果落库前做一次敏感词和格式校验别直接透传给用户。3.4 多轮上下文摘要压缩比无限追加更靠谱用户问「那运费呢」模型得知道「那」指的是什么。做法是把最近几轮对话按角色拼进history但轮数一多 token 就爆。常见做法是保留最近 6 轮原文更早的对话用一次大模型调用压缩成一段摘要拼在系统提示词里。这样既保住了上下文又控制了成本。注意摘要本身也要落库别每次请求都重新压一遍。4. 避坑与排查上线后最容易翻车的 5 个地方4.1 现象用户收到重复回复。原因微信重试推送没做幂等。解决用 MsgId 建唯一索引处理前先查已处理直接返回 success。4.2 现象高峰期大量「该公众号暂时无法提供服务」。原因同步等大模型超过 5 秒。解决改成先应答再异步推送或者用客服消息接口。注意异步推送有 48 小时窗口限制。4.3 现象模型答非所问召回的知识明显不相关。原因向量模型和知识库语言不匹配或 chunk 切得太碎。解决检查 embedding 模型是否支持中文chunk 大小控制在 200 到 500 字重叠 50 字左右。4.4 现象token 成本月底暴涨。原因history 无限增长、知识全量拼进提示词。解决history 做摘要压缩知识只拼 topK给每次调用记 token 用量并设日限额告警。4.5 现象图片消息进来后链路卡死。原因图片下载和视觉模型调用没设超时。解决所有外部调用都要设连接和读取超时图片先落对象存储再异步处理别在主线程里同步下载。5. 进阶把「智能客服」做成能自我验证的系统5.1 用影子模式验证新提示词提示词一改效果是变好还是变坏光靠感觉判断不靠谱。我一般会开一个影子通道同一批用户消息同时走线上提示词和候选提示词把两边结果都落库但不都发给用户人工抽检或用一个小的评估模型打分。跑够几百条再决定是否切换。这样改提示词就不是玄学而是有数据支撑的迭代。5.2 兜底转人工的触发条件要写清楚转人工不是失败是设计的一部分。触发条件建议至少包含意图识别为 HUMAN、连续两轮模型回答「不知道」、用户情绪词命中投诉、差评、举报、涉及金额超过阈值。把这些条件做成配置别硬编码在代码里运营改起来才方便。触发条件判断方式动作用户明确要人工关键词匹配直接转连续两轮未解决会话状态计数转人工并附上下文情绪词命中词表 模型判断优先转标记紧急金额超阈值实体抽取转人工复核5.3 一个我踩过的坑别在提示词里写「尽量」「尽量准确」「尽量简洁」这种词对模型几乎没有约束力。要写就写死不超过三句话、必须包含订单号、不确定就转人工。我早期写「尽量帮用户解决问题」结果模型遇到查不到的订单也硬编一个状态出来被用户截图投诉。后来把所有模糊表述换成明确规则编造率明显下降。做这类系统提示词要像写接口契约一样写别像写作文。希望帮到你。本文还有配套的精品资源点击获取
返回列表