博客八: 小程序端-AI购物助手功能实现详解——从用户语义到精准推荐的全链路设计
AI购物助手模块的实现,不仅仅是技术集成的过程,更是一次围绕“用户需求理解”的系统思考与工程实践。通过大模型能力的注入,我们得以用“聊天”的方式重构电商交互流程,让推荐变得更温柔、更人性、更精准。传统的电商系统依赖关键词搜索与分类导航,用户若不清楚商品名称,往往需要多次尝试关键词、跳转页面,才能找到目标产品。这一探索,为未来基于LLM的电商智能体(Agent)提供了一个实践样本,也让我们对个性化推
本篇记录了我们在小程序端实现“AI购物助手”模块的完整过程,从最初的设计动机到最终上线,涵盖了前后端的技术方案、语言模型调用逻辑以及用户体验优化等多个维度。该模块是我们多模态推荐系统项目中关键的交互创新尝试。
一、设计动机:如何让用户“聊着聊着就下单”?
传统的电商系统依赖关键词搜索与分类导航,用户若不清楚商品名称,往往需要多次尝试关键词、跳转页面,才能找到目标产品。这种被动检索方式效率低、体验差,特别对移动端用户而言尤为不便。
我们的思考是:能否提供一个“会对话”的智能助手,让用户像聊天一样自然表达购物需求,系统便能理解其意图并推荐合适商品?
这正是我们开发“小程序AI购物助手”模块的出发点。我们希望它具备如下能力:
-
能理解用户自然语言中的模糊描述(如“我想找一款适合夏天的洗发水”);
-
能从庞大的商品库中精确筛选;
-
即使找不到完全匹配的商品,也能做出合理解释并推荐相似产品;
-
全程以类聊天界面进行交互,提升“温度感”与用户粘性。
二、技术方案总览
AI购物助手背后的技术逻辑是一个典型的“语义抽取 + 候选召回 + 精排推荐”三阶段流程:
-
用户发出自然语言请求
-
前端将请求发送至后端 /chat/chat 接口
-
Java后端调用Python服务,利用 LLM 解析用户意图(类别、关键词、价格范围)
-
根据解析结果进行初步商品筛选
-
再次交由 LLM 对候选商品进行精排与推荐理由生成
-
后端返回推荐商品与客服式回复文本
-
小程序前端按聊天形式渲染AI回复与商品卡片
三、小程序端实现:打造类对话式购物体验
小程序端的页面如图所示:
1. 页面结构设计
我们使用 scroll-view + v-for 渲染聊天内容,支持三种消息类型:
-
用户消息(右侧气泡)
-
AI文本消息(左侧带头像气泡)
-
AI推荐商品列表(附加商品卡片展示)
核心模板代码如下:
<scroll-view class="chat-window">
<view v-for="msg in messages">
<!-- 时间、AI文本、AI商品、用户消息分情况渲染 -->
</view>
</scroll-view>
2. 用户输入交互
底部输入栏支持按“发送”或软键盘回车键提交消息,提交后自动触发:
async sendMessage() {
if (!this.inputText.trim()) return
this.pushMessage({ from: 'user', text: this.inputText, type: 'text' })
this.pushMessage({ from: 'ai', text: '正在为您分析,请稍等...', type: 'text' })
const res = await http.request({ url: '/chat/chat', method: 'POST', data: { message: content } })
// 处理回复,区分推荐/无推荐情况渲染
}
四、Java 后端逻辑分析
后端接口 /chat/chat 是连接前端和 LLM 服务的中枢,代码如下:
@PostMapping("/chat")
public ServerResponseEntity<ChatResponseDto> chatWithAI(@RequestBody Map<String, String> request) {
String content = request.get("message");
ChatResponseDto response = chatService.processUserMessage(content);
return ServerResponseEntity.success(response);
}
而核心处理逻辑在 chatService.processUserMessage 中,分三步完成:
1. 调用 LLM 提取用户意图
UserIntentParam extractedInfo = llmApiService.extractUserIntent(content);
返回结构如下:
{
"categoryId": 97,
"minPrice": -1,
"maxPrice": -1,
"keywords": ["Hello Kitty", "Skin"]
}
2. 初步筛选商品
List<ProductDto> candidateProducts = productMapper.findProductsByLLMIntent(extractedInfo);
执行的SQL查询结合了关键词模糊匹配、类目ID、价格范围等。
3. 调用LLM做精排
将候选商品发送给大模型做最终筛选:
ChatResponseIdsDto idDto = llmApiService.filterRecommendedProducts(content, productDtos);
该接口不仅返回推荐商品ID,还生成了一段客服式文本说明:
{
"recommendedProductsIds": [321, 322],
"replyText": "了解到您对护肤方面的需求,我为您推荐以下几款护肤水,希望您喜欢~"
}
五、Python 端 DeepSeek-V3 服务设计
LLM服务部署在Python后端,暴露两个接口,使用DeepSeek-V3模型调用。
1.
/extractUserIntent
:意图结构化抽取
核心 prompt:
请分析以下用户请求,提取以下信息:
1. categoryId(从给定4类中选,无法判断则用美妆)
2. keywords(提取关键词)
3. minPrice / maxPrice(若未提及则-1)
输出 JSON,不带任何解释。
模型调用结果解析后返回结构化 JSON,用于数据库查询。
2.
/filterRecommendedProducts
:精排+生成推荐语
核心逻辑:
-
拼接候选商品文本;
-
构造 prompt 让 LLM 判断“最可能满足需求”的商品;
-
生成客服式推荐语;
-
返回商品ID列表和文本。
示例:
{
"recommendedProductsIds": [123, 124],
"replyText": "很抱歉没有Hello Kitty护肤品,但以下商品可能符合您的护肤需求~"
}
六、实现过程中的难点与优化
1. LLM输出格式不稳定
问题:有时 DeepSeek 输出的 JSON 被多余内容包裹,导致解析失败。
解决方案:
-
使用正则提取第一个 {} 包裹的内容尝试 JSON 解析;
-
若仍失败则 fallback 为兜底商品 + 通用文案。
2. 用户意图模糊
如用户仅说“我想买点便宜点的护肤品”,缺乏明确类目与关键词。
解决方案:
-
Prompt 默认 fallback 到美妆类目;
-
Keywords 抽取时引入语言模型多样表达判断能力;
-
Price 默认 -1 表示“不限”。
3. 商品列表排序逻辑
最初我们仅按匹配度返回商品,导致结果缺乏吸引力。
优化:
-
在数据库查询时加入销量、评分等排序因子;
-
模型精排环节通过 prompt 指令优化:偏好用户兴趣、用户意图契合度。
七、未来优化方向
-
支持用户上下文记忆:如连续对话中“还有没有别的?”可保留前一意图上下文;
-
模型流式输出:提升响应速度与用户等待体验;
-
引入用户画像参与筛选:如年龄段、性别、消费层级等;
-
增强商品标签体系:让多模态标签参与召回/筛选(如图像特征描述);
-
多轮对话Clarification机制:无法判断用户意图时进行追问。
八、总结
AI购物助手模块的实现,不仅仅是技术集成的过程,更是一次围绕“用户需求理解”的系统思考与工程实践。通过大模型能力的注入,我们得以用“聊天”的方式重构电商交互流程,让推荐变得更温柔、更人性、更精准。
这一探索,为未来基于LLM的电商智能体(Agent)提供了一个实践样本,也让我们对个性化推荐系统有了更进一步的理解。
更多推荐



所有评论(0)