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

场景实战:用GTE-base-zh构建简易内容推荐系统,Python代码示例 场景实战用GTE-base-zh构建简易内容推荐系统Python代码示例1. 内容推荐系统概述想象你运营着一个内容平台每天都有大量新文章发布。如何让用户快速找到他们感兴趣的内容传统的关键词匹配方法往往效果不佳因为同一概念可能有多种表达方式。这就是文本嵌入技术大显身手的地方。GTE-base-zh是阿里巴巴达摩院训练的中文文本嵌入模型它能将文本转换为高维向量语义相似的文本会有相近的向量表示。基于这一特性我们可以构建一个智能推荐系统不再依赖简单关键词匹配而是真正理解内容含义。2. 环境准备与模型部署2.1 系统要求在开始之前请确保你的环境满足以下条件Linux操作系统推荐Ubuntu 18.04Python 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 推荐系统工作流程我们的简易推荐系统将遵循以下步骤内容向量化将所有待推荐内容通过GTE-base-zh转换为向量用户兴趣建模基于用户历史行为构建兴趣向量相似度计算计算用户兴趣与内容向量的相似度推荐排序按相似度降序返回推荐结果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_urlhttp://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, jsonpayload) 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, jsonpayload) 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)), keylambda i: similarities[i], reverseTrue)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, axis0) # 计算与所有内容的相似度 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)), keylambda i: similarities[i], reverseTrue) 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 recommendations5. 实战演示新闻推荐系统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 性能优化建议批量处理尽量使用batch_get_embeddings批量获取嵌入减少API调用次数缓存机制对已处理的内容缓存其向量避免重复计算异步处理对于大量内容可以考虑异步生成和更新向量6.2 功能扩展方向混合推荐结合协同过滤等传统推荐方法实时兴趣更新根据用户实时行为动态调整兴趣向量多模态推荐结合图片、视频等其他模态的嵌入解释性增强提供推荐理由如因为您对AI感兴趣6.3 实际部署考虑# 生产环境建议添加错误处理和超时设置 class ProductionReadyGTE(GTEBaseZH): def get_embedding(self, text: str, max_retries3, timeout30) - np.ndarray: for attempt in range(max_retries): try: payload { model: gte-base-zh, input: [text] } response requests.post( self.service_url, jsonpayload, timeouttimeout ) 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 应用价值这种基于语义的推荐方法相比传统关键词匹配具有显著优势理解同义表达能识别AI和人工智能的语义等价性捕捉隐含关联发现机器学习与数据分析的潜在联系减少冷启动问题对新内容也能基于语义进行推荐跨领域推荐支持不同领域但语义相关的内容推荐7.3 下一步学习建议尝试将系统扩展到更大规模的数据集探索结合用户行为数据优化推荐效果研究更复杂的兴趣建模方法如注意力机制学习评估推荐系统效果的指标和方法文本嵌入技术为内容推荐开辟了新的可能性希望本教程能帮助你快速上手这一强大工具构建更智能的推荐系统。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。