本篇记录了我们在小程序端实现“AI购物助手”模块的完整过程,从最初的设计动机到最终上线,涵盖了前后端的技术方案、语言模型调用逻辑以及用户体验优化等多个维度。该模块是我们多模态推荐系统项目中关键的交互创新尝试。


一、设计动机:如何让用户“聊着聊着就下单”?

传统的电商系统依赖关键词搜索与分类导航,用户若不清楚商品名称,往往需要多次尝试关键词、跳转页面,才能找到目标产品。这种被动检索方式效率低、体验差,特别对移动端用户而言尤为不便。

我们的思考是:能否提供一个“会对话”的智能助手,让用户像聊天一样自然表达购物需求,系统便能理解其意图并推荐合适商品?

这正是我们开发“小程序AI购物助手”模块的出发点。我们希望它具备如下能力:

  • 能理解用户自然语言中的模糊描述(如“我想找一款适合夏天的洗发水”);

  • 能从庞大的商品库中精确筛选;

  • 即使找不到完全匹配的商品,也能做出合理解释并推荐相似产品;

  • 全程以类聊天界面进行交互,提升“温度感”与用户粘性。


二、技术方案总览

AI购物助手背后的技术逻辑是一个典型的“语义抽取 + 候选召回 + 精排推荐”三阶段流程:

  1. 用户发出自然语言请求

  2. 前端将请求发送至后端 /chat/chat 接口

  3. Java后端调用Python服务,利用 LLM 解析用户意图(类别、关键词、价格范围)

  4. 根据解析结果进行初步商品筛选

  5. 再次交由 LLM 对候选商品进行精排与推荐理由生成

  6. 后端返回推荐商品与客服式回复文本

  7. 小程序前端按聊天形式渲染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 指令优化:偏好用户兴趣、用户意图契合度。


七、未来优化方向

  1. 支持用户上下文记忆:如连续对话中“还有没有别的?”可保留前一意图上下文;

  2. 模型流式输出:提升响应速度与用户等待体验;

  3. 引入用户画像参与筛选:如年龄段、性别、消费层级等;

  4. 增强商品标签体系:让多模态标签参与召回/筛选(如图像特征描述);

  5. 多轮对话Clarification机制:无法判断用户意图时进行追问。


八、总结

AI购物助手模块的实现,不仅仅是技术集成的过程,更是一次围绕“用户需求理解”的系统思考与工程实践。通过大模型能力的注入,我们得以用“聊天”的方式重构电商交互流程,让推荐变得更温柔、更人性、更精准。

这一探索,为未来基于LLM的电商智能体(Agent)提供了一个实践样本,也让我们对个性化推荐系统有了更进一步的理解。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐