📰 来源:Towards Data Science | 📅 翻译日期:2026年6月9日
🔗 原文:查看原文
🤖 翻译:DeepSeek AI · 仅供参考
引言:权衡的艺术
美国人有一句谚语:“你不能既拥有蛋糕又吃掉它。”这句话充满了诗意,同时也非常实用。它的含义很简单:任何成就都伴随着权衡,因为一切都有代价。
在软件工程和数据科学中,没有所谓的“完美设计”。同一个算法在某些应用中表现优异,在其他场景中却可能一败涂地。
经典权衡:计算 vs 内存
看下面两个例子:
- 案例A:预先计算两个城市之间的距离并存储,运行时直接查询。因为城市不会频繁移动,且数据量可控。
- 案例B:聊天机器人无法记忆所有可能的问题,而是动态计算答案。因为问题空间是动态的。
案例A牺牲内存换取极快的计算速度;案例B花费更多计算时间,但节省了“查询”内存。你无法同时省掉计算和内存——因为“你不能既拥有蛋糕又吃掉它”。
大语言模型(LLM)的困境
LLM是目前最强大的AI模型,但它们体积庞大,通常通过API调用,而API调用 = 令牌 = 成本。
假设你想用智能系统推荐今晚的最佳餐厅。如果让GPT搜索全宇宙所有餐厅,判断是否意大利菜、是否便宜、位置是否好……那将花费数百万令牌,且等结果出来时你可能已经睡着了。
但我们也不愿完全放弃LLM强大的自然语言理解和信息检索能力。关键在于:不能全程使用最智能的部分(这就像既拥有蛋糕又吃掉它)。
本文将提供一种结合LLM的智能推荐系统方案,以餐厅推荐为例。输入是用户对理想餐厅的描述(包含城市),输出是一组推荐餐厅。
1. 系统设计:精度-规模-时间三角
工程学中有一个精度-规模-时间三角:
- 你可以做到高精度+大规模,但慢。
- 你可以做到高精度+快,但无法应对大规模。
- 你可以做到快+大规模,但精度低。
我们希望最终结果精确,因此单独选项3不行。但可以在选项3之上用更精确的模型进行优化。
设计方案如下:
- 快速初筛:使用基于规则的简单搜索,找到最接近的
K个候选餐厅(高召回、低精度)。 - 精细排序:使用慢但智能的LLM,从
K个候选中选择最符合用户需求的餐厅(高精度)。
这样,我们既没有浪费时间和令牌在慢速LLM上,又利用其智能对候选子集进行了优化。
2. 代码实现
2.1 环境配置
我已经为你准备好了幕后工作😃。所有代码采用面向对象风格,包含脚本和流水线。GitHub仓库地址:点击这里,克隆后使用以下导入:
from recommender import RestaurantRecommender
from datagenerator import RestaurantDataGenerator2.2 数据生成
在实际系统中,我们会使用S3中的数据库。本文为完全可复现,生成合成数据。RestaurantDataGenerator类在 datagenerator.py中,它生成约 10,000 家餐厅,分布在8个城市(纽约、旧金山、芝加哥、奥斯汀、西雅图、波士顿、迈阿密、丹佛)。每家餐厅包含:
- 随机生成的名称
- 城市和经纬度(城市中心约
13km范围内采样) - 菜系(意大利、日本、墨西哥、泰国、法国等)
- 饮食偏好(杂食/素食/纯素)
- 平均评分
- 投票数
- 价格范围(
10/100/1000,代表人均消费数量级)
生成数据只需运行一次:
generator = RestaurantDataGenerator()
df = generator.generate()2.3 推荐流水线
核心类 RestaurantRecommender 实现了上述两级流程:
第一阶段:基于规则快速搜索
- 使用用户输入的城市和菜系等结构化条件,从数据集中快速筛选出候选列表。
- 支持按距离、评分等排序。
第二阶段:LLM精细排序
- 将用户自然语言描述(如“浪漫且不太贵的意大利餐厅”)和候选餐厅信息(名称、评分、价格等)组装成提示,调用LLM API(如 GPT-4)。
- LLM返回每个候选的匹配度评分,最终按评分取Top-N。
3. 实验结果
在合成数据集上测试了 K=20 的候选池,LLM排序后推荐准确率提升 42%(相比单纯规则搜索)。平均延迟:
- 第一阶段:
<50ms - 第二阶段:
~2s(LLM API调用)
权衡结果是:仅对 20 个候调用LLM,大大降低了成本,同时大幅提升精度。总结
本文展示了一种实用的推荐系统优化方案:用快速规则搜索缩小候选范围,再用LLM进行精准排序。该方法平衡了精度、规模和速度,适用于预算有限、需要高推荐质量的场景。
评论已关闭