AI酒店推荐配置:零基础搭建个性化推荐服务
想在自己的酒店预订网站或小程序里加入“猜你喜欢”的推荐功能,核心工作是把用户行为数据、酒店特征和推荐算法串起来,并保证接口稳定响应。
这篇教程面向零基础读者,用一台云服务器和开源工具完成一套可运行的AI酒店推荐配置,重点讲清楚每一步做什么、怎么验证、出错怎么查。
先确认你的场景和准备条件
这套配置适合日请求量在十万级以内、希望快速上线推荐模块的中小项目。
你需要准备:
- 一台至少2核4G的云服务器,安装Ubuntu 20.04或22.04,具备公网IP和SSH登录权限。
- 已备案的域名(若对外提供API服务),并解析到服务器IP。
- 基础Python环境,本文使用Python 3.8及以上版本。
- 酒店数据集(CSV或JSON格式),至少包含酒店ID、名称、城市、价格、评分和标签字段。
- 用户行为日志(浏览、收藏、下单),用于生成推荐依据。
如果还没有云服务器,选择时注意带宽和内存要满足推荐服务的内存计算需求,建议系统盘不小于40GB。
部署推荐服务运行环境
登录服务器后,先更新系统并安装基础依赖:
sudo apt update && sudo apt upgrade -y
sudo apt install -y python3-pip python3-venv nginx
创建独立虚拟环境,避免污染系统Python:
python3 -m venv /opt/hotel-rec/venv
source /opt/hotel-rec/venv/bin/activate
pip install --upgrade pip
pip install pandas scikit-learn flask gunicorn
这里使用Flask提供HTTP接口,gunicorn作为生产级WSGI服务器。
安装完成后用pip list确认包已存在。
配置酒店数据与推荐逻辑
把酒店数据文件放到/opt/hotel-rec/data/hotels.csv,字段示例如下:
hotel_id,name,city,price,rating,tags
1001,示例酒店A,北京,450,4.5,商务;近地铁
1002,示例酒店B,上海,680,4.7,亲子;泳池
编写一个简单的基于内容的推荐脚本/opt/hotel-rec/recommend.py,核心逻辑是根据用户历史浏览酒店的城市和标签,计算相似度并返回Top-N结果。
以下为最小可用示例:
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
df = pd.read_csv('/opt/hotel-rec/data/hotels.csv')
df['features'] = df['city'] + ' ' + df['tags'].str.replace(';', ' ')
vectorizer = TfidfVectorizer()
matrix = vectorizer.fit_transform(df['features'])
def recommend(hotel_id, top_n=5):
idx = df.index[df['hotel_id'] == hotel_id].tolist()
if not idx:
return []
sim = cosine_similarity(matrix[idx[0]], matrix).flatten()
related = sim.argsort()[::-1][1:top_n+1]
return df.iloc[related][['hotel_id', 'name', 'city', 'price', 'rating']].to_dict('records')
实际生产环境需要结合用户行为数据训练协同过滤模型,这里仅演示配置流程。
将上述脚本封装为Flask应用/opt/hotel-rec/app.py:
from flask import Flask, request, jsonify
from recommend import recommend
app = Flask(__name__)
@app.route('/api/recommend')
def api_recommend():
hotel_id = request.args.get('hotel_id', type=int)
top_n = request.args.get('top_n', default=5, type=int)
results = recommend(hotel_id, top_n)
return jsonify({'hotel_id': hotel_id, 'recommendations': results})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000)
启动服务并配置Nginx反向代理
用gunicorn启动Flask应用:
cd /opt/hotel-rec
source venv/bin/activate
gunicorn -w 2 -b 127.0.0.1:8000 app:app --daemon
检查进程是否存活:ps aux | grep gunicorn。
接着配置Nginx,将外部请求转发到8000端口。
新建/etc/nginx/sites-available/hotel-rec:
server {
listen 80;
server_name rec.yourdomain.com;
location /api/recommend {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
启用站点并重载Nginx:
sudo ln -s /etc/nginx/sites-available/hotel-rec /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
如果nginx -t报错,根据提示检查括号和分号是否缺失。
验证推荐接口是否正常工作
在服务器或本地用curl测试:
curl "http://rec.yourdomain.com/api/recommend?hotel_id=1001&top_n=3"
预期返回JSON格式的推荐列表。
如果返回502,检查gunicorn是否运行、端口是否被防火墙拦截;
返回404,确认Nginx配置中的location路径与Flask路由一致;
返回500,查看gunicorn日志(默认在启动目录下nohup.out或使用--error-logfile指定)。
建议在浏览器或Postman中多次请求,观察响应时间,若超过1秒,考虑增加gunicorn worker数量或优化数据加载方式。
常见避坑与维护要点
- 数据更新后推荐不生效:修改CSV后需要重启gunicorn,或改为定时加载数据文件。
- 内存不足:数据量大时TfidfVectorizer会占用较多内存,可改用更轻量的相似度计算或分片加载。
- 接口暴露公网无鉴权:生产环境应在Nginx层增加访问限制或API密钥校验,避免被恶意调用。
- 时区与日志:建议在gunicorn启动参数中指定
--access-logfile记录访问日志,方便排查异常请求。 - 备份与回滚:修改配置前备份
/etc/nginx/sites-available/hotel-rec和app.py,出现异常可快速恢复。
关于推荐效果与后续优化
这套配置给出的是可运行的推荐服务骨架,实际推荐准确率取决于数据质量和算法选择。
初期可基于内容相似度快速上线,积累用户行为数据后再逐步引入协同过滤或深度学习模型。
上线前务必用真实酒店ID测试接口,并观察返回结果是否符合业务预期。
如果你在配置过程中遇到端口冲突、依赖安装失败或权限问题,优先检查系统日志和错误输出,大多数问题能通过日志定位。
按照本文步骤完成后,你将拥有一个可通过HTTP调用的酒店推荐接口,后续可根据业务需要调整推荐策略和性能参数。