2026/4/18 13:35:43
网站建设
项目流程
网站开发课程心得,企业模板建站,软件工程专业学什么,搭建网站商城手把手教你用bge-large-zh-v1.5构建新闻推荐系统
在信息爆炸的时代#xff0c;用户每天面对海量新闻内容#xff0c;如何从纷繁复杂的信息中精准推送他们感兴趣的内容#xff0c;成为各大平台的核心竞争力。传统的关键词匹配方式已经难以满足语义层面的理解需求#xff0c…手把手教你用bge-large-zh-v1.5构建新闻推荐系统在信息爆炸的时代用户每天面对海量新闻内容如何从纷繁复杂的信息中精准推送他们感兴趣的内容成为各大平台的核心竞争力。传统的关键词匹配方式已经难以满足语义层面的理解需求而基于深度学习的语义向量模型则提供了全新的解决方案。本文将带你从零开始使用bge-large-zh-v1.5这款高性能中文嵌入模型结合本地部署环境与向量检索技术一步步搭建一个具备语义理解能力的新闻推荐系统。你不需要有复杂的机器学习背景只要跟着步骤操作就能让系统“读懂”新闻之间的深层关联并实现智能推荐。通过本教程你将掌握如何验证并调用已部署的 bge-large-zh-v1.5 模型服务如何为新闻数据生成高质量的语义向量如何构建支持向量检索的索引结构如何基于用户查询进行语义相似度搜索实现个性化推荐整个过程注重实用性和可落地性所有代码均可直接运行适合希望快速上手 AI 推荐系统的开发者和工程师。1. 理解bge-large-zh-v1.5的核心能力1.1 什么是bge-large-zh-v1.5bge-large-zh-v1.5是由 BAAI北京智源人工智能研究院推出的一款专为中文优化的大规模文本嵌入模型。它能够将任意长度不超过 512 个 token 的中文文本转换成一个高维向量维度为 1024这个向量捕捉了原文的深层语义信息。举个例子两句话虽然用词不同但意思相近“浙江提高公积金贷款额度”“丽水市上调住房贷款最高限额”传统方法可能认为这两句话差异很大但bge-large-zh-v1.5能够识别出它们在语义上的高度相似性并生成接近的向量表示。这种能力正是构建智能推荐系统的关键基础。1.2 为什么选择bge-large-zh-v1.5做新闻推荐在推荐系统中我们常常需要回答这样一个问题“哪些新闻和用户当前阅读的内容最相关”这本质上是一个语义匹配问题而不是简单的关键词重合。bge-large-zh-v1.5 在以下几个方面表现出色特别适合用于新闻推荐场景特性对推荐系统的价值高维向量输出1024维更强的语义区分能力能更好地区分细微语义差异支持长文本输入512 tokens可处理完整新闻标题甚至摘要保留更多上下文信息中文语义理解能力强在中文新闻、社交媒体等场景下表现优于通用英文模型开源且广泛验证社区支持良好易于集成到现有系统中更重要的是本文所使用的镜像已经通过sglang完成了模型服务化部署你可以像调用 API 一样轻松获取文本向量无需关心底层推理细节。2. 验证模型服务是否正常运行在开始构建推荐逻辑之前首先要确保bge-large-zh-v1.5模型服务已经成功启动并可以正常调用。2.1 进入工作目录打开终端进入预设的工作空间目录cd /root/workspace该路径下包含了日志文件和服务配置是我们后续操作的基础环境。2.2 查看模型启动日志执行以下命令查看模型服务的日志输出cat sglang.log如果看到类似如下内容说明模型已成功加载并监听在指定端口INFO: Started server process [1] INFO: Uvicorn running on http://0.0.0.0:30000 INFO: Initializing model: bge-large-zh-v1.5 INFO: Model bge-large-zh-v1.5 loaded successfully提示日志中出现Model loaded successfully或类似的初始化完成提示即表示服务就绪。一旦确认服务正常运行就可以进行下一步——编写代码来调用模型生成向量。3. 调用embedding模型生成新闻向量现在我们进入 Jupyter Notebook 环境通过 Python 代码调用本地部署的bge-large-zh-v1.5模型服务测试其基本功能。3.1 初始化客户端连接由于模型是通过 OpenAI 兼容接口暴露的我们可以直接使用openaiPython 包进行调用import openai # 创建客户端指向本地运行的sglang服务 client openai.Client( base_urlhttp://localhost:30000/v1, api_keyEMPTY # 因为没有认证需求使用空密钥即可 )这里的base_urlhttp://localhost:30000/v1指向了本地运行的 sglang 服务端口 30000 是默认设置。3.2 生成单条文本的向量表示接下来我们尝试对一条新闻标题进行编码response client.embeddings.create( modelbge-large-zh-v1.5, input浙江丽水住房公积金贷款最高限额拟提至100万元 ) # 输出结果 print(response.data[0].embedding[:10]) # 打印前10个维度的值作为示例如果你能看到一串浮点数输出例如[0.012, -0.034, 0.056, ..., 0.008]那就说明模型调用成功这个列表就是该新闻标题的 1024 维语义向量。3.3 批量生成多条新闻向量为了支持推荐系统我们需要为每一篇新闻都生成对应的向量。下面是一个批量处理的例子news_titles [ 浙江丽水住房公积金贷款最高限额拟提至100万元, 今年新疆两口岸通行中欧中亚班列已突破4000列, 新疆巴州逾300万亩棉花机械化种植助力棉农节本增效 ] embeddings [] for title in news_titles: response client.embeddings.create( modelbge-large-zh-v1.5, inputtitle ) embeddings.append({ title: title, vector: response.data[0].embedding }) print(f共生成 {len(embeddings)} 条新闻向量)这些向量将成为我们后续进行语义匹配和推荐的核心依据。4. 构建支持语义检索的向量索引仅仅生成向量还不够我们需要一个高效的存储和检索机制。这里我们采用Elasticsearch作为向量数据库利用其强大的全文检索与 KNN 向量搜索能力实现“语义级”新闻查找。4.1 创建原始新闻索引首先在 Elasticsearch 中创建一个用于存储原始新闻数据的索引articlePUT /article { mappings: { properties: { title: { type: text }, brief: { type: text }, author: { type: keyword }, content: { type: text }, readNumber: { type: integer } } } }这个索引保存新闻的基本信息如标题、简介、作者、正文和阅读量。4.2 写入测试新闻数据插入三条来自参考博文的新闻样例POST /article/_doc/001 { title: 浙江丽水住房公积金贷款最高限额拟提至100万元, brief: 【浙江丽水住房公积金贷款最高限额拟提至100万元】财联社3月21日电..., author: 黄宁, content: ..., readNumber: 188 }POST /article/_doc/002 { title: 今年新疆两口岸通行中欧中亚班列已突破4000列, brief: 昨天9日一列满载汽车、机电产品、服装的中欧班列..., author: 央视新闻客户端, content: ..., readNumber: 208 }POST /article/_doc/003 { title: 新疆巴州逾300万亩棉花机械化种植助力棉农节本增效, brief: 2024年新疆巴州棉花的种植面积预计达300万亩以上..., author: 央视新闻客户端, content: ..., readNumber: 308 }4.3 创建带向量字段的目标索引接下来创建一个新的索引article_embeddings用于存储包含向量的新闻数据PUT /article_embeddings { mappings: { properties: { title: { type: text }, brief: { type: text }, author: { type: keyword }, content: { type: text }, readNumber: { type: integer }, text_embedding: { properties: { model_id: { type: keyword }, predicted_value: { type: dense_vector, dims: 1024, index: true, similarity: cosine } } } } } }其中predicted_value字段专门用来存放bge-large-zh-v1.5生成的 1024 维向量similarity: cosine表示我们将使用余弦相似度来衡量语义距离。5. 使用Ingest Pipeline自动完成向量化手动为每条新闻生成向量显然不现实。Elasticsearch 提供了Ingest Pipeline功能可以在数据写入时自动调用预训练模型完成向量化。5.1 注册向量化Pipeline假设你的 Elasticsearch 已经导入了bge-large-zh-v1.5模型可通过 Eland 工具上传可以创建如下 PipelinePUT _ingest/pipeline/article_embeddings_pipeline { description: Article embeddings pipeline using bge-large-zh-v1.5, processors: [ { inference: { model_id: bge-large-zh-v1.5, target_field: text_embedding, field_map: { title: text_field } } } ] }这个 Pipeline 的作用是当文档进入时提取title字段内容传给bge-large-zh-v1.5模型生成的向量存入text_embedding.predicted_value。5.2 执行Reindex任务迁移数据将原始索引中的数据通过 Pipeline 迁移到新索引POST _reindex?wait_for_completionfalse { source: { index: article }, dest: { index: article_embeddings, pipeline: article_embeddings_pipeline } }任务提交后Elasticsearch 会自动为每条新闻生成向量并写入目标索引。5.3 验证向量是否生成成功执行一次查询检查是否有向量字段GET /article_embeddings/_search { _source: [title, text_embedding.predicted_value], size: 1 }你会看到返回结果中包含完整的 1024 维向量数组说明向量化流程已打通。6. 实现语义级别的新闻推荐现在我们的系统已经具备了“理解”新闻语义的能力。接下来就可以根据用户的兴趣或当前浏览内容推荐语义上最相关的新闻。6.1 获取用户查询的语义向量假设用户搜索“中欧班列”我们先将其转化为向量query 中欧班列 response client.embeddings.create(modelbge-large-zh-v1.5, inputquery) query_vector response.data[0].embedding6.2 执行KNN向量相似度搜索使用 Elasticsearch 的 KNN 查询功能在article_embeddings索引中查找最相似的新闻GET /article_embeddings/_search { query: { knn: { field: text_embedding.predicted_value, num_candidates: 10, query_vector: [0.0088, -0.0293, -0.0256, ...] // 填入上面生成的向量 } }, _source: [title, brief, author, readNumber] }注意新版 Elasticsearch 不再支持k参数只需设置num_candidates控制候选数量即可。6.3 推荐结果分析执行上述查询后你会发现标题中含有“中欧班列”、“国际货运”、“一带一路”等相关概念的新闻被优先返回即使它们没有完全相同的关键词。这意味着系统真正做到了“按意义推荐”而非“按字面匹配”。7. 总结打造智能化新闻推荐的第一步通过本文的实践我们完成了从模型调用到语义推荐的全流程搭建验证了bge-large-zh-v1.5模型服务的可用性掌握了如何调用模型生成中文文本向量构建了支持向量检索的 Elasticsearch 索引结构利用 Ingest Pipeline 实现自动化向量化处理实现了基于语义相似度的新闻推荐功能这套方案不仅适用于新闻推荐也可以扩展到内容去重、热点发现、个性化首页、智能问答等多个场景。未来你可以进一步优化的方向包括引入用户行为数据进行协同过滤 语义混合推荐使用更长上下文模型如 bge-m3提升长文本理解能力结合时间衰减因子优先推荐近期相关内容只要你掌握了语义向量这一核心工具就能为任何内容类产品注入“理解语言”的能力。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。