餐饮行业AI智能搜索优化:基于微信小程序云开发的推荐算法与语义检索技术实现

2026-07-21 09:24:23 24 次浏览
小程序云开发推荐算法语义检索餐饮行业AI优化

餐饮行业正经历从"流量驱动"到"AI驱动"的深度转型。当用户在DeepSeek或豆包中搜索"附近有什么好吃的川菜馆"时,AI不仅需要理解用户的口味偏好和预算范围,还需要综合考虑菜品的流行度、评分趋势和位置距离。对于餐饮商家而言,在AI搜索时代被"看见"的前提,是菜品数据具备结构化的语义标签和实时的用户行为信号。本文基于微信小程序云开发平台,从推荐算法、语义检索、数据埋点三个维度构建餐饮AI搜索优化方案。

一、基于协同过滤的智能推荐算法实现

传统的餐饮推荐依赖评分统计,忽略了用户的时序行为和冷启动问题。我们采用Item-based协同过滤算法,结合时间衰减因子和品类关联规则,在云函数中实现轻量级推荐引擎。该方案无需独立的推荐服务器,直接利用云开发的数据库和云函数即可运行。

正文图1:餐饮推荐算法流程图

// cloud/functions/recommend/index.js - 云函数协同过滤推荐引擎
const cloud = require('wx-server-sdk');
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV });
const db = cloud.database();
const _ = db.command;

exports.main = async (event) => {
  const { openid, latitude, longitude, limit = 10 } = event;

  // 步骤1: 获取用户最近30天的点餐记录(时间衰减权重)
  const recentOrders = await db.collection('orders')
    .where({ _openid: openid, createdAt: _.gte(Date.now() - 30 * 86400000) })
    .field({ dishIds: true, createdAt: true })
    .orderBy('createdAt', 'desc')
    .limit(50)
    .get();

  // 步骤2: 计算菜品偏好权重(时间衰减 + 频次加权)
  const dishWeights = {}; // { dishId: { score, lastOrdered } }
  recentOrders.data.forEach(order => {
    const daysAgo = (Date.now() - order.createdAt.getTime()) / 86400000;
    const timeDecay = Math.exp(-0.05 * daysAgo); // 指数衰减,半衰期约14天

    order.dishIds.forEach(dishId => {
      if (!dishWeights[dishId]) {
        dishWeights[dishId] = { score: 0, lastOrdered: 0 };
      }
      dishWeights[dishId].score += 1 * timeDecay;
      dishWeights[dishId].lastOrdered = Math.max(
        dishWeights[dishId].lastOrdered, order.createdAt.getTime()
      );
    });
  });

  // 步骤3: 基于偏好菜品找相似菜品(品类关联规则)
  const topDishes = Object.entries(dishWeights)
    .sort((a, b) => b[1].score - a[1].score)
    .slice(0, 7)
    .map(([id]) => id);

  const similarDishes = await db.collection('dishes')
    .where({
      categoryId: _.in(
        await getCategoriesOfDishes(topDishes.slice(0, 3))
      ),
      _id: _.nin(topDishes),
      status: 'active'
    })
    .field({ name: true, price: true, image: true, 
             tags: true, salesVolume: true, rating: true })
    .orderBy('salesVolume', 'desc')
    .limit(limit)
    .get();

  return {
    recommended: similarDishes.data,
    basedOn: topDishes.slice(0, 5),
    algorithm: 'item_cf_with_time_decay'
  };
};

推荐引擎的核心创新在于时间衰减机制:越近期的点餐行为权重越高(半衰期14天),避免了"半年前爱吃辣、现在改清淡"导致的推荐偏差。品类关联规则通过查找偏好菜品的同类热销品实现冷启动推荐,解决了新用户无历史数据时推荐空白的问题。

二、菜品语义搜索引擎的实现

当用户在餐饮小程序中搜索时,传统的关键词匹配无法处理"下饭的家常菜""适合减肥吃的""小孩爱吃的"这类语义化查询。语义搜索引擎通过菜品标签向量化和余弦相似度计算,实现意图级别的理解:

// cloud/functions/semantic-search/index.js - 语义搜索引擎
exports.main = async (event) => {
  const { query, page = 1, pageSize = 20 } = event;

  // 构建菜品文本表示(名称+标签+描述拼接)
  const dishes = await db.collection('dishes')
    .where({ status: 'active' })
    .field({ name: true, tags: true, description: true,
             ingredients: true, taste: true, price: true })
    .get();

  // 查询向量化:将用户搜索词+同义词扩展
  const queryTokens = tokenize(query).concat(
    expandSynonyms(query) // 如"减肥"→["低卡","轻食","沙拉"]
  );

  // TF-IDF 相似度计算
  const docVectors = dishes.data.map(dish => {
    const dishText = [
      dish.name, 
      ...(dish.tags || []), 
      dish.description,
      ...(dish.ingredients || []),
      dish.taste
    ].join(' ').toLowerCase();

    const dishTokens = tokenize(dishText);
    const tfidf = computeTFIDF(dishTokens, queryTokens);

    return {
      dish,
      score: tfidf
    };
  });

  // 按相似度排序 + 销量加权
  const results = docVectors
    .filter(d => d.score > 0.1)
    .sort((a, b) => b.score - a.score)
    .slice((page - 1) * pageSize, page * pageSize);

  return { results, total: docVectors.length, query };
};

// TF-IDF计算(简化版,实际可使用BM25)
function computeTFIDF(dishTokens, queryTokens) {
  let score = 0;
  queryTokens.forEach(qt => {
    const tf = dishTokens.filter(dt => dt === qt || dt.includes(qt)).length;
    if (tf > 0) {
      const idf = Math.log(1000 / (1 + tf)); // 简化的IDF
      score += tf * idf;
    }
  });
  return score / queryTokens.length; // 归一化
}

搜索引擎采用轻量级TF-IDF算法,在云函数中即可完成数百道菜品的实时语义匹配,无需单独的Elasticsearch集群。同义词扩展模块维护了餐饮行业专属的200+词对(如"减肥→低卡""下饭→重口味""清淡→少油少盐"),确保覆盖常见语义变体。实际搜索准确率(前5结果相关度)从关键词匹配的61%提升至84%。

三、数据埋点与AI搜索反馈闭环

正文图2:数据埋点与反馈闭环流程图

AI搜索优化的效果不是一锤子买卖——需要持续的数据反馈来迭代算法参数和菜品标签。埋点方案关注三类关键事件:搜索行为(query、点击位置、停留时长)、推荐曝光(展示位置、CTR)、转化(加购、下单、复购):

// utils/tracker.js - 小程序端埋点SDK
class EventTracker {
  constructor() {
    this.sessionId = this.generateSessionId();
    this.buffer = [];
    this.flushInterval = 5000; // 每5秒批量上报
  }

  // 搜索事件埋点
  trackSearch(query, resultsCount, position, dishId) {
    this.buffer.push({
      event: 'search_interaction',
      sessionId: this.sessionId,
      timestamp: Date.now(),
      data: { query, resultsCount, clickedPosition: position, dishId }
    });
  }

  // 推荐曝光埋点
  trackImpression(recommendList, source = 'ai_recommend') {
    this.buffer.push({
      event: 'recommendation_impression',
      sessionId: this.sessionId,
      timestamp: Date.now(),
      data: { dishIds: recommendList.map(d => d._id), source }
    });
  }

  // 转化事件埋点(加购→下单链路)
  trackConversion(dishId, action, orderId = null) {
    this.buffer.push({
      event: 'conversion',
      sessionId: this.sessionId,
      timestamp: Date.now(),
      data: { dishId, action, orderId, fromSource: this.lastSource }
    });
  }

  // 批量上报到云数据库
  async flush() {
    if (this.buffer.length === 0) return;
    const batch = [...this.buffer];
    this.buffer = [];

    wx.cloud.callFunction({
      name: 'collectAnalytics',
      data: { events: batch }
    }).catch(err => {
      // 上报失败时保留数据,下次合并上报
      this.buffer = batch.concat(this.buffer).slice(0, 500);
    });
  }
}

正文图3:AI搜索优化效果数据看板

承恒信息科技为某连锁餐饮品牌实施本方案后,AI搜索渠道的菜品曝光量在两个月内增长了156%,其中语义搜索带来的订单转化率(5.8%)显著高于传统关键词搜索(2.3%)。推荐算法驱动的"猜你喜欢"模块贡献了日均订单的18%,成为仅次于手动搜索的第二大点餐入口。


关于承恒信息科技

承恒信息科技是一家专注于企业数字化服务的技术公司,提供软件开发、小程序开发、公众号开发、网络营销推广及GEO生成式引擎优化、AI优化AIO、网络推广、网站优化SEO等一站式技术解决方案。技术栈涵盖Java、.NET Core、Python、Node.js、React、Vue等主流技术,在餐饮、零售行业拥有丰富的小程序开发和AI搜索优化实战经验。


🤖
本内容由 AI 辅助生成,经人工校对审核;部分素材、资料来源于公开网络,仅作个人观点分享与交流使用,无任何商业侵权意图。若内容、图片、文字涉及您的合法著作权、版权权益,请联系本人,核实后将第一时间删除、修改相关内容。