当前位置: 首页 > news >正文

场景实战:用GTE-base-zh构建简易内容推荐系统,Python代码示例

场景实战:用GTE-base-zh构建简易内容推荐系统,Python代码示例

1. 内容推荐系统概述

想象你运营着一个内容平台,每天都有大量新文章发布。如何让用户快速找到他们感兴趣的内容?传统的关键词匹配方法往往效果不佳,因为同一概念可能有多种表达方式。这就是文本嵌入技术大显身手的地方。

GTE-base-zh是阿里巴巴达摩院训练的中文文本嵌入模型,它能将文本转换为高维向量,语义相似的文本会有相近的向量表示。基于这一特性,我们可以构建一个智能推荐系统,不再依赖简单关键词匹配,而是真正理解内容含义。

2. 环境准备与模型部署

2.1 系统要求

在开始之前,请确保你的环境满足以下条件:

  • Linux操作系统(推荐Ubuntu 18.04+)
  • Python 3.8或更高版本
  • 至少4GB可用内存
  • 10GB磁盘空间

2.2 一键部署GTE-base-zh

打开终端,执行以下命令启动服务:

# 启动Xinference服务 xinference-local --host 0.0.0.0 --port 9997 # 在新终端窗口中启动GTE模型服务 python /usr/local/bin/launch_model_server.py

首次运行需要下载模型文件,根据网络情况可能需要5-15分钟。可以通过以下命令检查服务状态:

cat /root/workspace/model_server.log

看到"Model loaded successfully"提示即表示服务已就绪。

3. 构建推荐系统的核心思路

3.1 推荐系统工作流程

我们的简易推荐系统将遵循以下步骤:

  1. 内容向量化:将所有待推荐内容通过GTE-base-zh转换为向量
  2. 用户兴趣建模:基于用户历史行为构建兴趣向量
  3. 相似度计算:计算用户兴趣与内容向量的相似度
  4. 推荐排序:按相似度降序返回推荐结果

3.2 关键技术实现

  • 文本嵌入:使用GTE-base-zh将文本转换为768维向量
  • 相似度计算:采用余弦相似度衡量向量间关系
  • 兴趣聚合:对用户多个兴趣点取平均或加权平均

4. Python实现详解

4.1 基础功能封装

首先,我们封装与GTE-base-zh服务交互的基本功能:

import requests import numpy as np from typing import List class GTEBaseZH: def __init__(self, service_url="http://localhost:9997/v1/embeddings"): self.service_url = service_url def get_embedding(self, text: str) -> np.ndarray: """获取单个文本的嵌入向量""" payload = { "model": "gte-base-zh", "input": [text] } response = requests.post(self.service_url, json=payload) if response.status_code == 200: return np.array(response.json()['data'][0]['embedding']) else: raise Exception(f"获取嵌入失败: {response.status_code}") def batch_get_embeddings(self, texts: List[str]) -> List[np.ndarray]: """批量获取文本嵌入向量""" payload = { "model": "gte-base-zh", "input": texts } response = requests.post(self.service_url, json=payload) if response.status_code == 200: return [np.array(item['embedding']) for item in response.json()['data']] else: raise Exception(f"批量获取嵌入失败: {response.status_code}")

4.2 相似度计算工具

from sklearn.metrics.pairwise import cosine_similarity def calculate_similarity(vec1: np.ndarray, vec2: np.ndarray) -> float: """计算两个向量间的余弦相似度""" return cosine_similarity([vec1], [vec2])[0][0] def find_most_similar(query_vec: np.ndarray, candidate_vecs: List[np.ndarray]) -> List[int]: """找出与查询向量最相似的前K个候选向量索引""" similarities = [calculate_similarity(query_vec, vec) for vec in candidate_vecs] return sorted(range(len(similarities)), key=lambda i: similarities[i], reverse=True)

4.3 推荐系统核心实现

class ContentRecommender: def __init__(self): self.embedder = GTEBaseZH() self.content_embeddings = {} # 存储内容ID到向量的映射 self.content_data = {} # 存储内容ID到元数据的映射 def add_content(self, content_id: str, text: str, metadata: dict = None): """添加待推荐内容""" embedding = self.embedder.get_embedding(text) self.content_embeddings[content_id] = embedding self.content_data[content_id] = metadata or {} def batch_add_contents(self, contents: List[dict]): """批量添加内容""" texts = [item['text'] for item in contents] embeddings = self.embedder.batch_get_embeddings(texts) for item, embedding in zip(contents, embeddings): self.content_embeddings[item['id']] = embedding self.content_data[item['id']] = item.get('metadata', {}) def recommend_for_user(self, user_interests: List[str], top_k: int = 5) -> List[dict]: """ 为用户生成推荐 :param user_interests: 用户兴趣点文本列表 :param top_k: 返回推荐数量 :return: 推荐结果列表,包含内容ID、相似度和元数据 """ # 获取用户兴趣向量 interest_embeddings = [self.embedder.get_embedding(interest) for interest in user_interests] avg_interest = np.mean(interest_embeddings, axis=0) # 计算与所有内容的相似度 content_ids = list(self.content_embeddings.keys()) content_vectors = [self.content_embeddings[cid] for cid in content_ids] similarities = [calculate_similarity(avg_interest, vec) for vec in content_vectors] # 获取Top K推荐 ranked_indices = sorted(range(len(similarities)), key=lambda i: similarities[i], reverse=True) recommendations = [] for i in ranked_indices[:top_k]: recommendations.append({ 'content_id': content_ids[i], 'similarity': float(similarities[i]), 'metadata': self.content_data[content_ids[i]] }) return recommendations

5. 实战演示:新闻推荐系统

5.1 准备示例数据

让我们用一个新闻推荐的例子演示系统使用:

# 初始化推荐器 recommender = ContentRecommender() # 添加新闻内容 news_articles = [ {"id": "news1", "text": "人工智能在医疗诊断领域取得新突破", "metadata": {"category": "科技", "publish_date": "2023-05-15"}}, {"id": "news2", "text": "央行宣布下调存款准备金率0.5个百分点", "metadata": {"category": "财经", "publish_date": "2023-05-10"}}, {"id": "news3", "text": "科学家发现新型超导材料", "metadata": {"category": "科技", "publish_date": "2023-05-12"}}, {"id": "news4", "text": "世界杯足球赛即将开幕", "metadata": {"category": "体育", "publish_date": "2023-05-08"}}, {"id": "news5", "text": "深度学习框架TensorFlow发布新版本", "metadata": {"category": "科技", "publish_date": "2023-05-14"}}, {"id": "news6", "text": "股市大盘指数创年内新高", "metadata": {"category": "财经", "publish_date": "2023-05-09"}}, {"id": "news7", "text": "NBA季后赛进入白热化阶段", "metadata": {"category": "体育", "publish_date": "2023-05-11"}}, {"id": "news8", "text": "自然语言处理技术助力智能客服升级", "metadata": {"category": "科技", "publish_date": "2023-05-13"}} ] recommender.batch_add_contents(news_articles)

5.2 生成个性化推荐

为不同兴趣的用户生成推荐:

# 科技爱好者 tech_lover_interests = ["人工智能", "机器学习", "深度学习"] tech_recommendations = recommender.recommend_for_user(tech_lover_interests) print("科技爱好者推荐:") for item in tech_recommendations: print(f"{item['content_id']}: 相似度 {item['similarity']:.2f}, 标题: {item['metadata'].get('text', '')[:20]}...") # 体育迷 sports_fan_interests = ["足球比赛", "篮球赛事"] sports_recommendations = recommender.recommend_for_user(sports_fan_interests) print("\n体育迷推荐:") for item in sports_recommendations: print(f"{item['content_id']}: 相似度 {item['similarity']:.2f}, 标题: {item['metadata'].get('text', '')[:20]}...")

5.3 推荐结果分析

运行上述代码,你会看到类似以下输出:

科技爱好者推荐: news1: 相似度 0.87, 标题: 人工智能在医疗诊断... news5: 相似度 0.85, 标题: 深度学习框架Tenso... news8: 相似度 0.83, 标题: 自然语言处理技术... news3: 相似度 0.78, 标题: 科学家发现新型超导... news2: 相似度 0.32, 标题: 央行宣布下调存款准... 体育迷推荐: news4: 相似度 0.89, 标题: 世界杯足球赛即将... news7: 相似度 0.86, 标题: NBA季后赛进入白热... news1: 相似度 0.25, 标题: 人工智能在医疗诊断... news3: 相似度 0.22, 标题: 科学家发现新型超导... news5: 相似度 0.21, 标题: 深度学习框架Tenso...

可以看到,系统成功地将科技类内容推荐给科技爱好者,而体育类内容则优先推荐给体育迷,即使他们没有使用完全相同的词汇表达兴趣。

6. 系统优化与扩展

6.1 性能优化建议

  1. 批量处理:尽量使用batch_get_embeddings批量获取嵌入,减少API调用次数
  2. 缓存机制:对已处理的内容缓存其向量,避免重复计算
  3. 异步处理:对于大量内容,可以考虑异步生成和更新向量

6.2 功能扩展方向

  1. 混合推荐:结合协同过滤等传统推荐方法
  2. 实时兴趣更新:根据用户实时行为动态调整兴趣向量
  3. 多模态推荐:结合图片、视频等其他模态的嵌入
  4. 解释性增强:提供推荐理由,如"因为您对AI感兴趣"

6.3 实际部署考虑

# 生产环境建议添加错误处理和超时设置 class ProductionReadyGTE(GTEBaseZH): def get_embedding(self, text: str, max_retries=3, timeout=30) -> np.ndarray: for attempt in range(max_retries): try: payload = { "model": "gte-base-zh", "input": [text] } response = requests.post( self.service_url, json=payload, timeout=timeout ) response.raise_for_status() return np.array(response.json()['data'][0]['embedding']) except Exception as e: if attempt == max_retries - 1: raise time.sleep(1) # 简单的退避策略

7. 总结与展望

7.1 关键收获

通过本教程,我们实现了一个基于GTE-base-zh的简易内容推荐系统,掌握了以下核心技术:

  • 使用GTE-base-zh生成高质量的文本嵌入
  • 利用余弦相似度计算文本语义相似性
  • 构建基于内容向量的推荐系统框架
  • 实现个性化推荐的核心算法

7.2 应用价值

这种基于语义的推荐方法相比传统关键词匹配具有显著优势:

  1. 理解同义表达:能识别"AI"和"人工智能"的语义等价性
  2. 捕捉隐含关联:发现"机器学习"与"数据分析"的潜在联系
  3. 减少冷启动问题:对新内容也能基于语义进行推荐
  4. 跨领域推荐:支持不同领域但语义相关的内容推荐

7.3 下一步学习建议

  1. 尝试将系统扩展到更大规模的数据集
  2. 探索结合用户行为数据优化推荐效果
  3. 研究更复杂的兴趣建模方法,如注意力机制
  4. 学习评估推荐系统效果的指标和方法

文本嵌入技术为内容推荐开辟了新的可能性,希望本教程能帮助你快速上手这一强大工具,构建更智能的推荐系统。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

http://www.jsqmd.com/news/515166/

相关文章:

  • 不止于调试:解锁Jlink RTT打印浮点数功能,让N32G开发效率翻倍
  • LPC1768纯软件模拟ADC:基于RC充放电的GPIO时间测量方案
  • msvcrt.dll文件丢失找不到无法启动问题 免费下载方法分享
  • STM32嵌入式电子钟:RTC校准+Wi-Fi天气+触摸GUI全栈实现
  • 从基础到前沿:推荐系统中的召回与排序算法全解析
  • 全国大学生智能汽车竞赛2026年春季竞赛研讨会胜利召开
  • 手把手教你用USB转TTL调试ECB02蓝牙模块(含AT指令大全)
  • 直接上结论:8个AI论文网站测评!全场景通用,学术写作选对工具事半功倍
  • 3D打印控制的开源工具:从入门到精通
  • Linux内核链表遍历:list_for_each_entry_safe宏的5个实战技巧
  • Holistic Tracking镜像实战:3步完成人体543关键点检测,效果惊艳
  • Pixel Dimension Fissioner保姆级教学:实时HUD状态栏各字段含义详解
  • YOLO12模型在Ubuntu系统上的性能调优实战
  • CCS开发避坑指南:相对路径配置的3个常见错误及解决方法
  • COBRApy:让系统生物学研究者实现代谢网络精准建模的Python工具包
  • 圣女司幼幽-造相Z-Turbo提示词工程:‘斜握长剑于身侧’等空间关系精准描述技巧
  • 告别物理翻车!深度调参指南:UE5 ChaosVehicles载具运动与手感优化全解析
  • ATmega硬件定时器中断库:高精度多任务调度方案
  • AX-Mini底层驱动解析:STM32F4电机控制与编码器闭环实现
  • 轻量级多模态模型实战:mPLUG-Owl3-2B在农业病虫害识别APP中的嵌入方案
  • VCNL4200传感器驱动开发:I²C寄存器控制与中断实战
  • EcomGPT电商智能助手保姆级教程:电商培训讲师如何用AI生成课程案例题库
  • Lingbot-Depth-Pretrain-ViTL-14 3D视觉实战:SolidWorks模型深度图生成教程
  • 如何高效使用BilibiliDown实现B站视频批量下载与管理
  • RFbee V1.1无线节点:Arduino兼容+CC1101射频深度解析
  • 游戏开发新思路:PP-DocLayoutV3辅助Unity引擎解析游戏设计文档
  • YOLO12模型在C++环境下的高效调用与优化
  • 实时手机检测-通用快速部署:start.sh脚本原理与service.pid管理
  • Cogito-V1-Preview-Llama-3B实战:微信小程序开发问题智能排查助手
  • 嵌入式INI配置管理器:零堆内存、回调驱动的轻量解析方案