Initial commit
This commit is contained in:
@@ -0,0 +1,438 @@
|
||||
# AI菜谱知识图谱生成器
|
||||
## 基于Kimi大模型的智能菜谱解析系统
|
||||
|
||||
### 🌟 新功能特性
|
||||
|
||||
- **🤖 AI智能解析**: 使用Kimi大模型准确提取菜谱信息
|
||||
- **📊 结构化输出**: 自动生成标准化的知识图谱数据
|
||||
- **🔄 批量处理**: 支持大规模菜谱目录的批量转换
|
||||
- **💾 多格式导出**: 支持Neo4j和CSV两种输出格式
|
||||
- **🎯 高精度**: AI模型确保食材分类、步骤解析的准确性
|
||||
- **📁 智能目录识别**: 自动扫描dishes/目录,根据子目录名推断分类
|
||||
- **⚡ 优化处理**: 减少AI分类工作,提高处理效率和准确性
|
||||
|
||||
### 🚀 快速开始
|
||||
|
||||
#### 1. 安装依赖
|
||||
|
||||
```bash
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
#### 2. 配置API密钥
|
||||
|
||||
方法一:设置环境变量
|
||||
```bash
|
||||
export KIMI_API_KEY="your_api_key_here"
|
||||
```
|
||||
|
||||
方法二:编辑config.json
|
||||
```json
|
||||
{
|
||||
"kimi": {
|
||||
"api_key": "your_api_key_here"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 3. 测试AI解析功能
|
||||
|
||||
```bash
|
||||
python run_ai_agent.py test
|
||||
```
|
||||
|
||||
#### 4. 批量处理菜谱
|
||||
|
||||
```bash
|
||||
# 处理HowToCook项目(会自动扫描dishes/目录)
|
||||
python run_ai_agent.py /path/to/HowToCook-master
|
||||
|
||||
# 处理其他菜谱目录
|
||||
python run_ai_agent.py /path/to/your/recipes
|
||||
```
|
||||
|
||||
### 📁 项目结构
|
||||
|
||||
```
|
||||
cook-rag-example/
|
||||
├── recipe_ai_agent.py # AI解析核心引擎
|
||||
├── run_ai_agent.py # 简化运行脚本
|
||||
├── batch_manager.py # 批次管理工具
|
||||
├── amount_normalizer.py # 用量标准化工具
|
||||
├── config.json # 配置文件
|
||||
├── requirements.txt # 依赖列表
|
||||
└── ai_output/ # AI输出目录
|
||||
├── nodes.csv # Neo4j节点数据
|
||||
├── relationships.csv # Neo4j关系数据
|
||||
└── neo4j_import.cypher # Neo4j导入脚本
|
||||
```
|
||||
|
||||
### 📁 智能目录处理
|
||||
|
||||
#### 自动分类识别
|
||||
|
||||
系统会智能识别HowToCook项目的目录结构:
|
||||
|
||||
- **专门扫描**: 只处理 `dishes/` 目录下的菜谱文件
|
||||
- **自动分类**: 根据子目录名自动推断菜谱分类
|
||||
- **排除无关文件**: 自动跳过 `template/`、`.github/` 等目录
|
||||
|
||||
#### 目录分类映射
|
||||
|
||||
```
|
||||
vegetable_dish/ → 素菜
|
||||
meat_dish/ → 荤菜
|
||||
aquatic/ → 水产
|
||||
breakfast/ → 早餐
|
||||
staple/ → 主食
|
||||
soup/ → 汤类
|
||||
dessert/ → 甜品
|
||||
drink/ → 饮料
|
||||
condiment/ → 调料
|
||||
semi-finished/ → 半成品
|
||||
```
|
||||
|
||||
#### 处理优化
|
||||
|
||||
- **减少AI工作量**: 分类信息直接从目录结构获取,无需AI推理
|
||||
- **提高准确性**: 避免AI分类错误,确保分类一致性
|
||||
- **加快处理速度**: 减少API调用复杂度和处理时间
|
||||
|
||||
### 🤖 AI解析能力
|
||||
|
||||
#### 智能信息提取
|
||||
|
||||
AI系统能够从Markdown菜谱中准确提取:
|
||||
|
||||
1. **基本信息**
|
||||
- 菜谱名称
|
||||
- 难度等级(1-5星)
|
||||
- 菜谱分类(素菜/荤菜/水产等)
|
||||
- 菜系归属(川菜/粤菜等)
|
||||
|
||||
2. **食材信息**
|
||||
- 食材名称和分类
|
||||
- 用量和单位
|
||||
- 主要食材识别
|
||||
|
||||
3. **烹饪步骤**
|
||||
- 步骤描述和顺序
|
||||
- 使用的烹饪方法
|
||||
- 需要的工具
|
||||
- 时间估计
|
||||
|
||||
4. **额外信息**
|
||||
- 准备时间/烹饪时间
|
||||
- 供应人数
|
||||
- 营养信息(当可用时)
|
||||
- 相关标签
|
||||
|
||||
#### 示例:AI解析结果
|
||||
|
||||
输入菜谱:
|
||||
```markdown
|
||||
# 红烧茄子的做法
|
||||
预估烹饪难度:★★★★
|
||||
## 必备原料和工具
|
||||
- 青茄子
|
||||
- 大蒜
|
||||
- 酱油
|
||||
- 面粉
|
||||
```
|
||||
|
||||
AI解析输出:
|
||||
```json
|
||||
{
|
||||
"name": "红烧茄子",
|
||||
"difficulty": 4,
|
||||
"category": "素菜",
|
||||
"ingredients": [
|
||||
{
|
||||
"name": "青茄子",
|
||||
"category": "蔬菜",
|
||||
"is_main": true
|
||||
},
|
||||
{
|
||||
"name": "大蒜",
|
||||
"category": "蔬菜",
|
||||
"is_main": false
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 📊 知识图谱结构
|
||||
|
||||
#### Neo4j数据模型
|
||||
|
||||
**节点类型**:
|
||||
- `Recipe`: 菜谱
|
||||
- `Ingredient`: 食材
|
||||
- `CookingStep`: 烹饪步骤
|
||||
|
||||
**关系类型**:
|
||||
- `has_ingredient`: 菜谱包含食材
|
||||
- `has_step`: 菜谱包含步骤
|
||||
- `belongs_to_category`: 属于分类
|
||||
- `has_difficulty`: 具有难度
|
||||
|
||||
#### 示例查询
|
||||
|
||||
```cypher
|
||||
// 查找所有包含茄子的菜谱
|
||||
MATCH (recipe:Concept)-[:has_ingredient]->(ing:Concept)
|
||||
WHERE ing.name CONTAINS "茄子"
|
||||
RETURN recipe.name, recipe.difficulty
|
||||
|
||||
// 查找四星难度的素菜
|
||||
MATCH (recipe:Concept)-[:belongs_to_category]->(cat:Concept)
|
||||
WHERE cat.name = "素菜" AND recipe.difficulty = 4
|
||||
RETURN recipe.name
|
||||
|
||||
// 推荐基于现有食材的菜谱
|
||||
MATCH (recipe:Concept)-[:has_ingredient]->(ing:Concept)
|
||||
WHERE ing.name IN ["茄子", "大蒜", "酱油"]
|
||||
WITH recipe, count(ing) as matches
|
||||
WHERE matches >= 2
|
||||
RETURN recipe.name, matches
|
||||
ORDER BY matches DESC
|
||||
```
|
||||
|
||||
### ⚙️ 配置选项
|
||||
|
||||
#### config.json详细配置
|
||||
|
||||
```json
|
||||
{
|
||||
"deepseek": {
|
||||
"api_key": "your_api_key",
|
||||
"base_url": "https://api.deepseek.com",
|
||||
"model": "deepseek-chat",
|
||||
"max_retries": 3,
|
||||
"timeout": 30
|
||||
},
|
||||
"processing": {
|
||||
"batch_size": 10,
|
||||
"delay_between_requests": 1,
|
||||
"max_concurrent_requests": 5
|
||||
},
|
||||
"output": {
|
||||
"format": "neo4j",
|
||||
"directory": "./ai_output",
|
||||
"include_nutrition": true,
|
||||
"include_tags": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### �️ 辅助工具
|
||||
|
||||
#### 批次管理工具 (batch_manager.py)
|
||||
|
||||
用于管理分批处理的进度和数据:
|
||||
|
||||
```bash
|
||||
# 查看处理状态
|
||||
python batch_manager.py status
|
||||
|
||||
# 继续中断的处理
|
||||
python batch_manager.py continue /path/to/recipes
|
||||
|
||||
# 合并批次数据
|
||||
python batch_manager.py merge
|
||||
|
||||
# 清理进度文件
|
||||
python batch_manager.py clean-progress
|
||||
|
||||
# 清理批次数据
|
||||
python batch_manager.py clean-batches
|
||||
|
||||
# 显示批次详情
|
||||
python batch_manager.py details
|
||||
```
|
||||
|
||||
#### 用量标准化工具 (amount_normalizer.py)
|
||||
|
||||
提供食材用量的标准化处理:
|
||||
|
||||
```python
|
||||
from amount_normalizer import AmountNormalizer
|
||||
|
||||
normalizer = AmountNormalizer()
|
||||
|
||||
# 标准化用量
|
||||
normalized, estimated = normalizer.normalize_amount("适量", "毫升")
|
||||
# 返回: ("适量", 10.0)
|
||||
|
||||
# 获取可比较的数值
|
||||
comparable = normalizer.get_comparable_value("一把", "")
|
||||
# 返回: 50.0
|
||||
|
||||
# 格式化显示
|
||||
display = normalizer.format_for_display("2-3个", "")
|
||||
# 返回: "2-3个"
|
||||
```
|
||||
|
||||
### �🔧 高级用法
|
||||
|
||||
#### 1. 自定义分类映射
|
||||
|
||||
```python
|
||||
# 在recipe_ai_agent.py中修改
|
||||
category_mapping = {
|
||||
"素菜": "710000000",
|
||||
"荤菜": "720000000",
|
||||
"自定义分类": "999000000"
|
||||
}
|
||||
```
|
||||
|
||||
#### 2. 扩展AI提示词
|
||||
|
||||
```python
|
||||
# 修改extract_recipe_info方法中的prompt
|
||||
prompt = f"""
|
||||
请分析菜谱并按以下格式提取信息:
|
||||
- 添加您的自定义要求
|
||||
- 特殊的分类规则
|
||||
- 额外的营养信息要求
|
||||
"""
|
||||
```
|
||||
|
||||
#### 3. 批量处理优化
|
||||
|
||||
```python
|
||||
# 调整处理参数
|
||||
builder = RecipeKnowledgeGraphBuilder(ai_agent)
|
||||
builder.batch_size = 20 # 增加批次大小
|
||||
builder.delay = 0.5 # 减少请求间隔
|
||||
```
|
||||
|
||||
### 📈 性能优化
|
||||
|
||||
#### API调用优化
|
||||
|
||||
1. **合理的请求频率**: 默认每秒1次请求,避免API限制
|
||||
2. **错误重试机制**: 自动重试失败的请求
|
||||
3. **批量处理**: 分批处理大量菜谱文件
|
||||
|
||||
#### 内存优化
|
||||
|
||||
1. **流式处理**: 逐个处理菜谱文件,避免内存溢出
|
||||
2. **定期清理**: 处理完成后及时释放内存
|
||||
3. **进度监控**: 实时显示处理进度
|
||||
|
||||
### 🔍 故障排除
|
||||
|
||||
#### 常见问题
|
||||
|
||||
1. **API密钥错误**
|
||||
```
|
||||
错误: API调用失败: 401
|
||||
解决: 检查API密钥是否正确设置
|
||||
```
|
||||
|
||||
2. **网络连接问题**
|
||||
```
|
||||
错误: API调用超时
|
||||
解决: 检查网络连接,或增加timeout设置
|
||||
```
|
||||
|
||||
3. **JSON解析错误**
|
||||
```
|
||||
错误: JSON解析错误
|
||||
解决: AI响应格式异常,会自动使用备用解析方法
|
||||
```
|
||||
|
||||
4. **菜谱格式问题**
|
||||
```
|
||||
错误: 无法提取菜谱信息
|
||||
解决: 检查Markdown格式是否符合要求
|
||||
```
|
||||
|
||||
#### 调试模式
|
||||
|
||||
```bash
|
||||
# 启用详细日志
|
||||
export DEBUG=true
|
||||
python run_ai_agent.py /path/to/recipes
|
||||
|
||||
# 测试单个菜谱
|
||||
python run_ai_agent.py test
|
||||
```
|
||||
|
||||
### 📋 使用场景
|
||||
|
||||
#### 1. 菜谱网站构建
|
||||
- 自动分类和标签
|
||||
- 智能推荐系统
|
||||
- 营养分析
|
||||
|
||||
#### 2. 烹饪应用开发
|
||||
- 食材识别
|
||||
- 步骤指导
|
||||
- 工具推荐
|
||||
|
||||
#### 3. 营养研究
|
||||
- 食材营养分析
|
||||
- 膳食搭配研究
|
||||
- 健康饮食推荐
|
||||
|
||||
#### 4. 餐饮业务
|
||||
- 菜单优化
|
||||
- 成本分析
|
||||
- 客户偏好分析
|
||||
|
||||
### 🌐 扩展开发
|
||||
|
||||
#### 添加新的AI模型
|
||||
|
||||
```python
|
||||
class CustomAIAgent(DeepSeekRecipeAgent):
|
||||
def __init__(self, api_key, model_name="custom-model"):
|
||||
super().__init__(api_key)
|
||||
self.model_name = model_name
|
||||
|
||||
def call_custom_api(self, messages):
|
||||
# 实现您的自定义AI调用逻辑
|
||||
pass
|
||||
```
|
||||
|
||||
#### 支持新的输出格式
|
||||
|
||||
```python
|
||||
def export_to_custom_format(self, output_dir):
|
||||
"""导出为自定义格式"""
|
||||
# 实现您的导出逻辑
|
||||
pass
|
||||
```
|
||||
|
||||
### 📊 数据质量保证
|
||||
|
||||
#### AI解析准确性
|
||||
|
||||
- **多轮验证**: AI提取后进行格式验证
|
||||
- **备用解析**: AI失败时使用规则解析
|
||||
- **人工审核**: 提供数据审核接口
|
||||
|
||||
#### 数据一致性
|
||||
|
||||
- **标准化分类**: 统一的食材和菜谱分类
|
||||
- **关系验证**: 确保图谱关系的逻辑一致性
|
||||
- **重复检测**: 自动识别和处理重复数据
|
||||
|
||||
---
|
||||
|
||||
**享受AI驱动的菜谱知识图谱构建体验!** 🎉
|
||||
|
||||
现在你可以安全地进行批量处理了!使用以下命令处理整个HowToCook项目:
|
||||
|
||||
```bash
|
||||
python run_ai_agent.py HowToCook-master
|
||||
```
|
||||
|
||||
系统会:
|
||||
1. 🎯 专门扫描 `HowToCook-master/dishes/` 目录
|
||||
2. 📁 根据子目录自动识别分类 (vegetable_dish→素菜, meat_dish→荤菜等)
|
||||
3. 🚫 自动排除template、.github等非菜谱目录
|
||||
4. 🤖 用AI智能解析每个菜谱的详细信息
|
||||
5. 📊 生成完整的知识图谱数据
|
||||
Reference in New Issue
Block a user