AI营养咨询配置:从零搭建可用的对话服务
想在服务器上跑一个能回答营养问题的 AI 对话服务,核心是三件事:准备好运行环境、接上可用的大模型接口、把回答范围限制在营养咨询内。
下面按顺序说明配置过程,命令和路径以常见的 Ubuntu 22.04 环境为例,其他发行版把包管理命令换成对应版本即可。
先确认环境和接口条件
开始之前,需要一台能访问外网的 Linux 服务器,建议至少 2 核 4G 内存。
AI 营养咨询本身不一定要本地跑模型,大多数情况下调用云端大模型 API 更省资源。
你需要准备:
- 一个可用的大模型 API Key,并确认它的调用地址和模型名称
- 服务器能正常访问该 API 域名,可用
curl -I https://api.example.com测试连通性 - 一个域名(可选),用于后续通过 Nginx 对外提供 HTTPS 访问
- 基础的 Linux 命令行操作能力,会使用
apt、systemctl、vim即可
先更新系统并安装常用工具:
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl wget git python3 python3-pip python3-venv nginx
安装完成后用 python3 --version 和 nginx -v 确认版本输出正常,再进行下一步。
创建服务目录和 Python 虚拟环境
不要把服务直接跑在系统 Python 里,用虚拟环境隔离依赖,后续升级和排错都更省事。
sudo mkdir -p /opt/ai-nutrition
sudo chown $USER:$USER /opt/ai-nutrition
cd /opt/ai-nutrition
python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install fastapi uvicorn openai
这里用 FastAPI 提供 HTTP 接口,openai 库用于调用兼容 OpenAI 格式的大模型 API。
如果你的服务商接口格式不同,按它的官方文档替换请求地址和认证方式,不要直接套用示例参数。
编写营养咨询接口和提示词约束
在 /opt/ai-nutrition 下新建 app.py,核心是把用户问题转发给大模型,同时在系统提示词里限定回答范围。
营养咨询涉及健康建议,提示词中要明确要求模型不做疾病诊断、不替代医生,遇到特殊人群建议就医。
import os
from fastapi import FastAPI
from pydantic import BaseModel
from openai import OpenAI
app = FastAPI()
client = OpenAI(
api_key=os.environ["API_KEY"],
base_url=os.environ.get("API_BASE", "https://api.example.com/v1")
)
SYSTEM_PROMPT = """你是一名营养咨询助手,只回答日常饮食搭配、食材选择和一般性营养知识。
不进行疾病诊断,不开具处方,不推荐具体药物。
遇到孕妇、婴幼儿、慢性病患者或明显症状描述时,提示对方咨询医生或注册营养师。
回答控制在 300 字以内,给出可执行的饮食建议。"""
class Question(BaseModel):
text: str
@app.post("/ask")
def ask(q: Question):
resp = client.chat.completions.create(
model=os.environ.get("MODEL_NAME", "your-model"),
messages=[
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": q.text}
],
temperature=0.3
)
return {"answer": resp.choices[0].message.content}
保存后把 API Key 写入环境变量文件,避免硬编码在代码里:
cat > /opt/ai-nutrition/.env <<'EOF'
API_KEY=你的接口密钥
API_BASE=https://你的服务商接口地址/v1
MODEL_NAME=你的模型名称
EOF
chmod 600 /opt/ai-nutrition/.env
启动前先手动加载环境变量测试一次:
cd /opt/ai-nutrition
source venv/bin/activate
export $(grep -v '^#' .env | xargs)
uvicorn app:app --host 127.0.0.1 --port 8000
另开一个终端执行 curl -X POST http:,
//127.0.0.1:
8000/ask -H "Content-Type:
application/json" -d '{"text":
"早餐吃什么比较均衡"}'
能返回一段中文饮食建议就说明接口通了。
用 systemd 托管并配置 Nginx 反向代理
手动启动的进程关闭终端就停了,用 systemd 托管更稳定。
新建 /etc/systemd/system/ai-nutrition.service:
[Unit]
Description=AI Nutrition Service
After=network.target
[Service]
User=www-data
WorkingDirectory=/opt/ai-nutrition
EnvironmentFile=/opt/ai-nutrition/.env
ExecStart=/opt/ai-nutrition/venv/bin/uvicorn app:app --host 127.0.0.1 --port 8000
Restart=always
[Install]
WantedBy=multi-user.target
执行 sudo systemctl daemon-reload && sudo systemctl enable --now ai-nutrition,
再用 sudo systemctl status ai-nutrition 查看是否处于 active 状态。
如果要对公网提供访问,在 Nginx 中加一个反向代理配置,路径为 /etc/nginx/sites-available/ai-nutrition:
server {
listen 80;
server_name 你的域名;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
软链接到 sites-enabled 后执行 sudo nginx -t 检查语法,通过再 sudo systemctl reload nginx。
生产环境建议用 certbot 申请证书启用 HTTPS,避免接口密钥和数据在明文 HTTP 下传输。
容易踩的坑和上线检查
配置过程中最常见的失败集中在三处。
第一是 API 地址写错,base_url 通常以 /v1 结尾,少了或多了路径都会返回 404,先用 curl 单独验证接口地址。
第二是密钥权限问题,systemd 以 www-data 运行,要确保该用户能读取 .env 和项目目录,否则服务启动后请求报认证失败。
第三是提示词约束不够,营养咨询场景下模型容易给出医疗建议,建议在系统提示词里明确边界,并在前端加一句“内容仅供参考,不替代专业诊疗”。
上线前做一次完整验证:curl http://127.0.0.1:8000/ask 返回正常、sudo systemctl status ai-nutrition 显示 active、sudo nginx -t 语法通过、浏览器访问域名能收到回答。
四项都通过,AI营养咨询配置才算真正可用。
后续如果要调整回答风格或增加食材数据库,优先改系统提示词和接口层,不要直接改动 Nginx 配置。