使用大语言模型(LLM)实现推荐系统是一种新兴且强大的方法,尤其适用于需要理解用户意图、上下文语义或生成个性化内容的场景。虽然传统推荐系统主要依赖协同过滤、矩阵分解或深度学习模型(如NeuMF),但LLM可以通过其强大的自然语言理解和生成能力,为推荐任务提供更灵活、可解释和上下文感知的能力。
以下是使用LLM实现推荐系统的几种典型方式及其Python代码示例:
---
### 方法一:基于提示工程(Prompt Engineering)的推荐
利用LLM对用户行为描述进行理解,并根据历史交互生成推荐结果。
```python
import openai
# 示例用户历史行为
user_history = """
用户最近阅读了以下文章:
- 《Python中的装饰器详解》
- 《深入理解异步编程asyncio》
- 《用PyTorch构建神经网络》
请根据用户的兴趣,推荐3个他可能感兴趣的技术主题。
"""
# 使用LLM生成推荐
def recommend_with_prompt(prompt):
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "你是一个智能推荐助手,擅长根据用户行为推荐相关内容。"},
{"role": "user", "content": prompt}
],
max_tokens=150,
temperature=0.7
)
return response.choices[0].message['content'].strip()
# 调用函数
recommendation = recommend_with_prompt(user_history)
print("推荐结果:")
print(recommendation)
```
> **说明**:这种方法适合冷启动、小规模或需要高可解释性的推荐场景。缺点是无法实时训练,依赖外部API。
---
### 方法二:将LLM作为特征提取器 + 传统推荐模型
使用开源LLM(如BERT、Sentence-BERT)将物品(如商品标题、文章内容)编码为向量,再用于相似性匹配或协同过滤。
```python
from sentence_transformers import SentenceTransformer
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
# 加载预训练的句子编码模型
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')
# 物品内容库(例如文章标题)
items = [
"Python中的装饰器详解",
"深入理解异步编程asyncio",
"用PyTorch构建神经网络",
"JavaScript前端开发入门",
"数据库索引优化技巧"
]
# 编码物品为向量
item_embeddings = model.encode(items)
# 用户最近点击的文章
user_clicked = "Python中的装饰器详解"
user_embedding = model.encode([user_clicked])
# 计算余弦相似度
similarity = cosine_similarity(user_embedding, item_embeddings)[0]
top_indices = np.argsort(similarity)[-4:-1] # 取最相似的3个(排除自己)
print("推荐内容:")
for idx in top_indices:
print(f"- {items[idx]} (相似度: {similarity[idx]:.3f})")
```
> **说明**:这是目前工业界较实用的方式,结合了LLM的语义理解能力和传统推荐系统的效率。
---
### 方法三:微调LLM用于序列推荐(SeqRec)
将用户的历史行为序列输入到微调后的LLM中,预测下一个可能感兴趣的项目。
```python
from transformers import AutoTokenizer, AutoModelForCausalLM, Trainer, TrainingArguments
import torch
# 模拟训练数据:用户行为序列
sequences = [
"article: Python装饰器 -> article: asyncio -> article: 协程原理",
"article: PyTorch入门 -> article: CNN图像分类 -> article: 迁移学习",
]
tokenizer = AutoTokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained("gpt2")
tokenizer.pad_token = tokenizer.eos_token
# 编码序列
encodings = tokenizer(sequences, truncation=True, padding=True, return_tensors="pt")
class RecommendationDataset(torch.utils.data.Dataset):
def __init__(self, encodings):
self.encodings = encodings
def __getitem__(self, idx):
return {key: val[idx] for key, val in self.encodings.items()}
def __len__(self):
return len(self.encodings.input_ids)
dataset = RecommendationDataset(encodings)
# 微调设置
training_args = TrainingArguments(
output_dir="./recommendation_model",
per_device_train_batch_size=1,
num_train_epochs=3,
save_steps=10,
logging_dir="./logs",
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=dataset,
)
# trainer.train() # 实际训练需更多数据和资源
print("模型已准备就绪,可用于序列推荐任务。")
```
> **说明**:此方法适合高阶应用,需要大量用户行为日志和计算资源。微调后可实现“下一个项目推荐”功能。
---
### 方法四:混合推荐系统(Hybrid with LLM)
结合协同过滤与LLM语义信息,提升推荐质量。
```python
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sentence_transformers import SentenceTransformer
# 假设已有CF分数(来自用户-物品交互)
cf_scores = np.array([0.8, 0.3, 0.9, 0.2, 0.4]) # 协同过滤打分
# 使用LLM获取语义相关性
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')
user_query = "我喜欢学习Python编程"
items = ["Python教程", "Java教程", "机器学习实战", "网页设计", "数据分析"]
semantic_embs = model.encode(items)
query_emb = model.encode([user_query])
semantic_sim = cosine_similarity(query_emb, semantic_embs)[0]
# 归一化
cf_scores_norm = (cf_scores - cf_scores.min()) / (cf_scores.max() - cf_scores.min() + 1e-8)
semantic_sim_norm = (semantic_sim - semantic_sim.min()) / (semantic_sim.max() - semantic_sim.min() + 1e-8)
# 混合得分
alpha = 0.6 # 权重
hybrid_score = alpha * cf_scores_norm + (1 - alpha) * semantic_sim_norm
# 推荐Top-3
top_k = np.argsort(hybrid_score)[-3:][::-1]
print("混合推荐结果:")
for i in top_k:
print(f"{items[i]} (综合得分: {hybrid_score[i]:.3f})")
```
> **说明**:结合多种信号,提升推荐准确性和鲁棒性。
---
### 总结:LLM在推荐系统中的角色
| 角色 | 描述 |
|------|------|
| 内容理解 | 提取文本语义特征,解决ID-based模型无法处理新内容的问题 |
| 用户意图建模 | 理解用户查询、评论、反馈中的深层需求 |
| 推荐理由生成 | 输出“为什么推荐这个”的自然语言解释 |
| 序列推荐 | 将用户行为视为序列,预测下一动作 |
| 冷启动缓解 | 对新用户/新物品通过内容生成初步推荐 |
---