- 📷 拍即分析 — 拍摄或从相册选择配料表照片,一键上传分析
- 🩺 健康度评分 — 0-100 分 + 优秀/良好/一般/较差四级,红黄绿直观展示
- 🧪 逐个成分解读 — 点击任意配料查看详细说明(别名、E 编码、ADI、作用、适宜/避免人群、参考来源)
⚠️ 风险配料高亮 — 自动列出对身体可能有影响的配料,说明影响并给出消费建议- 🔬 AI + 规则双评分 — 大模型语义判断 + 透明启发式规则交叉校验,评分稳定可解释
- 🌐 中英文双语 — 配料关键词表覆盖中英文别名与 E 编码,国内外食品都能识别
- 🇨🇳 国产模型 — 通义千问 VL 多模态,国内访问稳定,无需翻墙
| 层 | 技术 | 选型理由 |
|---|---|---|
| 移动端 | React Native + Expo (TypeScript) | 一套代码 iOS/Android 双端,开源生态成熟,相机能力原生 |
| 后端 | Python FastAPI | 异步高性能、自动生成 OpenAPI 文档、社区易贡献 |
| AI | 通义千问 VL (qwen-vl-max) + qwen-turbo | 多模态一次完成 OCR+分析,国内可直连 |
| 集成方式 | DashScope OpenAI 兼容端点 | 复用 openai SDK,可低成本切换到其它兼容模型 |
完整的架构原理、数据流图、设计决策详见 📄 docs/ARCHITECTURE.md
┌─────────────────┐ HTTPS ┌──────────────────────┐ ┌─────────────┐
│ React Native │ ──────────────► │ FastAPI │ ───► │ 通义千问 VL │
│ 拍照 → 上传 │ POST /analyze │ AI识别 + 规则评分 │ │ (OCR+分类) │
│ 展示评分/配料 │ ◄────────────── │ 融合 → 结构化返回 │ ◄─── │ JSON 输出 │
└─────────────────┘ AnalysisResp └──────────────────────┘ └─────────────┘
ingredient-lens/
├── backend/ # FastAPI 后端
│ ├── app/
│ │ ├── main.py # 应用入口 (CORS / 异常 / 路由装配)
│ │ ├── api/routes.py # API 路由 (/analyze, /ingredient/{name})
│ │ ├── services/
│ │ │ ├── ai_service.py # 通义千问封装 (VL 识别 + 文本解读)
│ │ │ ├── health_scorer.py # 规则评分器 (透明可调)
│ │ │ └── ingredient_analyzer.py # 编排: AI + 规则 + 校验
│ │ ├── models/schemas.py # Pydantic 数据契约 (前后端共享)
│ │ └── core/config.py # 环境变量配置
│ ├── requirements.txt
│ ├── Dockerfile
│ └── .env.example
├── mobile/ # React Native + Expo 移动端
│ ├── App.tsx # 导航入口
│ ├── src/
│ │ ├── screens/ # Camera / Result / IngredientDetail
│ │ ├── components/ # HealthScore / IngredientCard / WarningList
│ │ ├── services/api.ts # 后端 API 客户端
│ │ ├── types/index.ts # 与后端 schemas 对齐的 TS 类型
│ │ ├── theme/colors.ts # 主题与等级配色
│ │ └── navigation.ts # 路由参数类型
│ ├── app.json
│ └── package.json
├── docs/ARCHITECTURE.md # 架构原理详解
├── CONTRIBUTING.md # 贡献指南
└── CODE_OF_CONDUCT.md # 行为准则
- 通义千问 API Key — 在 DashScope 控制台 申请,新用户有免费额度
- Python 3.10+
- Node.js 18+ + Expo CLI (
npm i -g expo-cli)
cd backend
python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
cp .env.example .env
# 编辑 .env, 填入 DASHSCOPE_API_KEY=sk-xxxxx
uvicorn app.main:app --reload --port 8000启动后访问:
- Swagger 文档: http://localhost:8000/docs
- 健康检查: http://localhost:8000/api/health
cd mobile
npm install
# 配置后端地址 (真机用电脑局域网 IP, 安卓模拟器用 10.0.2.2)
export EXPO_PUBLIC_API_BASE_URL=http://192.168.x.x:8000
npx expo start按提示用 Expo Go App 扫码即可在手机上预览(iOS/Android 均可)。
⚠️ 移动端访问本机后端:iOS 模拟器用localhost,Android 模拟器用10.0.2.2,真机用电脑局域网 IP 且确保同一 WiFi、防火墙放行 8000 端口。
mobile/app.json 引用了 assets/ 下的图标,首次开发可自行添加 icon.png、splash.png、adaptive-icon.png、favicon.png,或用 npx expo customize 生成。不添加也能在 Expo Go 中运行(仅缺少图标)。
| 方法 | 路径 | 说明 |
|---|---|---|
GET |
/api/health |
健康检查 |
POST |
/api/analyze |
上传配料表图片 (multipart file),返回整体分析 |
GET |
/api/ingredient/{name} |
获取单个配料的详细解读 |
请求/响应结构详见 backend/app/models/schemas.py 或启动后的 /docs。
📖 POST /api/analyze 响应示例
{
"product_name": "Cream Filled Biscuit",
"health_score": 39,
"score_level": "poor",
"summary": "含多种添加剂,包括人工色素和甜味剂,整体健康度中等偏低,建议适量食用。",
"ingredients": [
{
"name": "Tartrazine",
"category": "色素",
"safety_level": "avoid",
"brief": "人工合成黄色色素,争议较大。",
"potential_effects": "可能引发儿童多动症或过敏反应。"
}
],
"warnings": [
{
"ingredient_name": "Tartrazine",
"level": "high",
"effect": "可能引发过敏或儿童多动症。",
"suggestion": "敏感人群应避免食用,尤其儿童。"
}
],
"request_id": "4deb8874c83d"
}cd backend
docker build -t ingredient-lens-api .
docker run -p 8000:8000 --env-file .env ingredient-lens-api- 拍照识别 + AI 分析 + 健康度评分
- 风险配料高亮与影响说明
- 单成分深度解读(懒加载)
- AI + 规则双评分融合
- 中英文配料关键词表
- Redis 缓存层(同一配料详情不重复调 AI)
- 扫描历史记录(本地存储)
- 扫描统计与趋势图表
- 配料数据库预置(GB 2760 常见添加剂)
- 国际化(i18n,英文 UI)
- Web 版(Next.js 复用后端 API)
- 单元测试覆盖
有想做的功能?欢迎在 Discussions 讨论。
欢迎提交 Issue 和 PR!详见 📄 CONTRIBUTING.md。
可贡献的方向:
- 扩充
health_scorer.py中的添加剂关键词表 - 优化 prompt 以提升识别准确率
- 增加配料数据库缓存层(Redis)
- 国际化(英文配料表支持)
- 新增产品历史记录、扫描统计等
12siii |
|
遵循 Contributor Covenant 行为准则。
本项目分析结果由 AI 基于公开食品标准(GB 2760、JECFA、EFSA 等)生成,仅供学习参考,不构成医疗或营养建议。如有特定健康问题请咨询专业人士。
MIT © Ingredient Lens Contributors
如果这个项目对你有帮助,欢迎 ⭐ Star 支持一下!