构建您自己的AI营养师:LLM、RAG与个性化营养 本文指导读者通过使用LLMs、函数调用和RAG等先进AI技术来创建个性化AI营养师。文章详细介绍了技术栈、环境设置以及专业营养函数的实现,最终构建了一个能够回答营养问题、计算BMI并提供个性化饮食建议的功能性助手。
• 主要观点 1
关于构建AI营养助手的一份全面指南
2
集成先进AI技术以提供个性化营养建议
3
具有实际应用和示例的实践实现
• 独特见解 • 实际应用 • 关键主题 1
大型语言模型(LLMs)
2
AI中的函数调用
3
检索增强生成(RAG)
• 核心洞察 1
AI在个人健康管理中的实际应用
2
用于准确计算的营养函数的详细实现
3
创新性地使用AI技术增强用户与营养数据的交互
• 学习成果 1
了解如何将LLMs与函数调用集成以实现实际应用。
2
学习使用向量嵌入构建营养知识库。
3
深入了解如何创建用于健康和营养的个性化AI助手。
示例
教程
代码示例
可视化内容
基础知识
高级内容
实用技巧
最佳实践
“ 引言:对个性化AI营养师的需求在当今快节奏的生活中,保持均衡饮食变得越来越困难。相互矛盾的营养建议和流行饮食常常让人们感到困惑。一个全天候可用的AI个性化营养师,可以回答具体的营养问题,计算营养需求,并提供个性化建议。随着人工智能的进步,特别是大型语言模型(LLMs)和检索技术的进步,这现在已经成为可能。本文将指导您创建一个自己的AI个性化营养师助手,结合Google的Gemini LLM与专业的营养功能和一个真实的营养数据知识库。该助手可以回答有关食物营养的问题,计算BMI,估算每日卡路里需求,根据标准推荐食物,并提供循证营养建议。
“ 理解技术栈:LLMs、函数调用和RAG我们的AI个性化营养师助手由三项关键技术驱动:大型语言模型(LLMs),如Google的Gemini 1.5 Pro,函数调用(Function Calling),以及检索增强生成(Retrieval-Augmented Generation,RAG)。LLMs能够理解和生成类似人类的文本,在处理关于营养的自然语言查询方面表现出色。函数调用允许LLM使用专门的计算,如BMI或卡路里需求。RAG将助手的响应 grounding(基于)在事实营养数据上,从营养数据库中检索相关信息。这些技术协同工作,以理解用户查询,检索营养事实,并处理精确计算。
“ 设置您的开发环境要设置开发环境,请安装必要的库并配置API访问。使用以下命令:
```bash
!pip install -U -q "google-genai==1.7.0"
!pip install chromadb
```
这些命令安装了Google Generative AI Python SDK和用于向量数据库的ChromaDB。接下来,设置对Google Gemini API的访问:
```python
import google.generativeai as genai
import os
# 设置API密钥
GOOGLE_API_KEY = "YOUR_API_KEY" # 替换为您的实际API密钥
genai.configure(api_key=GOOGLE_API_KEY)
```
将`YOUR_API_KEY`替换为来自Google AI Studio网站的实际Gemini API密钥。
“ 构建营养知识库通过使用pandas加载全面的营养事实数据集来构建营养知识库:
```python
import pandas as pd
import numpy as np
# 加载营养数据
nutrition_data = pd.read_csv('/kaggle/input/nutrition-facts-for-3636-foods/nutrition_facts.csv')
nutrition_data.head()
```
该数据集包含超过3600种食物的详细营养信息。使用ChromaDB将这些数据转换为向量嵌入:
```python
# 为营养数据创建嵌入
from chromadb.utils import embedding_functions
import chromadb
# 初始化ChromaDB客户端
chroma_client = chromadb.Client()
# 创建一个营养数据集合
nutrition_collection = chroma_client.create_collection(
name="nutrition_facts",
embedding_function=embedding_functions.DefaultEmbeddingFunction()
)
# 准备用于嵌入的数据
for i, row in nutrition_data.iterrows():
# 创建一个包含营养信息的文档
document = f"食物:{row['name']},卡路里:{row['calories']},蛋白质:{row['protein_g']}克,脂肪:{row['fat_g']}克,碳水化合物:{row['carbohydrate_g']}克"
# 添加到具有唯一ID的集合中
nutrition_collection.add(
documents=[document],
ids=[f"food_{i}"]
)
```
此代码创建一个ChromaDB集合并用营养数据填充它,从而实现语义搜索。
“ 创建专业的营养函数:BMI和卡路里计算实现两个重要的营养函数:BMI计算和每日卡路里需求估算:
```python
def calculate_bmi(weight_kg, height_cm):
"""根据体重(kg)和身高(cm)计算BMI。"""
height_m = height_cm / 100
bmi = weight_kg / (height_m * height_m)
# 确定BMI类别
if bmi < 18.5:
category = "体重过轻"
elif bmi < 25:
category = "正常体重"
elif bmi < 30:
category = "超重"
else:
category = "肥胖"
return {
"bmi": round(bmi, 1),
"category": category
}
def calculate_calorie_needs(weight_kg, height_cm, age, gender, activity_level):
"""根据Harris-Benedict方程计算每日卡路里需求。"""
# 基础代谢率(BMR)
if gender.lower() == "male":
bmr = 88.362 + (13.397 * weight_kg) + (4.799 * height_cm) - (5.677 * age)
else: # female
bmr = 447.593 + (9.247 * weight_kg) + (3.098 * height_cm) - (4.330 * age)
# 活动倍数
activity_multipliers = {
"sedentary": 1.2, # 很少或没有运动
"light": 1.375, # 每周轻度运动1-3天
"moderate": 1.55, # 每周中度运动3-5天
"active": 1.725, # 每周剧烈运动6-7天
"very_active": 1.9 # 非常剧烈的运动和体力劳动或每天训练两次
}
# 计算总每日能量消耗(TDEE)
multiplier = activity_multipliers.get(activity_level.lower(), 1.2)
tdee = bmr * multiplier
return {
"bmr": round(bmr),
"daily_calories": round(tdee),
"weight_loss": round(tdee - 500), # 减少500卡路里
"weight_gain": round(tdee + 500) # 增加500卡路里
}
```
`calculate_bmi`函数实现了身体质量指数公式,`calculate_calorie_needs`函数使用了Harris-Benedict方程。
“ 使用Gemini实现函数调用定义Gemini使用的函数模式来调用这些函数:
```python
nutrition_functions = [
{
"name": "calculate_bmi",
"description": "计算BMI(身体质量指数)并确定体重类别",
"parameters": {
"type": "object",
"properties": {
"weight_kg": {
"type": "number",
"description": "体重(公斤)"
},
"height_cm": {
"type": "number",
"description": "身高(厘米)"
}
},
"required": ["weight_kg", "height_cm"]
}
},
{
"name": "calculate_calorie_needs",
"description": "根据个人统计数据计算每日卡路里需求",
"parameters": {
"type": "object",
"properties": {
"weight_kg": {
"type": "number",
"description": "体重(公斤)"
},
"height_cm": {
"type": "number",
"description": "身高(厘米)"
},
"age": {
"type": "integer",
"description": "年龄(岁)"
},
"gender": {
"type": "string",
"description": "性别(男或女)"
},
"activity_level": {
"type": "string",
"description": "活动水平(久坐,轻度,中度,活跃,非常活跃)"
}
},
"required": ["weight_kg", "height_cm", "age", "gender", "activity_level"]
}
}
]
```
这些模式定义了每个函数的名称、描述和参数,允许LLM确定何时以及如何使用它们。
“ 构建用于准确营养数据的RAG系统检索增强生成(RAG)组件确保关于营养事实的响应都基于数据库。从营养数据库中检索相关条目,并将其作为上下文提供给LLM:
```python
def nutrition_assistant(query):
"""使用RAG和函数调用处理与营养相关的查询。"""
# 步骤1:使用RAG检索相关的营养信息
results = nutrition_collection.query(
query_texts=[query],
n_results=5
)
# 格式化检索到的信息
context = "\n".join(results["documents"][0])
```
此代码使用ChromaDB的查询函数查找用户查询最相关的5个条目。
“ 整合所有组件:营养助手函数将所有组件组合到主助手函数中:
```python
def nutrition_assistant(query):
"""使用RAG和函数调用处理与营养相关的查询。"""
# 步骤1:使用RAG检索相关的营养信息
results = nutrition_collection.query(
query_texts=[query],
n_results=5
)
# 格式化检索到的信息
context = "\n".join(results["documents"][0])
# 步骤2:设置带有函数调用的模型
model = genai.GenerativeModel(
model_name="gemini-1.5-pro",
generation_config={"temperature": 0.2}
)
# 步骤3:创建带有上下文和查询的提示
prompt = f"""您是一位乐于助人的营养助手。请使用以下营养信息来帮助回答查询。
营养信息:
{context}
用户查询:{query}
如果用户询问BMI或卡路里计算,请使用适当的函数。
对于其他营养问题,请根据上下文和您的知识提供有用的建议。
"""
# 步骤4:生成带有潜在函数调用的响应
response = model.generate_content(
prompt,
tools=nutrition_functions
)
# 步骤5:处理函数调用(如果存在)
if hasattr(response, 'candidates') and len(response.candidates) > 0:
candidate = response.candidates[0]
if hasattr(candidate, 'content') and hasattr(candidate.content, 'parts'):
for part in candidate.content.parts:
if hasattr(part, 'function_call'):
function_call = part.function_call
function_name = function_call.name
function_args = function_call.args
# 执行适当的函数
if function_name == "calculate_bmi":
result = calculate_bmi(
function_args["weight_kg"],
function_args["height_cm"]
)
elif function_name == "calculate_calorie_needs":
result = calculate_calorie_needs(
function_args["weight_kg"],
function_args["height_cm"],
function_args["age"],
function_args["gender"],
function_args["activity_level"]
)
# 生成带有函数结果的新响应
final_prompt = f"""您是一位乐于助人的营养助手。用户询问:"{query}"
您调用了函数 {function_name},该函数返回了以下结果:
{result}
请提供一个有用、对话式的响应,解释这些结果并给出适当的营养建议。
如果相关,请根据营养信息提供具体的食物推荐。
"""
final_response = model.generate_content(final_prompt)
return final_response.text
# 如果没有进行函数调用,则返回原始响应
return response.text
```
此函数检索营养信息,设置Gemini模型,创建提示,生成响应,并处理函数调用(如果需要)。
“ 使用真实查询进行测试使用真实的查询测试AI个性化营养师:
```python
test_queries = [
"一个苹果的营养价值是什么?",
"你能帮我计算BMI吗?我体重70公斤,身高175厘米。",
"我应该吃多少卡路里?我是一名30岁的男性,体重80公斤,身高180厘米,中度活跃。",
"有哪些高蛋白食物适合增肌?",
"你能为减肥建议一个饮食计划吗?"
]
for query in test_queries:
print(f"\n查询:{query}")
print("-" * 50)
response = nutrition_assistant(query)
print(response)
print("=" * 80)
```
这些示例展示了AI个性化营养师的多功能性,能够处理事实查询,执行计算,并提供个性化建议。
“ 未来增强和结论潜在的增强功能包括扩展营养数据库,提高卡路里估算的准确性,增加对更复杂饮食需求的支持,以及与可穿戴设备集成。AI个性化营养师助手结合了LLMs、函数调用和RAG,提供个性化的营养指导。该系统可以回答营养问题,计算BMI和卡路里需求,并提供个性化建议,展示了AI在个人健康领域的潜力。
原始链接:https://www.linkedin.com/pulse/building-your-personal-ai-nutritionist-smart-meal-planner-ahmed-ali-qudjf
评论(0)