【AI大模型学习路线】第二阶段之RAG基础与架构------第十一章(【项目实战】基于RAG的新闻推荐)推荐中的召回与精排 ?
【AI大模型学习路线】第二阶段之RAG基础与架构------第十一章(【项目实战】基于RAG的新闻推荐)推荐中的召回与精排 ?
文章目录
- [【AI大模型学习路线】第二阶段之RAG基础与架构------第十一章(【项目实战】基于RAG的新闻推荐)推荐中的召回与精排 ?](#【AI大模型学习路线】第二阶段之RAG基础与架构——第十一章(【项目实战】基于RAG的新闻推荐)推荐中的召回与精排 ?)
- 前言
-
- 一、召回(Retrieval)阶段
-
- [1.1 向量检索](#1.1 向量检索)
- [1.2 混合检索策略](#1.2 混合检索策略)
- [1.3 多阶段召回](#1.3 多阶段召回)
- 二、精排(Re-ranking)阶段
-
- [2.1 Cross-Encoder 精排](#2.1 Cross-Encoder 精排)
- [2.2 LLM 驱动重排](#2.2 LLM 驱动重排)
- [2.3 多信号融合与在线学习](#2.3 多信号融合与在线学习)
- [三、Python 核心示例](#三、Python 核心示例)
欢迎宝子们点赞、关注、收藏!欢迎宝子们批评指正!
祝所有的硕博生都能遇到好的导师!好的审稿人!好的同门!顺利毕业!
大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文。详细信息可关注VX "
学术会议小灵通
"或参考学术信息专栏:https://fighting.blog.csdn.net/article/details/147526990
前言
- 基于 RAG 的新闻推荐系统通过"召回(Retrieval)"与"精排(Re-ranking)"两步实现高效且精准的内容推荐,先利用向量检索及混合检索策略从海量新闻中快速召回候选,再借助 Cross-Encoder 或大模型生成评分、融合多信号,对候选进行细粒度排序,从而显著提升推荐相关性与可解释性。
一、召回(Retrieval)阶段
1.1 向量检索
- 系统首先将用户画像或查询文本编码为高维向量,然后在向量数据库(如 FAISS)中执行近邻搜索,快速返回 Top-K 最相关的新闻片段。
1.2 混合检索策略
- 为了同时兼顾语义匹配与时效性,通常采用向量检索与关键词检索(如 BM25 或 ElasticSearch)并行,然后对结果集进行并集或交集操作,以满足主题过滤和时间窗口约束。
1.3 多阶段召回
- 在大规模新闻库中常用双编码器(Bi-encoder)模型进行第一阶段粗排,缩小候选集规模,再进入精排环节,以兼顾检索效率与召回率。
二、精排(Re-ranking)阶段
2.1 Cross-Encoder 精排
- Cross-Encoder 将查询与候选文档拼接后输入同一 Transformer,深度建模二者间的注意力交互,并输出更精确的匹配分数,在 Top-K(< 20) 文档上效果显著优于双编码器。
2.2 LLM 驱动重排
- 利用 GPT-4、LLaMA 等大模型对候选文档进行打分或生成排序理由,并根据生成置信度重排列表,兼顾多样性与可解释性,适用于需要自然语言解释的新闻推荐场景。
2.3 多信号融合与在线学习
- 精排时可将初始检索分、Cross-Encoder 分数、LLM 生成置信度,以及业务特征(如 CTR 预估、源站点权威度)加权融合,并结合用户点击等在线反馈,动态调整权重,实现闭环优化。
三、Python 核心示例
csharp
from langchain.embeddings import SentenceTransformerEmbedding
from langchain.vectorstores import FAISS
from langchain.llms import OpenAI
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
# 1. 初始化检索(召回)
embedder = SentenceTransformerEmbedding(model_name="all-MiniLM-L6-v2")
news_docs = ["地震快讯 A ...", "空气质量报告 B ...", "..."]
vectors = embedder.embed_documents(news_docs)
faiss_index = FAISS.from_embeddings(vectors, news_docs)
# 2. 粗排召回 Top-K
query = "关注近三日地震与AOD异常新闻"
retriever = faiss_index.as_retriever(search_kwargs={"k": 10})
candidates = retriever.get_relevant_documents(query)
# 3. 精排重排(LLM 驱动)
llm = OpenAI(model="gpt-4", temperature=0.0)
template = PromptTemplate(
input_variables=["query", "doc"],
template=(
"请基于用户意图"{query}",为以下新闻片段"{doc}"打分(1-10),并简要说明评分原因:"
)
)
chain = LLMChain(llm=llm, prompt=template)
scored = []
for doc in candidates:
output = chain.run({"query": query, "doc": doc.page_content})
score = float(output.split("\n")[0].strip()) # 假设第一行为分数
scored.append((doc.page_content, score))
# 4. 融合排序与输出
final = sorted(scored, key=lambda x: x[1], reverse=True)[:5]
for idx, (doc, score) in enumerate(final, 1):
print(f"{idx}. (Score: {score}) {doc[:100]}...")
- 以上流程展示了如何在 RAG 新闻推荐中,通过 FAISS 向量召回结合 LLM 重排,实现"召回+精排"协同,既保证了检索效率,又提升了排序精准度,为用户提供更相关且可解释的推荐结果。