大模型应用:从意图识别到个性化推荐:基于语义意图识别的智能推荐系统.121

简介: 本文详解基于语义意图识别的轻量级智能推荐系统:无需海量数据与复杂数学,仅用Sentence-BERT(all-MiniLM-L6-v2)将用户查询与商品描述转为向量,通过余弦相似度匹配,精准解决“搜一次就反复推”和冷启动问题,并附完整可运行代码与可视化实践。

一、前言

       我们在刷电商、看视频、听音乐的时候,肯定都有过这种感觉:明明只是随口搜了一句话,平台就像懂你一样,推过来的东西刚好是你想要的。这背后不是玄学,也不是巧合,而是意图识别 + 推荐系统在默默工作。传统的推荐要么靠历史行为、要么靠标签匹配,很容易出现“搜过一次就反复推”、“看不懂真实需求”的问题。而现在更聪明的方式,是直接理解我们这句话的意思,不管我们怎么说、用什么词,系统都能抓住我们真正想要什么,再给我们最匹配的结果。

       今天我们趁热打铁,基于意图识别的基础上,用最简单、最容易落地的方式,做一个基于语义意图识别的智能推荐系统。不需要复杂数学,不需要海量数据,只用轻量模型一步步从基础到实战,更进一步的理解:文本怎么变成向量、意图怎么识别、相似度怎么计算、推荐结果怎么排出来,最后还能画出直观图表。了解清楚后我们不仅能搞定推荐系统,还能顺手掌握意图识别、语义检索、智能问答整个流程的核心原理。

121.2-从意图识别到个性化推荐.png

二、核心基础

1. 推荐系统的核心价值

       推荐系统是大数据和人工智能领域最落地的应用之一,它的核心目标是在海量信息中为用户匹配最符合其需求的内容,解决信息过载的问题。从电商平台的“猜你喜欢”、视频网站的“推荐视频”,到音乐APP的“每日推荐”,推荐系统已经渗透到我们生活的方方面面。

传统推荐系统主要分为三类:

  • 协同过滤推荐:基于用户行为(如购买、点击、收藏)的相似性推荐,比如购买了A商品的用户还购买了B
  • 内容推荐:基于物品本身的特征(如商品分类、视频标签)匹配用户兴趣
  • 混合推荐:结合多种策略的综合推荐

       但这些传统方法存在明显短板:协同过滤依赖大量用户行为数据,如果没有行为数据会产生冷启动问题,内容推荐只能基于人工标注的标签,却无法理解语义。而基于语义意图识别的推荐系统,能够直接理解用户输入文本的语义,即使是新用户、新物品也能做出精准推荐,完美解决冷启动问题。

2. 语义意图识别的技术原理

       语义意图识别的核心是将文本转化为计算机可理解的数值向量,即通常说的嵌入向量Embedding,通过计算向量之间的相似度,判断文本的语义关联。

2.1 文本向量化的基本概念

       自然语言是人类的符号系统,计算机无法直接理解。文本向量化就是将文字转化为高维空间中的向量,使得语义相似的文本,其向量在空间中的距离也更近。

举个简单例子:

  • “我想吃苹果” → [0.2, 0.5, -0.1, 0.8]
  • “我想要吃苹果” → [0.18, 0.52, -0.09, 0.79]
  • “我想买手机” → [-0.3, 0.1, 0.9, -0.2]

可以看到,前两个语义相似的句子,向量值几乎一致,而第三个完全不同的句子,向量差异很大。

2.2 余弦相似度计算

       判断两个向量的相似性,最常用的是余弦相似度。它计算的是两个向量之间夹角的余弦值,取值范围在 [-1,1] 之间:

  • 余弦值 = 1:两个向量完全相同(夹角 0°)
  • 余弦值 = 0:两个向量完全无关(夹角 90°)
  • 余弦值 =-1:两个向量完全相反(夹角 180°)

2.3 Sentence-BERT 模型介绍

       我们使用的 Sentence-BERT(SBERT)是 BERT 模型的改进版,专门针对句子级别的向量生成优化:

  • 轻量级:all-MiniLM-L6-v2 版本相比其他大模型来说体量很小,普通的硬件条件即可运行
  • 高精度:在语义相似度任务上表现优异
  • 速度快:推理速度比原生 BERT 快很多
  • 易用性:Sentence-Transformers 库提供了极简的 API 接口

3. 推荐系统与语义意图识别的结合

基于语义意图识别的推荐系统核心流程:

121.3-语义意图识别的推荐系统核心流程 deepseek_mermaid_20260318_6519fe.png

  • 收集用户输入的文本需求(如搜索词、评论、提问)
  • 将用户需求转化为语义向量
  • 将推荐库中的物品描述转化为语义向量
  • 计算用户需求向量与物品向量的余弦相似度
  • 按照相似度排序,向用户推荐最匹配的物品

三、应用实践

1. 基础示例:语义向量生成

首先实现最基础的功能:将文本转化为语义向量,并计算相似度。

# 基础语义向量生成与相似度计算
from sentence_transformers import SentenceTransformer
from modelscope import snapshot_download
import torch
import torch.nn.functional as F
import numpy as np
# 配置模型缓存路径(请修改为你的本地路径)
CACHE_DIR = "D:\\modelscope\\hub"
def load_semantic_model():
    """
    加载预训练的语义模型
    返回:初始化后的Sentence-BERT模型
    """
    # 从ModelScope下载模型
    model_dir = snapshot_download(
        model_id="sentence-transformers/all-MiniLM-L6-v2",
        cache_dir=CACHE_DIR,
        revision="master"
    )
    
    # 初始化模型
    model = SentenceTransformer(model_dir)
    print(f"模型加载完成,路径:{model_dir}")
    return model
def get_text_embedding(model, text: str) -> np.ndarray:
    """
    将文本转化为语义向量
    :param model: 已加载的Sentence-BERT模型
    :param text: 输入文本
    :return: 768维的语义向量(numpy数组)
    """
    # 空文本处理
    if not text.strip():
        return np.zeros(768)
    
    # 生成向量(convert_to_tensor=True返回PyTorch张量,便于后续计算)
    embedding = model.encode(
        text,
        convert_to_tensor=True,
        normalize_embeddings=True  # 归一化,便于计算余弦相似度
    )
    
    # 转换为numpy数组,方便查看和保存
    return embedding.cpu().numpy()
def calculate_cosine_similarity(embedding1: np.ndarray, embedding2: np.ndarray) -> float:
    """
    计算两个向量的余弦相似度
    :param embedding1: 第一个向量
    :param embedding2: 第二个向量
    :return: 相似度值(0-1之间)
    """
    # 转换为PyTorch张量
    tensor1 = torch.tensor(embedding1)
    tensor2 = torch.tensor(embedding2)
    
    # 计算余弦相似度
    similarity = F.cosine_similarity(tensor1.unsqueeze(0), tensor2.unsqueeze(0))
    
    return similarity.item()
# 测试基础功能
if __name__ == "__main__":
    # 加载模型
    model = load_semantic_model()
    
    # 测试文本
    text1 = "我想买华为手机"
    text2 = "华为智能手机新品推荐"
    text3 = "苹果笔记本电脑价格"
    
    # 生成向量
    emb1 = get_text_embedding(model, text1)
    emb2 = get_text_embedding(model, text2)
    emb3 = get_text_embedding(model, text3)
    
    # 打印向量形状(all-MiniLM-L6-v2生成768维向量)
    print(f"\n文本1向量形状:{emb1.shape}")
    print(f"文本1向量前5个值:{emb1[:5]}")
    
    # 计算相似度
    sim1_2 = calculate_cosine_similarity(emb1, emb2)
    sim1_3 = calculate_cosine_similarity(emb1, emb3)
    
    print(f"\n文本1与文本2的相似度:{sim1_2:.4f}")  
    print(f"文本1与文本3的相似度:{sim1_3:.4f}")

image.gif

重点说明:

  • 模型加载函数(load_semantic_model):
  • 使用snapshot_download从 ModelScope 下载模型,指定缓存路径避免重复下载
  • 初始化SentenceTransformer模型,这是整个系统的核心
  • 文本向量化函数(get_text_embedding):
  • normalize_embeddings=True:对向量进行归一化,这样计算出的余弦相似度等价于点积
  • 返回 numpy 数组而非 PyTorch 张量,方便后续的数据处理和可视化
  • 768 维向量是 all-MiniLM-L6-v2 模型的固定输出维度
  • 相似度计算函数(calculate_cosine_similarity):
  • 使用 PyTorch 的F.cosine_similarity函数,计算效率高
  • unsqueeze(0)将一维向量转为二维,这是模型要求的输入格式
  • 返回 0-1 之间的相似度值,便于理解

输出结果:

模型加载完成,路径:D:\modelscope\hub\sentence-transformers\all-MiniLM-L6-v2

文本1向量形状:(384,)

文本1向量前5个值:[-0.12120966  0.0569455   0.05103578  0.0395971  -0.00804459]

文本1与文本2的相似度:0.5533

文本1与文本3的相似度:0.4745

2. 构建完整的智能推荐系统

我们将构建一个电商场景的智能推荐系统,核心功能:

  • 1. 维护一个商品库,包含商品 ID、名称、描述
  • 2. 用户输入需求文本,如“我想买轻薄的笔记本电脑”
  • 3. 系统识别用户需求的语义,计算与商品库中所有商品的相似度
  • 4. 返回相似度最高的 Top-N 商品作为推荐结果
  • 5. 可视化展示推荐结果的相似度分布

121.4-智能推荐系统用户意图分类分布 intent_distribution.png

# 完整的基于语义意图识别的智能推荐系统
from sentence_transformers import SentenceTransformer
from modelscope import snapshot_download
import torch
import torch.nn.functional as F
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from typing import List, Dict, Tuple
# 全局配置
CACHE_DIR = "D:\\modelscope\\hub"
MODEL_ID = "sentence-transformers/all-MiniLM-L6-v2"
TOP_N_RECOMMEND = 5  # 默认返回Top5推荐结果
plt.rcParams["font.sans-serif"] = ["SimHei"]  # 支持中文显示
plt.rcParams["axes.unicode_minus"] = False    # 支持负号显示
class SemanticRecommender:
    """基于语义意图识别的推荐系统类"""
    
    def __init__(self):
        """初始化推荐系统:加载模型、初始化商品库"""
        self.model = self._load_model()
        self.product_db = self._init_product_database()
        self.product_embeddings = self._precompute_product_embeddings()
    
    def _load_model(self) -> SentenceTransformer:
        """加载语义模型(内部方法)"""
        print("正在下载/加载语义模型...")
        model_dir = snapshot_download(
            model_id=MODEL_ID,
            cache_dir=CACHE_DIR,
            revision="master"
        )
        model = SentenceTransformer(model_dir)
        # 将模型移动到GPU(如果可用)
        device = "cuda" if torch.cuda.is_available() else "cpu"
        model = model.to(device)
        print(f"模型加载完成:{MODEL_ID}(设备:{device})")
        return model
    
    def _init_product_database(self) -> pd.DataFrame:
        """初始化商品数据库(模拟电商商品数据)"""
        products = [
            {"product_id": 1001, "name": "华为MateBook 14", "description": "14英寸轻薄笔记本电脑,酷睿i5,16G内存,512G固态,续航长,便携办公,商务笔记本"},
            {"product_id": 1002, "name": "苹果iPhone 15", "description": "iPhone 15 256G 黑色,新款智能手机,A16芯片,超清摄像头,长续航,苹果手机"},
            {"product_id": 1003, "name": "小米平板6", "description": "11.2英寸平板电脑,骁龙8+,8G+256G,学习办公娱乐,平板设备"},
            {"product_id": 1004, "name": "戴尔XPS 13", "description": "13.4英寸超极本,酷睿i7,32G内存,1TB固态,轻薄便携,高端办公,商务笔记本"},
            {"product_id": 1005, "name": "华为Pura 70 Pro", "description": "华为新款智能手机,麒麟芯片,超光变摄像头,512G存储,鸿蒙系统,安卓手机"},
            {"product_id": 1006, "name": "联想拯救者Y9000P", "description": "16英寸游戏笔记本电脑,酷睿i9,RTX4060,32G内存,1TB固态,高性能,电竞游戏本,游戏电脑"},
            {"product_id": 1007, "name": "iPad Pro 2024", "description": "12.9英寸iPad Pro,M4芯片,256G,支持Apple Pencil,专业创作,平板电脑"},
            {"product_id": 1008, "name": "三星Galaxy S24", "description": "三星旗舰智能手机,骁龙8 Gen3,2K屏幕,5000万像素,12G+256G,安卓手机"},
            {"product_id": 1009, "name": "华硕天选5", "description": "15.6英寸游戏本,锐龙7,RTX4070,16G+1TB,高刷新率屏幕,电竞游戏本,游戏电脑"},
            {"product_id": 1010, "name": "微软Surface Pro 9", "description": "二合一平板电脑,酷睿i7,16G+512G,触控屏,便携办公,平板笔记本"}
        ]
        df = pd.DataFrame(products)
        # 合并名称和描述,生成用于语义匹配的文本
        df["match_text"] = df["name"] + ":" + df["description"]
        print(f"商品库初始化完成,共{len(df)}个商品")
        return df
    
    def _precompute_product_embeddings(self) -> Dict[int, torch.Tensor]:
        """预计算所有商品的语义向量(提升推荐速度)"""
        print("正在预计算商品语义向量...")
        device = "cuda" if torch.cuda.is_available() else "cpu"
        embeddings = {}
        for _, row in self.product_db.iterrows():
            product_id = row["product_id"]
            match_text = row["match_text"]
            # 生成归一化的向量,并移动到相同设备
            embedding = self.model.encode(
                match_text,
                convert_to_tensor=True,
                normalize_embeddings=True,
                device=device
            )
            embeddings[product_id] = embedding
        print(f"商品向量预计算完成(设备:{device})")
        return embeddings
    
    def get_user_embedding(self, user_query: str) -> torch.Tensor:
        """生成用户查询文本的语义向量"""
        if not user_query.strip():
            raise ValueError("用户查询文本不能为空")
        device = "cuda" if torch.cuda.is_available() else "cpu"
        embedding = self.model.encode(
            user_query,
            convert_to_tensor=True,
            normalize_embeddings=True,
            device=device
        )
        return embedding
    
    def calculate_product_similarity(self, user_embedding: torch.Tensor) -> pd.DataFrame:
        """计算用户查询与所有商品的相似度"""
        # 准备相似度计算结果
        similarity_results = []
        
        for product_id, prod_embedding in self.product_embeddings.items():
            # 计算余弦相似度
            similarity = F.cosine_similarity(user_embedding.unsqueeze(0), prod_embedding.unsqueeze(0)).item()
            # 获取商品信息
            product_info = self.product_db[self.product_db["product_id"] == product_id].iloc[0]
            similarity_results.append({
                "product_id": product_id,
                "name": product_info["name"],
                "similarity": similarity,
                "description": product_info["description"]
            })
        
        # 转换为DataFrame并按相似度降序排序
        results_df = pd.DataFrame(similarity_results)
        results_df = results_df.sort_values(by="similarity", ascending=False)
        return results_df
    
    def recommend(self, user_query: str, top_n: int = TOP_N_RECOMMEND) -> Tuple[pd.DataFrame, pd.DataFrame]:
        """
        核心推荐函数
        :param user_query: 用户输入的查询文本
        :param top_n: 返回的推荐商品数量
        :return: Top-N推荐结果、所有商品的相似度结果
        """
        # 生成用户查询向量
        user_embedding = self.get_user_embedding(user_query)
        # 计算所有商品相似度
        all_results = self.calculate_product_similarity(user_embedding)
        # 调试:打印所有商品的相似度
        print(f"\n【调试】所有商品相似度排序:")
        for idx, row in all_results.iterrows():
            print(f"  {row['name']}: {row['similarity']:.4f}")
        # 获取Top-N结果
        top_results = all_results.head(top_n).copy()
        # 格式化相似度值(保留4位小数)
        top_results["similarity"] = top_results["similarity"].apply(lambda x: f"{x:.4f}")
        all_results["similarity"] = all_results["similarity"].apply(lambda x: f"{x:.4f}")
        return top_results, all_results
    
    def visualize_recommendation(self, user_query: str, all_results: pd.DataFrame):
        """
        可视化推荐结果
        :param user_query: 用户查询文本
        :param all_results: 所有商品的相似度结果
        """
        # 准备可视化数据
        plot_data = all_results.head(10).copy()  # 取前10个商品可视化
        plot_data["similarity_num"] = plot_data["similarity"].astype(float)
        
        # 创建画布
        fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 6))
        
        # 子图1:相似度条形图
        sns.barplot(
            x="similarity_num",
            y="name",
            data=plot_data,
            ax=ax1,
            palette="viridis"
        )
        ax1.set_title(f"用户查询:{user_query}\n商品相似度排名(Top10)", fontsize=14, pad=20)
        ax1.set_xlabel("语义相似度", fontsize=12)
        ax1.set_ylabel("商品名称", fontsize=12)
        ax1.set_xlim(0, 1.0)
        
        # 在条形图上添加数值标签
        for i, v in enumerate(plot_data["similarity_num"]):
            ax1.text(v + 0.01, i, f"{v:.3f}", va="center", fontsize=10)
        
        # 子图2:相似度分布直方图
        all_similarities = all_results["similarity"].astype(float)
        sns.histplot(
            all_similarities,
            bins=8,
            ax=ax2,
            kde=True,
            color="#2ecc71"
        )
        ax2.set_title("所有商品相似度分布", fontsize=14, pad=20)
        ax2.set_xlabel("相似度值", fontsize=12)
        ax2.set_ylabel("商品数量", fontsize=12)
        ax2.axvline(
            all_similarities.mean(),
            color="red",
            linestyle="--",
            label=f"平均值:{all_similarities.mean():.3f}"
        )
        ax2.legend()
        
        # 调整布局并保存图片
        plt.tight_layout()
        plt.savefig(f"121.{user_query} recommendation_result_{hash(user_query)}.png", dpi=300, bbox_inches="tight")
        print(f"\n可视化图表已保存为:recommendation_result_{hash(user_query)}.png")
        plt.show()
# 系统测试与使用示例
def main():
    """推荐系统使用示例"""
    # 初始化推荐系统(首次运行会下载模型,后续运行直接加载缓存)
    recommender = SemanticRecommender()
    
    # 测试多个用户查询场景
    test_queries = [
        "我想买轻薄的笔记本电脑,方便办公携带",
        "推荐一款性能好的智能手机",
        "适合玩游戏的笔记本电脑",
        "平板电脑 学习办公 二合一"
    ]
    
    # 遍历测试查询
    for query in test_queries:
        print("\n" + "="*80)
        print(f"用户查询:{query}")
        print("="*80)
        
        # 获取推荐结果
        top_recommendations, all_results = recommender.recommend(query, top_n=5)
        
        # 打印Top-N推荐结果
        print("\n【Top5推荐商品】")
        print("-" * 60)
        for idx, (_, row) in enumerate(top_recommendations.iterrows(), 1):
            print(f"{idx}. 商品ID:{row['product_id']}")
            print(f"   名称:{row['name']}")
            print(f"   相似度:{row['similarity']}")
            print(f"   描述:{row['description']}")
            print("-" * 60)
        
        # 可视化推荐结果
        recommender.visualize_recommendation(query, all_results)
if __name__ == "__main__":
    main()

image.gif

重点说明:

  • 商品向量预计算:
  • 在系统初始化时就计算所有商品的语义向量并缓存,避免每次推荐都重新计算,大幅提升推荐速度
  • 向量归一化(normalize_embeddings=True):归一化后的向量计算余弦相似度时,等价于计算点积,计算效率更高
  • 相似度计算优化:
  • 使用 PyTorch 张量直接计算,避免 numpy 和 tensor 之间的频繁转换
  • 批量处理商品向量,而非逐个计算(在商品数量大时优势明显)
  • 结果可视化:
  • 使用 matplotlib 和 seaborn 绘制专业的可视化图表
  • 包含两个子图:条形图展示 Top10 商品的相似度排名,直方图展示所有商品的相似度分布

121.5-智能推荐系统TopN相似度对比 topn_comparison.png

  • 数据处理技巧
  • 使用 Pandas DataFrame 管理商品数据,便于数据筛选、排序和格式化
  • 合并商品名称和描述生成match_text,让语义匹配更全面
  • 格式化相似度值为 4 位小数,提升可读性

121.6-推荐系统核心文本语义相似度热力图 similarity_heatmap.png

输出结果:

模型加载完成:sentence-transformers/all-MiniLM-L6-v2

商品库初始化完成,共10个商品

正在预计算商品语义向量...

商品向量预计算完成

=====================================================================

用户查询:我想买轻薄的笔记本电脑,方便办公携带

=====================================================================

【调试】所有商品相似度排序:

 华为MateBook 14: 0.6558

 联想拯救者Y9000P: 0.6112

 戴尔XPS 13: 0.6019

 微软Surface Pro 9: 0.5500

 小米平板6: 0.5205

 华硕天选5: 0.4545

 华为Pura 70 Pro: 0.4392

 iPad Pro 2024: 0.4294

 三星Galaxy S24: 0.3627

 苹果iPhone 15: 0.2501

【Top5推荐商品】

------------------------------------------------------------

1. 商品ID:1001

  名称:华为MateBook 14

  相似度:0.6558

  描述:14英寸轻薄笔记本电脑,酷睿i5,16G内存,512G固态,续航长,便携办公,商务笔记本

------------------------------------------------------------

2. 商品ID:1006

  名称:联想拯救者Y9000P

  相似度:0.6112

  描述:16英寸游戏笔记本电脑,笔记本电脑,酷睿i9,RTX4060,32G内存,1TB固态,高性能,电竞游戏本,游戏电脑

------------------------------------------------------------

3. 商品ID:1004

  名称:戴尔XPS 13

  相似度:0.6019

  描述:13.4英寸超极本,酷睿i7,32G内存,1TB固态,轻薄便携,高端办公,商务笔记本

------------------------------------------------------------

4. 商品ID:1010

  名称:微软Surface Pro 9

  相似度:0.5500

  描述:二合一平板电脑,酷睿i7,16G+512G,触控屏,便携办公,平板笔记本

------------------------------------------------------------

5. 商品ID:1003

  名称:小米平板6

  相似度:0.5205

  描述:11.2英寸平板电脑,骁龙8+,8G+256G,学习办公娱乐,平板设备

------------------------------------------------------------

可视化图表已保存为:recommendation_result_-7594116227589423243.png

121.7-我想买轻薄的笔记本电脑,方便办公携带 recommendation_result.png

=====================================================================

用户查询:推荐一款性能好的智能手机

=====================================================================

【调试】所有商品相似度排序:

 华为Pura 70 Pro: 0.6733

 三星Galaxy S24: 0.6147

 华为MateBook 14: 0.5565

 苹果iPhone 15: 0.5336

 微软Surface Pro 9: 0.4977

 小米平板6: 0.4958

 iPad Pro 2024: 0.4463

 戴尔XPS 13: 0.4301

 联想拯救者Y9000P: 0.4199

 华硕天选5: 0.3682

【Top5推荐商品】

------------------------------------------------------------

1. 商品ID:1005

  名称:华为Pura 70 Pro

  相似度:0.6733

  描述:华为新款智能手机,麒麟芯片,超光变摄像头,512G存储,鸿蒙系统,安卓手机

------------------------------------------------------------

2. 商品ID:1008

  名称:三星Galaxy S24

  相似度:0.6147

  描述:三星旗舰智能手机,骁龙8 Gen3,2K屏幕,5000万像素,12G+256G,安卓手机

------------------------------------------------------------

3. 商品ID:1001

  名称:华为MateBook 14

  相似度:0.5565

  描述:14英寸轻薄笔记本电脑,酷睿i5,16G内存,512G固态,续航长,便携办公,商务笔记本

------------------------------------------------------------

4. 商品ID:1002

  名称:苹果iPhone 15

  相似度:0.5336

  描述:iPhone 15 256G 黑色,新款智能手机,A16芯片,超清摄像头,长续航,苹果手机

------------------------------------------------------------

5. 商品ID:1010

  名称:微软Surface Pro 9

  相似度:0.4977

  描述:二合一平板电脑,酷睿i7,16G+512G,触控屏,便携办公,平板笔记本

------------------------------------------------------------

可视化图表已保存为:recommendation_result_8710797376787374839.png

121.8-推荐一款性能好的智能手机 recommendation_result.png

=====================================================================

用户查询:适合玩游戏的笔记本电脑

=====================================================================

【调试】所有商品相似度排序:

 联想拯救者Y9000P: 0.7578

 华硕天选5: 0.6641

 小米平板6: 0.5899

 微软Surface Pro 9: 0.5868

 华为MateBook 14: 0.5573

 戴尔XPS 13: 0.5492

 iPad Pro 2024: 0.4451

 华为Pura 70 Pro: 0.4199

 三星Galaxy S24: 0.3419

 苹果iPhone 15: 0.2580

【Top5推荐商品】

------------------------------------------------------------

1. 商品ID:1006

  名称:联想拯救者Y9000P

  相似度:0.7578

  描述:16英寸游戏笔记本电脑,笔记本电脑,酷睿i9,RTX4060,32G内存,1TB固态,高性能,电竞游戏本,游戏电脑

------------------------------------------------------------

2. 商品ID:1009

  名称:华硕天选5

  相似度:0.6641

  描述:15.6英寸游戏本,锐龙7,RTX4070,16G+1TB,高刷新率屏幕,电竞游戏本,游戏电脑

------------------------------------------------------------

3. 商品ID:1003

  名称:小米平板6

  相似度:0.5899

  描述:11.2英寸平板电脑,骁龙8+,8G+256G,学习办公娱乐,平板设备

------------------------------------------------------------

4. 商品ID:1010

  名称:微软Surface Pro 9

  相似度:0.5868

  描述:二合一平板电脑,酷睿i7,16G+512G,触控屏,便携办公,平板笔记本

------------------------------------------------------------

5. 商品ID:1001

  名称:华为MateBook 14

  相似度:0.5573

  描述:14英寸轻薄笔记本电脑,酷睿i5,16G内存,512G固态,续航长,便携办公,商务笔记本

------------------------------------------------------------

可视化图表已保存为:recommendation_result_3056993889972041682.png

121.9-适合玩游戏的笔记本电脑 recommendation_result.png

=====================================================================

用户查询:平板电脑 学习办公 二合一

=====================================================================

【调试】所有商品相似度排序:

 小米平板6: 0.7686

 微软Surface Pro 9: 0.6989

 华为MateBook 14: 0.6416

 华为Pura 70 Pro: 0.5697

 联想拯救者Y9000P: 0.5636

 戴尔XPS 13: 0.5387

 iPad Pro 2024: 0.5266

 三星Galaxy S24: 0.5238

 华硕天选5: 0.4653

 苹果iPhone 15: 0.3663

【Top5推荐商品】

------------------------------------------------------------

1. 商品ID:1003

  名称:小米平板6

  相似度:0.7686

  描述:11.2英寸平板电脑,骁龙8+,8G+256G,学习办公娱乐,平板设备

------------------------------------------------------------

2. 商品ID:1010

  名称:微软Surface Pro 9

  相似度:0.6989

  描述:二合一平板电脑,酷睿i7,16G+512G,触控屏,便携办公,平板笔记本

------------------------------------------------------------

3. 商品ID:1001

  名称:华为MateBook 14

  相似度:0.6416

  描述:14英寸轻薄笔记本电脑,酷睿i5,16G内存,512G固态,续航长,便携办公,商务笔记本

------------------------------------------------------------

4. 商品ID:1005

  名称:华为Pura 70 Pro

  相似度:0.5697

  描述:华为新款智能手机,麒麟芯片,超光变摄像头,512G存储,鸿蒙系统,安卓手机

------------------------------------------------------------

5. 商品ID:1006

  名称:联想拯救者Y9000P

  相似度:0.5636

  描述:16英寸游戏笔记本电脑,笔记本电脑,酷睿i9,RTX4060,32G内存,1TB固态,高性能,电竞游戏本,游戏电脑

------------------------------------------------------------

可视化图表已保存为:recommendation_result_2898953139431032964.png

121.10-平板电脑 学习办公 二合一 recommendation_result.png

四、扩展优化

1. 批量处理

当商品数量很大时,如超过10000条,逐个计算相似度会很慢,可以使用批量计算:

def calculate_batch_similarity(self, user_embedding: torch.Tensor) -> pd.DataFrame:
    """批量计算相似度(优化版本)"""
    # 将所有商品向量堆叠成矩阵
    product_embeddings_tensor = torch.stack(list(self.product_embeddings.values()))
    
    # 批量计算相似度(一次计算所有商品)
    similarities = F.cosine_similarity(
        user_embedding.unsqueeze(0).repeat(len(product_embeddings_tensor), 1),
        product_embeddings_tensor
    )
    
    # 构建结果
    product_ids = list(self.product_embeddings.keys())
    similarity_results = []
    
    for i, product_id in enumerate(product_ids):
        product_info = self.product_db[self.product_db["product_id"] == product_id].iloc[0]
        similarity_results.append({
            "product_id": product_id,
            "name": product_info["name"],
            "similarity": similarities[i].item(),
            "description": product_info["description"]
        })
    
    results_df = pd.DataFrame(similarity_results)
    results_df = results_df.sort_values(by="similarity", ascending=False)
    return results_df

image.gif

121.11-语义推荐系统批量优化前后速度对比 speed_optimization.png

2. 向量缓存

将预计算的商品向量保存到本地文件,下次启动系统时直接加载,无需重新计算:

import pickle
def save_product_embeddings(self, filepath: str = "product_embeddings.pkl"):
    """保存商品向量到本地"""
    with open(filepath, "wb") as f:
        pickle.dump(self.product_embeddings, f)
    print(f"商品向量已保存到:{filepath}")
def load_product_embeddings(self, filepath: str = "product_embeddings.pkl"):
    """从本地加载商品向量"""
    import os
    if os.path.exists(filepath):
        with open(filepath, "rb") as f:
            self.product_embeddings = pickle.load(f)
        print(f"从本地加载商品向量:{filepath}")
    else:
        self.product_embeddings = self._precompute_product_embeddings()
        self.save_product_embeddings(filepath)

image.gif

3. 接口开放

简易 Web 服务:使用 FastAPI 封装成 API 服务:

from fastapi import FastAPI
import uvicorn
app = FastAPI(title="语义推荐系统API")
recommender = SemanticRecommender()
@app.get("/recommend")
def recommend_api(query: str, top_n: int = 5):
    """推荐API接口"""
    top_results, _ = recommender.recommend(query, top_n=top_n)
    return {
        "query": query,
        "top_recommendations": top_results.to_dict("records")
    }
if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

image.gif

五、总结

       到这里,我们从最基础的语义向量、意图识别,一步步搭出了一整套可直接运行的智能推荐系统,整个过程其实比想象中简单很多。核心思路就是:把用户的话、商品的描述,都转成计算机能看懂的向量,再通过相似度算出谁最匹配,最后排序输出推荐结果。可以不依赖大量用户行为,完美解决了冷启动问题,不管是电商推荐、内容检索还是智能问答,都能直接复用。

       在学习过程中真正难的不是代码,而是理解背后的逻辑:为什么要做向量归一化、为什么要预计算商品嵌入、为什么相似度能代表语义相关。把这些想通了,再去写代码、调参数、做可视化,就会非常顺畅。我们可以先跑通基础示例,把最简单的文本相似度跑通,再慢慢扩展成类、做成推荐系统,最后再去优化批量计算、缓存、可视化这些细节。不要一上来就追求高性能、大模型,先让小系统跑起来,再一点点迭代升级。AI 应用并没有那么神秘。只要掌握了语义嵌入 + 相似度匹配这一套核心工具,就能做出很多实用又很酷的系统。

相关文章
|
3天前
|
机器学习/深度学习 自然语言处理 C++
大模型应用:大模型实测对比:1.8B vs 6B,本地部署的极限拉扯与真实体感.119
本文对比Qwen1.5-1.8B与ChatGLM2-6B两大中文大模型:前者轻量易部署,CPU即可运行,代码简洁,但易幻觉、指令遵循弱;后者参数量大,中文理解与逻辑更强,但需GPU、加载复杂。二者代表“小而美”与“大而全”的典型路径。
109 2
大模型应用:大模型实测对比:1.8B vs 6B,本地部署的极限拉扯与真实体感.119
|
10天前
|
存储 缓存 安全
大模型应用:大模型响应缓存技术完全指南:TTL 缓存装饰器的设计与落地.112
本文详解大模型应用中缓存装饰器的实战实现,直击响应慢、成本高两大痛点。从基础缓存出发,逐步升级为支持TTL过期、线程安全、LRU淘汰、异常防护及哈希键优化的生产级方案,显著提升响应速度、降低Token消耗、增强系统稳定性。
137 7
|
11天前
|
机器学习/深度学习 自然语言处理 搜索推荐
大模型应用开发核心认知与技巧指引:从提示工程到智能Agent的完整实践.111
本文系统讲解大模型应用开发核心路径:从API调用基础,到提示工程(结构化指令、Few-shot、思维链CoT),再到高阶智能Agent(感知-思考-行动-反馈闭环)。强调“目标式编程”范式转变,聚焦如何驾驭大模型解决非结构化问题,助力开发者快速落地实用应用。
176 6
|
17天前
|
机器学习/深度学习 自然语言处理 算法
大模型应用:LDA线性判别分析+大模型:小数据驱动的语义增强分类实战.105
本文提出“LDA+大模型”小数据文本分类方案:用大模型(如BERT)生成高质量语义向量,再通过线性判别分析(LDA)降维并分类。兼顾语义理解与计算效率,仅需数百条标注数据即可实现高精度、低成本、易部署的文本分类,适用于意图识别、舆情分析等企业真实场景。
144 3
|
24天前
|
数据采集 算法 数据挖掘
大模型应用:从静态到动态:增量聚类+大模型破解无限流数据智能处理难题.98
本文详解“增量聚类 + 大模型”融合方案,破解无限流数据(如实时工单、舆情、日志)处理难题:增量聚类实现边流入边动态分组,大模型负责语义化打标(如“快递丢失理赔咨询”),替代人工标注。涵盖原理、StreamKM++算法、Embedding转换、Prompt工程及完整代码示例,助力企业构建实时智能分类系统。
239 3
|
1月前
|
机器学习/深度学习 人工智能 缓存
大模型应用:情感分析:用Stacking堆叠集成+大模型实现1+1>2的AI决策.92
本文详解Stacking集成学习:通过多层协作提升模型性能。第一层用互补小模型(如朴素贝叶斯、SVM、轻量BERT)并行预测;第二层引入大模型作为元模型,融合原始文本与各小模型输出,动态加权、纠错推理,实现“1+1>2”。附完整代码与情感分析实测(准确率从87.3%提升至94.0%)。
202 2
|
6天前
|
人工智能 自然语言处理 测试技术
大模型应用:Skill架构解析:理解大模型Skill的本质、核心组成和本地模型实践.116
本文以极简数字计算Skill为切入点,深入浅出解析大模型Skill本质:模块化、可触发、结构化返回。通过零依赖代码示例,完整呈现Skill四大核心环节——配置声明、参数提取、逻辑执行、结果整合,并延伸至本地Qwen模型实现关键词提取实战,助开发者快速掌握Skill开发范式。
226 2
|
19天前
|
数据采集 机器学习/深度学习 自然语言处理
大模型应用:大模型时代的XGBoost:传统梯度提升树与大模型的协同应用.103
本文详解XGBoost与大模型融合方法:利用大模型提取文本等非结构化数据的语义Embedding,与XGBoost处理的结构化特征拼接建模,兼顾高精度、强可解释性与语义理解能力,显著提升预测性能。
226 2
|
29天前
|
机器学习/深度学习 自然语言处理 算法
大模型应用:从语义理解到最优匹配:大模型赋能的二分图匈牙利算法全解析.93
本文详解“大模型+匈牙利算法(KM)”融合的智能匹配技术:大模型负责语义理解与对齐,将非结构化文本(如岗位描述、简历)转化为0–100分量化权重;KM算法在此基础上求解带权二分图的全局最优匹配。该方案突破人工规则局限,实现精准、自适应、跨场景的智能配对,广泛适用于人岗匹配、题库组卷、客服问答等核心业务。
213 10
|
23天前
|
机器学习/深度学习 人工智能 自然语言处理
大模型应用:TextRank+大模型:轻量化算法与大模型协同的文本摘要实践.99
本文提出“TextRank粗摘+大模型精摘”融合方案:用轻量TextRank快速提取核心句与关键词,再借大模型润色生成流畅、精准、场景适配的摘要。兼顾效率与质量,降低门槛与成本,适合论文、会议、内容等高频场景。
182 3

热门文章

最新文章