AiToolGo的标志

构建您自己的AI营养师:LLM、RAG与个性化营养

深入讨论
技术性,但易于理解
 0
 0
 1
本文指导读者通过使用LLMs、函数调用和RAG等先进AI技术来创建个性化AI营养师。文章详细介绍了技术栈、环境设置以及专业营养函数的实现,最终构建了一个能够回答营养问题、计算BMI并提供个性化饮食建议的功能性助手。
  • 主要观点
  • 独特见解
  • 实际应用
  • 关键主题
  • 核心洞察
  • 学习成果
  • 主要观点

    • 1
      关于构建AI营养助手的一份全面指南
    • 2
      集成先进AI技术以提供个性化营养建议
    • 3
      具有实际应用和示例的实践实现
  • 独特见解

    • 1
      结合LLMs、函数调用和RAG,提高营养指导的准确性
    • 2
      演示如何使用向量嵌入创建可搜索的营养知识库
  • 实际应用

    • 本文提供了构建功能性AI营养师的分步方法,使营养科学对用户来说更易于理解和个性化。
  • 关键主题

    • 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)

user's avatar

      相关工具