构建一个基于 RAG(Retrieval-Augmented Generation,检索增强生成) 的内容推荐系统,是将传统"信息检索 + 个性化推荐"与大语言模型(LLM)的自然语言理解与生成能力相结合的一种先进方式。它不仅能实现语义级别的精准匹配 ,还能通过自然语言解释推荐理由,提升用户体验和可信度。
下面从 整体流程、核心模块、数据流转 三个维度详细说明:
一、RAG 内容推荐系统的整体流程
推荐 ≠ 固定规则匹配,而是"理解用户意图 → 检索最相关内容 → 生成有解释的推荐"
典型流程如下(7步闭环):
-
用户输入自然语言请求
(如:"我想看一部轻松搞笑的国产电影,适合周末放松。")
-
查询优化(Query Rewriting)
- 使用 LLM 或规则对原始请求进行标准化、关键词扩展
- 输出:更利于检索的结构化/关键词增强查询 例:"类型=喜剧,地区=中国,情绪=轻松,场景=周末休闲"
-
混合检索(Hybrid Retrieval)
- 向量检索:将查询嵌入为向量,在向量数据库中找语义相似的内容(如电影简介、标签、评论)
- 关键词/BM25检索:同时用关键词匹配标题、导演、演员等字段
- 合并结果,得到 Top-K 候选内容(如 10 部电影)
-
重排序与筛选(Reranking & Filtering)
- 使用 Cross-Encoder 或业务规则(如热度、评分、时效性)对候选内容重新打分排序
- 去除重复、低质或不符合上下文的内容
-
构建增强提示(Prompt Augmentation)
将以下信息打包成 LLM 的输入:
- 用户原始问题
- 筛选后的 Top-3~5 推荐内容(含元数据:片名、简介、评分、标签等)
- 系统指令(如:"请用中文推荐1部最匹配的电影,并说明理由,不要编造信息")
-
大模型生成推荐回答
LLM 基于上下文生成自然、连贯、有解释的回答:
"根据您的需求,我推荐《你好,李焕英》。这是一部2021年上映的国产喜剧电影,由贾玲执导,讲述母女温情与幽默交织的故事,豆瓣评分8.1,非常适合周末放松观看。"
-
(可选)反馈与迭代
- 记录用户点击/跳过行为
- 用于优化检索模型、重排序策略或更新知识库
二、核心模块与技术组件
| 模块 | 功能 | 常用工具/技术 |
|---|---|---|
| 知识库构建 | 存储待推荐内容(电影、商品、文章等)及其元数据 | CSV/JSON/PDF → 文本提取(Tika, PyPDF) |
| 文本分块(Chunking) | 将长内容切分为语义单元(如每部电影 = 1 chunk) | 固定长度 / 递归分块 / 按结构分块 |
| 嵌入模型(Embedding) | 将文本转为向量 | text-embedding-ada-002、bge-large-zh、Sentence-BERT |
| 向量数据库 | 存储内容向量,支持快速 ANN 检索 | FAISS、Pinecone、Milvus、Chroma、Qdrant |
| 检索器(Retriever) | 执行混合检索(向量 + 关键词) | LangChain、LlamaIndex、自定义 |
| 重排序模型 | 提升 Top-K 相关性 | Cross-Encoder(如 bge-reranker)、业务规则 |
| 大语言模型(LLM) | 生成自然语言推荐 | GPT-4、Claude、Qwen、Llama3、本地 Ollama 模型 |
| 提示模板(Prompt Template) | 控制生成风格与约束 | Jinja2 模板,含"仅基于以下信息回答"等指令 |
三、数据流转示意图
graph LR
A[用户自然语言请求] --> B(Query Embedding)
B --> C{向量数据库}
C --> D[Top-K 候选内容]
E[关键词/BM25检索] --> D
D --> F[Reranker / 业务过滤]
F --> G[精选3-5条内容]
G --> H[构建 Prompt:
用户问题 + 内容片段 + 指令] H --> I[LLM 生成推荐回答] I --> J[返回给用户] J --> K{用户反馈?} K -- 是 --> L[记录行为日志] L --> M[用于优化检索/排序模型]
用户问题 + 内容片段 + 指令] H --> I[LLM 生成推荐回答] I --> J[返回给用户] J --> K{用户反馈?} K -- 是 --> L[记录行为日志] L --> M[用于优化检索/排序模型]
四、实际案例:电影推荐系统(简化版)
知识库示例(JSON):
json
[
{
"id": "m001",
"title": "你好,李焕英",
"genre": ["喜剧", "剧情"],
"country": "中国",
"year": 2021,
"rating": 8.1,
"summary": "讲述女主角穿越回1981年,与年轻时的母亲成为闺蜜的故事..."
},
{
"id": "m002",
"title": "流浪地球2",
"genre": ["科幻", "灾难"],
"country": "中国",
"year": 2023,
"rating": 8.3,
"summary": "太阳即将毁灭,人类启动'流浪地球'计划..."
}
]
流程执行:
-
用户问:"想看轻松点的国产喜剧"
-
查询嵌入 → 向量检索 → 返回 m001(高相关)
-
构建 Prompt:
你是一个电影推荐助手。请根据以下信息回答: 用户问题:想看轻松点的国产喜剧 可选电影: - 《你好,李焕英》:国产喜剧,2021年,评分8.1,讲述母女温情与幽默... 要求:只推荐1部,说明理由,不编造未提及信息。 -
LLM 输出自然语言推荐
五、优势 vs 传统推荐系统
| 维度 | 传统推荐(协同过滤/内容过滤) | RAG 推荐系统 |
|---|---|---|
| 可解释性 | 弱("因为你看了A,所以推荐B") | 强(自然语言解释) |
| 冷启动 | 新物品难推荐 | 只要有文本描述即可 |
| 语义理解 | 依赖标签/ID | 理解"轻松""感人"等抽象概念 |
| 动态更新 | 需重新训练模型 | 只需更新知识库 |
| 多模态扩展 | 困难 | 可结合图片/视频描述(通过OCR/ASR) |
六、注意事项与优化方向
- 避免幻觉:严格限制 LLM 仅使用检索到的内容
- 延迟控制:向量检索 + 轻量 LLM(如 Qwen-1.8B)可做到 <1s 响应
- 个性化:可在检索前加入用户画像(如"用户偏好科幻")作为查询增强
- 无向量化方案:对于结构化数据(如餐厅、商品),可用 Agentic RAG(见资料 [4]),直接用条件过滤代替向量检索
总结
RAG 内容推荐 = 语义检索 + 可信生成
它把"推荐"从黑盒变成可解释、可验证、可更新的智能服务,特别适合需要透明度、专业性、实时性的场景(如电商、教育、医疗、媒体)。