smartplate 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- smartplate-1.0.0/PKG-INFO +121 -0
- smartplate-1.0.0/README.md +87 -0
- smartplate-1.0.0/pyproject.toml +101 -0
- smartplate-1.0.0/setup.cfg +4 -0
- smartplate-1.0.0/src/smartplate/__init__.py +0 -0
- smartplate-1.0.0/src/smartplate/advice_engine.py +460 -0
- smartplate-1.0.0/src/smartplate/cli.py +354 -0
- smartplate-1.0.0/src/smartplate/experiment.py +364 -0
- smartplate-1.0.0/src/smartplate/llm_planner.py +732 -0
- smartplate-1.0.0/src/smartplate/logging_config.py +45 -0
- smartplate-1.0.0/src/smartplate/main.py +157 -0
- smartplate-1.0.0/src/smartplate/meal_planner.py +543 -0
- smartplate-1.0.0/src/smartplate/nutrition_db.py +618 -0
- smartplate-1.0.0/src/smartplate/reason_engine.py +494 -0
- smartplate-1.0.0/src/smartplate/visual_portion.py +378 -0
- smartplate-1.0.0/src/smartplate.egg-info/PKG-INFO +121 -0
- smartplate-1.0.0/src/smartplate.egg-info/SOURCES.txt +24 -0
- smartplate-1.0.0/src/smartplate.egg-info/dependency_links.txt +1 -0
- smartplate-1.0.0/src/smartplate.egg-info/requires.txt +18 -0
- smartplate-1.0.0/src/smartplate.egg-info/top_level.txt +1 -0
- smartplate-1.0.0/tests/test_advice_engine.py +123 -0
- smartplate-1.0.0/tests/test_logging_config.py +28 -0
- smartplate-1.0.0/tests/test_meal_planner.py +115 -0
- smartplate-1.0.0/tests/test_nutrition_db.py +91 -0
- smartplate-1.0.0/tests/test_reason_engine.py +107 -0
- smartplate-1.0.0/tests/test_visual_portion.py +94 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: smartplate
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Knowledge-constrained LLM framework for intelligent meal planning
|
|
5
|
+
Author-email: Wu Duo <wuduo@buaa.edu.cn>
|
|
6
|
+
License: MIT
|
|
7
|
+
Keywords: meal-planning,nutrition,large-language-models,knowledge-constrained-generation
|
|
8
|
+
Classifier: Development Status :: 4 - Beta
|
|
9
|
+
Classifier: Intended Audience :: Science/Research
|
|
10
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
15
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
16
|
+
Requires-Python: >=3.10
|
|
17
|
+
Description-Content-Type: text/markdown
|
|
18
|
+
Requires-Dist: pandas>=1.3.0
|
|
19
|
+
Requires-Dist: numpy>=1.21.0
|
|
20
|
+
Requires-Dist: requests>=2.25.0
|
|
21
|
+
Requires-Dist: openai>=1.0.0
|
|
22
|
+
Requires-Dist: python-dotenv>=0.19.0
|
|
23
|
+
Requires-Dist: pillow>=9.0.0
|
|
24
|
+
Provides-Extra: vision
|
|
25
|
+
Requires-Dist: ultralytics>=8.0.0; extra == "vision"
|
|
26
|
+
Requires-Dist: opencv-python>=4.5.0; extra == "vision"
|
|
27
|
+
Requires-Dist: transformers>=4.30.0; extra == "vision"
|
|
28
|
+
Requires-Dist: torch>=2.0.0; extra == "vision"
|
|
29
|
+
Provides-Extra: dev
|
|
30
|
+
Requires-Dist: pytest>=6.0.0; extra == "dev"
|
|
31
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
|
|
32
|
+
Requires-Dist: ruff>=0.3.0; extra == "dev"
|
|
33
|
+
Requires-Dist: mypy>=1.8.0; extra == "dev"
|
|
34
|
+
|
|
35
|
+
# SmartPlate - 智能配餐助手
|
|
36
|
+
|
|
37
|
+
## 简介
|
|
38
|
+
SmartPlate 是一个智能配餐系统,根据用户画像(日常健康 / 控糖 / 减脂 / 增肌)和营养学规则,
|
|
39
|
+
结合大语言模型(LLM)知识约束,生成个性化一日食谱和饮食建议。
|
|
40
|
+
|
|
41
|
+
## 核心技术架构
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
用户画像 → DRIs 每日营养目标计算
|
|
45
|
+
→ LLM + 结构化知识注入(营养数据库 + 份量规则 + 画像约束 + 校验层)
|
|
46
|
+
→ 规则引擎兜底(基于本地营养数据库 + 视觉份量系统)
|
|
47
|
+
→ 个性化饮食建议输出
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
- **LLM + 知识约束**:将营养数据库、DRIs、份量指南、画像约束注入 prompt,LLM 在领域知识约束下生成食谱,经校验层验证(食物名称、营养偏差、画像违规)后输出
|
|
51
|
+
- **规则引擎**:基于本地 79 种食物的营养数据库,按画像评分选取食物,结合手部视觉份量系统生成食谱
|
|
52
|
+
- **三级回退**:LLM+知识 → LLM 基线 → 规则引擎,确保离线可用
|
|
53
|
+
|
|
54
|
+
## 核心功能
|
|
55
|
+
|
|
56
|
+
- 多画像支持:日常健康 / 糖尿病血糖控制 / 减脂体重控制 / 增肌力量训练
|
|
57
|
+
- 个性化 DRIs 计算(基于《中国居民膳食营养素参考摄入量 2023 版》)
|
|
58
|
+
- 三种食谱生成模式:LLM+知识约束 / LLM 纯基线 / 规则引擎
|
|
59
|
+
- 食物摄入记录与营养累计
|
|
60
|
+
- 今日剩余饮食建议与下一餐推荐
|
|
61
|
+
- 血糖负荷(GL)分析与控糖提醒
|
|
62
|
+
- 个性化膳食建议(基于《中国居民膳食指南 2022》)
|
|
63
|
+
- LLM 营养解释(可选,需配置 API Key)
|
|
64
|
+
|
|
65
|
+
## 安装与运行
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
pip install -r requirements.txt
|
|
69
|
+
|
|
70
|
+
# 交互式菜单(推荐)
|
|
71
|
+
python -m src.smartplate.main
|
|
72
|
+
|
|
73
|
+
# 快速生成一日食谱(规则引擎,无需 API)
|
|
74
|
+
python -m src.smartplate.main --mode recipe --no-llm
|
|
75
|
+
|
|
76
|
+
# 使用 LLM 生成食谱(需配置 .env 中的 API Key)
|
|
77
|
+
python -m src.smartplate.main --mode recipe --user diabetes
|
|
78
|
+
|
|
79
|
+
# 记录食物摄入
|
|
80
|
+
python -m src.smartplate.main --mode log --foods "米饭,鸡胸肉,西兰花"
|
|
81
|
+
|
|
82
|
+
# 运行对比实验(论文第 4 章数据采集)
|
|
83
|
+
python scripts/run_thesis_experiment.py --trials 10
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## 模块说明
|
|
87
|
+
```
|
|
88
|
+
src/smartplate/
|
|
89
|
+
├── main.py # 主程序入口,命令行参数解析与模式分发
|
|
90
|
+
├── cli.py # 交互式命令行菜单界面
|
|
91
|
+
├── meal_planner.py # 核心配餐引擎(LLM 调度 + 规则引擎兜底 + 食物记录 + 总结)
|
|
92
|
+
├── llm_planner.py # 知识约束型 LLM 配餐引擎(prompt 构建 + 校验 + 纠错)
|
|
93
|
+
├── advice_engine.py # 个性化建议引擎(DRIs 计算 + 营养分析 + GL 计算 + 搭配建议)
|
|
94
|
+
├── nutrition_db.py # 本地营养数据库(79 种食物,含 GI 与微量元素)
|
|
95
|
+
├── visual_portion.py # 视觉份量推荐系统(手掌分量法:拳头/掌心/拇指)
|
|
96
|
+
├── reason_engine.py # 解释引擎(规则 + LLM 文本 + 多模态)
|
|
97
|
+
├── experiment.py # 对比实验框架(论文第 4 章)
|
|
98
|
+
├── logging_config.py # 统一日志系统
|
|
99
|
+
└── __init__.py
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## 用户画像
|
|
103
|
+
|
|
104
|
+
| 画像 | 说明 | 关键约束 |
|
|
105
|
+
|------|------|----------|
|
|
106
|
+
| general | 日常健康饮食 | 均衡营养 |
|
|
107
|
+
| diabetes | 糖尿病/血糖控制 | 每餐碳水≤60g,GI≤55,GL≤40 |
|
|
108
|
+
| weight_loss | 减脂/体重控制 | 热量系数 75%,每餐蛋白≥25g |
|
|
109
|
+
| muscle_gain | 增肌/力量训练 | 热量系数 110%,每餐蛋白≥30g,碳水≥60g |
|
|
110
|
+
|
|
111
|
+
## 环境配置
|
|
112
|
+
|
|
113
|
+
在项目根目录创建 `.env` 文件:
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
LLM_API_KEY=your-api-key
|
|
117
|
+
LLM_API_URL=https://open.bigmodel.cn/api/paas/v4/chat/completions
|
|
118
|
+
LLM_MODEL=glm-4-flash
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
不配置 API Key 时,系统自动使用规则引擎,所有核心功能均可正常使用。
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# SmartPlate - 智能配餐助手
|
|
2
|
+
|
|
3
|
+
## 简介
|
|
4
|
+
SmartPlate 是一个智能配餐系统,根据用户画像(日常健康 / 控糖 / 减脂 / 增肌)和营养学规则,
|
|
5
|
+
结合大语言模型(LLM)知识约束,生成个性化一日食谱和饮食建议。
|
|
6
|
+
|
|
7
|
+
## 核心技术架构
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
用户画像 → DRIs 每日营养目标计算
|
|
11
|
+
→ LLM + 结构化知识注入(营养数据库 + 份量规则 + 画像约束 + 校验层)
|
|
12
|
+
→ 规则引擎兜底(基于本地营养数据库 + 视觉份量系统)
|
|
13
|
+
→ 个性化饮食建议输出
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
- **LLM + 知识约束**:将营养数据库、DRIs、份量指南、画像约束注入 prompt,LLM 在领域知识约束下生成食谱,经校验层验证(食物名称、营养偏差、画像违规)后输出
|
|
17
|
+
- **规则引擎**:基于本地 79 种食物的营养数据库,按画像评分选取食物,结合手部视觉份量系统生成食谱
|
|
18
|
+
- **三级回退**:LLM+知识 → LLM 基线 → 规则引擎,确保离线可用
|
|
19
|
+
|
|
20
|
+
## 核心功能
|
|
21
|
+
|
|
22
|
+
- 多画像支持:日常健康 / 糖尿病血糖控制 / 减脂体重控制 / 增肌力量训练
|
|
23
|
+
- 个性化 DRIs 计算(基于《中国居民膳食营养素参考摄入量 2023 版》)
|
|
24
|
+
- 三种食谱生成模式:LLM+知识约束 / LLM 纯基线 / 规则引擎
|
|
25
|
+
- 食物摄入记录与营养累计
|
|
26
|
+
- 今日剩余饮食建议与下一餐推荐
|
|
27
|
+
- 血糖负荷(GL)分析与控糖提醒
|
|
28
|
+
- 个性化膳食建议(基于《中国居民膳食指南 2022》)
|
|
29
|
+
- LLM 营养解释(可选,需配置 API Key)
|
|
30
|
+
|
|
31
|
+
## 安装与运行
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
pip install -r requirements.txt
|
|
35
|
+
|
|
36
|
+
# 交互式菜单(推荐)
|
|
37
|
+
python -m src.smartplate.main
|
|
38
|
+
|
|
39
|
+
# 快速生成一日食谱(规则引擎,无需 API)
|
|
40
|
+
python -m src.smartplate.main --mode recipe --no-llm
|
|
41
|
+
|
|
42
|
+
# 使用 LLM 生成食谱(需配置 .env 中的 API Key)
|
|
43
|
+
python -m src.smartplate.main --mode recipe --user diabetes
|
|
44
|
+
|
|
45
|
+
# 记录食物摄入
|
|
46
|
+
python -m src.smartplate.main --mode log --foods "米饭,鸡胸肉,西兰花"
|
|
47
|
+
|
|
48
|
+
# 运行对比实验(论文第 4 章数据采集)
|
|
49
|
+
python scripts/run_thesis_experiment.py --trials 10
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## 模块说明
|
|
53
|
+
```
|
|
54
|
+
src/smartplate/
|
|
55
|
+
├── main.py # 主程序入口,命令行参数解析与模式分发
|
|
56
|
+
├── cli.py # 交互式命令行菜单界面
|
|
57
|
+
├── meal_planner.py # 核心配餐引擎(LLM 调度 + 规则引擎兜底 + 食物记录 + 总结)
|
|
58
|
+
├── llm_planner.py # 知识约束型 LLM 配餐引擎(prompt 构建 + 校验 + 纠错)
|
|
59
|
+
├── advice_engine.py # 个性化建议引擎(DRIs 计算 + 营养分析 + GL 计算 + 搭配建议)
|
|
60
|
+
├── nutrition_db.py # 本地营养数据库(79 种食物,含 GI 与微量元素)
|
|
61
|
+
├── visual_portion.py # 视觉份量推荐系统(手掌分量法:拳头/掌心/拇指)
|
|
62
|
+
├── reason_engine.py # 解释引擎(规则 + LLM 文本 + 多模态)
|
|
63
|
+
├── experiment.py # 对比实验框架(论文第 4 章)
|
|
64
|
+
├── logging_config.py # 统一日志系统
|
|
65
|
+
└── __init__.py
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## 用户画像
|
|
69
|
+
|
|
70
|
+
| 画像 | 说明 | 关键约束 |
|
|
71
|
+
|------|------|----------|
|
|
72
|
+
| general | 日常健康饮食 | 均衡营养 |
|
|
73
|
+
| diabetes | 糖尿病/血糖控制 | 每餐碳水≤60g,GI≤55,GL≤40 |
|
|
74
|
+
| weight_loss | 减脂/体重控制 | 热量系数 75%,每餐蛋白≥25g |
|
|
75
|
+
| muscle_gain | 增肌/力量训练 | 热量系数 110%,每餐蛋白≥30g,碳水≥60g |
|
|
76
|
+
|
|
77
|
+
## 环境配置
|
|
78
|
+
|
|
79
|
+
在项目根目录创建 `.env` 文件:
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
LLM_API_KEY=your-api-key
|
|
83
|
+
LLM_API_URL=https://open.bigmodel.cn/api/paas/v4/chat/completions
|
|
84
|
+
LLM_MODEL=glm-4-flash
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
不配置 API Key 时,系统自动使用规则引擎,所有核心功能均可正常使用。
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "smartplate"
|
|
3
|
+
version = "1.0.0"
|
|
4
|
+
description = "Knowledge-constrained LLM framework for intelligent meal planning"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.10"
|
|
7
|
+
license = {text = "MIT"}
|
|
8
|
+
authors = [
|
|
9
|
+
{name = "Wu Duo", email = "wuduo@buaa.edu.cn"}
|
|
10
|
+
]
|
|
11
|
+
keywords = ["meal-planning", "nutrition", "large-language-models", "knowledge-constrained-generation"]
|
|
12
|
+
classifiers = [
|
|
13
|
+
"Development Status :: 4 - Beta",
|
|
14
|
+
"Intended Audience :: Science/Research",
|
|
15
|
+
"License :: OSI Approved :: MIT License",
|
|
16
|
+
"Programming Language :: Python :: 3.10",
|
|
17
|
+
"Programming Language :: Python :: 3.11",
|
|
18
|
+
"Programming Language :: Python :: 3.12",
|
|
19
|
+
"Programming Language :: Python :: 3.13",
|
|
20
|
+
"Topic :: Scientific/Engineering :: Artificial Intelligence",
|
|
21
|
+
]
|
|
22
|
+
|
|
23
|
+
dependencies = [
|
|
24
|
+
"pandas>=1.3.0",
|
|
25
|
+
"numpy>=1.21.0",
|
|
26
|
+
"requests>=2.25.0",
|
|
27
|
+
"openai>=1.0.0",
|
|
28
|
+
"python-dotenv>=0.19.0",
|
|
29
|
+
"pillow>=9.0.0",
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
[project.optional-dependencies]
|
|
33
|
+
vision = [
|
|
34
|
+
"ultralytics>=8.0.0",
|
|
35
|
+
"opencv-python>=4.5.0",
|
|
36
|
+
"transformers>=4.30.0",
|
|
37
|
+
"torch>=2.0.0",
|
|
38
|
+
]
|
|
39
|
+
dev = [
|
|
40
|
+
"pytest>=6.0.0",
|
|
41
|
+
"pytest-cov>=4.0.0",
|
|
42
|
+
"ruff>=0.3.0",
|
|
43
|
+
"mypy>=1.8.0",
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
[build-system]
|
|
47
|
+
requires = ["setuptools>=64.0"]
|
|
48
|
+
build-backend = "setuptools.build_meta"
|
|
49
|
+
|
|
50
|
+
[tool.setuptools.packages.find]
|
|
51
|
+
where = ["src"]
|
|
52
|
+
|
|
53
|
+
[tool.pytest.ini_options]
|
|
54
|
+
testpaths = ["tests"]
|
|
55
|
+
pythonpath = ["src"]
|
|
56
|
+
addopts = "-v --tb=short --strict-markers --color=yes"
|
|
57
|
+
|
|
58
|
+
[tool.coverage.run]
|
|
59
|
+
source = ["src/smartplate"]
|
|
60
|
+
omit = ["tests/*", "src/smartplate/__init__.py"]
|
|
61
|
+
|
|
62
|
+
[tool.coverage.report]
|
|
63
|
+
exclude_also = [
|
|
64
|
+
"def __repr__",
|
|
65
|
+
"def __str__",
|
|
66
|
+
"if __name__ == .__main__.:",
|
|
67
|
+
"raise AssertionError",
|
|
68
|
+
"raise NotImplementedError",
|
|
69
|
+
]
|
|
70
|
+
|
|
71
|
+
[tool.ruff]
|
|
72
|
+
target-version = "py310"
|
|
73
|
+
line-length = 110
|
|
74
|
+
|
|
75
|
+
[tool.ruff.lint]
|
|
76
|
+
select = [
|
|
77
|
+
"E", # pycodestyle errors
|
|
78
|
+
"W", # pycodestyle warnings
|
|
79
|
+
"F", # pyflakes
|
|
80
|
+
"B", # flake8-bugbear
|
|
81
|
+
"I", # isort
|
|
82
|
+
"UP", # pyupgrade
|
|
83
|
+
]
|
|
84
|
+
ignore = [
|
|
85
|
+
"E501", # line too long (handled by formatter)
|
|
86
|
+
"B008", # do not perform function calls in argument defaults
|
|
87
|
+
]
|
|
88
|
+
exclude = [".venv", "__pycache__", ".pytest_cache", "reports"]
|
|
89
|
+
|
|
90
|
+
[tool.ruff.format]
|
|
91
|
+
quote-style = "double"
|
|
92
|
+
indent-style = "space"
|
|
93
|
+
skip-magic-trailing-comma = false
|
|
94
|
+
|
|
95
|
+
[tool.mypy]
|
|
96
|
+
python_version = "3.10"
|
|
97
|
+
warn_return_any = true
|
|
98
|
+
warn_unused_configs = true
|
|
99
|
+
disallow_untyped_defs = false
|
|
100
|
+
ignore_missing_imports = true
|
|
101
|
+
exclude = [".venv", "tests"]
|
|
File without changes
|