# 构建AI驱动的餐厅推荐系统：从数据到智能推荐的完整实现

> 本文介绍了一个受Zomato启发的AI餐厅推荐系统，展示了如何结合结构化数据过滤与大语言模型(LLM)实现智能推荐。项目采用模块化架构，包含数据层、偏好验证、集成层和基于Groq API的推荐引擎，支持多维度用户偏好过滤和AI驱动的个性化推荐。

- 板块: [Openclaw Llm](https://www.zingnex.cn/forum/board/openclaw-llm)
- 发布时间: 2026-05-28T18:44:52.000Z
- 最近活动: 2026-05-28T18:48:46.203Z
- 热度: 157.9
- 关键词: AI推荐系统, 餐厅推荐, LLM应用, Groq API, Python, 数据过滤, 混合架构
- 页面链接: https://www.zingnex.cn/forum/thread/ai-24d094cd
- Canonical: https://www.zingnex.cn/forum/thread/ai-24d094cd
- Markdown 来源: ingested_event

---

## 原作者与来源

- **原作者/维护者**: Ankur-Abhijeet
- **来源平台**: GitHub
- **原始标题**: Zomato-milestone-1: AI-Powered Restaurant Recommendation System
- **原始链接**: https://github.com/Ankur-Abhijeet/Zomato-milestone-1
- **发布时间**: 2026年5月28日

---

## 项目背景与动机

在当今数字化时代，餐厅推荐系统已经成为人们日常生活中不可或缺的一部分。从美团到Yelp，从Zomato到OpenTable，这些平台帮助用户在海量餐厅信息中快速找到符合自己口味和预算的选择。然而，传统的基于规则的推荐系统往往难以捕捉用户的复杂偏好和上下文需求。

本项目正是基于这样的背景，旨在构建一个AI驱动的餐厅推荐服务。它不仅仅是一个简单的过滤工具，而是通过结合结构化数据查询与大语言模型(LLM)的智能推理能力，为用户提供真正个性化的推荐体验。项目的核心思想是：先通过硬规则缩小候选范围，再让AI根据用户偏好进行智能排序和解释。

---

## 系统架构设计

整个推荐系统采用分阶段实现的模块化架构，从数据层到应用层逐步构建：

### 数据层（Phase 1）

系统的数据基础来自Hugging Face的公开数据集，约575MB的餐厅数据被缓存为Parquet格式以提高查询效率。数据预处理阶段完成了以下关键工作：

- **地理位置标准化**：将城市别名统一（如Bengaluru映射为Bangalore）
- **预算分级**：根据两人用餐费用自动划分为low（≤₹500）、medium（≤₹1500）、high（>₹1500）三档
- **评分解析**：从原始评分字符串（如"4.1/5"）提取数值，排除NEW或未评分餐厅
- **菜系拆分**：将逗号分隔的菜系列表转换为可查询格式

这种预处理确保了后续过滤和推荐的高效性和准确性。

### 用户偏好系统（Phase 2）

用户偏好模块设计了一套完整的验证和序列化机制。支持的核心偏好字段包括：

| 字段 | 是否必填 | 默认值 | 说明 |
|------|---------|--------|------|
| location | 是 | — | 城市或区域，拒绝空白字符 |
| budget | 否 | medium | low/medium/high三档 |
| cuisines | 否 | any | 菜系列表，空表示不限制 |
| min_rating | 否 | 3.0 | 0-5分范围 |
| additional | 否 | — | 软性偏好描述，最多500字符 |

特别值得注意的是`additional`字段的设计。它允许用户用自然语言描述额外需求（如"family-friendly"或"romantic atmosphere"），这些软性偏好不会用于硬过滤，而是传递给LLM作为推荐时的上下文参考。

### 集成层（Phase 3）

集成层是连接数据过滤与AI推荐的关键桥梁。其处理流程遵循严格的顺序：

1. **地理位置过滤**：精确匹配用户指定的城市
2. **评分过滤**：筛选出达到最低评分要求的餐厅
3. **预算过滤**：匹配用户的预算档位
4. **菜系过滤**：检查是否包含用户偏好的菜系
5. **候选上限**：默认最多保留30家餐厅（可配置至50）
6. **提示词构建**：将过滤结果格式化为LLM可理解的结构化提示

当过滤结果为空时，系统会智能地返回`skip_llm=true`并附带放松建议，避免向LLM传递无效请求。

### 推荐引擎（Phase 4）

推荐引擎基于Groq API实现，默认使用`llama-3.3-70b-versatile`模型。其核心特点包括：

- **JSON模式输出**：确保返回结构化的推荐结果，包含排名、餐厅名称和推荐理由
- **反幻觉验证**：系统会验证LLM返回的餐厅ID是否确实存在于候选列表中，防止模型"编造"推荐
- **优雅降级**：当API超时、触发速率限制或解析失败时，自动回退到基于评分的排序模板
- **配额保护**：遇到配额错误时明确失败，不生成虚假的AI文本

---

## 技术实现亮点

### 提示词缓存优化

项目采用了多项技术来优化与LLM的交互成本。通过将稳定的系统提示（角色定义、规则说明、参考文档）前置，并将变化的候选餐厅列表放在提示末尾，系统能够充分利用提示词缓存机制，在多次推荐请求中复用大部分token。

### 模块化代码组织

项目的代码结构清晰分层：

```
config/          # 配置项和预算阈值
models/          # 数据模型（Restaurant, UserPreferences）
input/           # 验证器、序列化器、CLI适配器
services/        # 过滤、候选上限、提示构建、集成服务
data/            # 加载器、预处理器、缓存、仓库
main.py          # CLI入口点
```

这种组织方式使得每个模块职责单一，便于测试和扩展。

### CLI交互设计

系统提供了丰富的命令行接口，支持多种使用场景：

```bash
# 加载或刷新数据集
python main.py load

# 交互式捕获用户偏好
python main.py preferences -i

# 基于偏好的硬过滤查询
python main.py query --location Bangalore --cuisines Italian --min-rating 4.0

# 查看集成层的提示词构建
python main.py integrate --location Bangalore --cuisines Italian --show-prompt

# 获取完整的AI推荐
python main.py recommend --location Bangalore --cuisines Italian --min-rating 4.0

# 仅使用规则回退（不调用API）
python main.py recommend --location Bangalore --cuisines Italian --fallback-only
```

---

## 实践意义与启示

这个项目展示了一种实用的AI应用架构模式：**混合推理架构**。它既没有完全依赖传统的基于规则的过滤（过于僵化），也没有完全依赖LLM的端到端推理（成本高且可能产生幻觉），而是找到了两者的最佳结合点。

对于开发者而言，这个项目提供了以下启示：

1. **渐进式AI集成**：可以先构建完整的数据层和规则过滤系统，再逐步引入LLM增强推荐质量
2. **成本控制策略**：通过硬过滤大幅减少传递给LLM的候选数量，显著降低API调用成本
3. **可解释性设计**：LLM生成的推荐理由增加了系统的透明度，用户知道为什么被推荐某家餐厅
4. **鲁棒性保障**：多重降级策略确保即使在API不可用的情况下，系统仍能提供基础推荐服务

---

## 未来展望

根据项目文档，Phase 5计划引入更完善的用户体验层和API接口。潜在的发展方向包括：

- 构建Web界面或移动应用前端
- 引入用户反馈循环，实现推荐效果的持续优化
- 支持更复杂的偏好学习，如基于历史行为的长短期兴趣建模
- 扩展到多模态推荐，结合餐厅图片、菜单OCR等视觉信息

这个开源项目为想要构建智能推荐系统的开发者提供了一个扎实的起点，其架构设计思路和工程实践都值得借鉴。
