AI栄養士を自分で作る:LLM、RAG、そしてパーソナライズされた栄養
この記事では、LLM、関数呼び出し、RAGなどの高度なAI技術を使用してパーソナライズされたAI栄養士を作成するプロセスを読者にガイドします。テクノロジースタック、環境セットアップ、および専門的な栄養関数の実装を詳細に説明し、栄養に関するクエリに答え、BMIを計算し、パーソナライズされた食事アドバイスを提供する機能的なアシスタントを完成させます。
主要ポイント
ユニークな洞察
実用的な応用
主要トピック
重要な洞察
学習成果
• 主要ポイント
• ユニークな洞察
• 実用的な応用
• 主要トピック
1
大規模言語モデル(LLM)
2
AIにおける関数呼び出し
3
検索拡張生成(RAG)
• 重要な洞察
• 学習成果
1
LLMと関数呼び出しを実用的なアプリケーションに統合する方法を理解する。
2
ベクトル埋め込みを使用した栄養知識ベースの構築を学ぶ。
3
健康と栄養のためのパーソナライズされたAIアシスタントの作成に関する洞察を得る。
| 例 | チュートリアル | コードサンプル | ビジュアル |
| 基礎 | 高度なコンテンツ | 実践的なヒント | ベストプラクティス |
“ はじめに:パーソナルAI栄養士の必要性
今日の忙しい環境では、バランスの取れた食事を維持することはますます困難になっています。栄養に関する相反するアドバイスや流行のダイエットは、しばしば人々を混乱させます。24時間年中無休で利用できるAIパーソナル栄養士は、特定の栄養に関する質問に答えたり、栄養ニーズを計算したり、パーソナライズされた推奨事項を提供したりできます。これは、人工知能、特に大規模言語モデル(LLM)と検索技術の進歩により、現在可能になっています。この記事では、GoogleのGemini LLMと専門的な栄養機能、そして実際の栄養データ知識ベースを組み合わせて、独自のAIパーソナル栄養士アシスタントを作成する方法を説明します。このアシスタントは、食品の栄養に関する質問に答えたり、BMIを計算したり、毎日のカロリー必要量を推定したり、基準に基づいて食品を推奨したり、エビデンスに基づいた栄養アドバイスを提供したりできます。
“ テクノロジースタックの理解:LLM、関数呼び出し、RAG
当社のAIパーソナル栄養士アシスタントは、3つの主要技術、すなわちGoogleのGemini 1.5 Proのような大規模言語モデル(LLM)、関数呼び出し、および検索拡張生成(RAG)によって支えられています。LLMは人間のようなテキストを理解し生成することに優れており、栄養に関する自然言語クエリを処理するのに役立ちます。関数呼び出しにより、LLMはBMIやカロリー必要量のような専門的な計算を使用できます。RAGは、栄養データベースから関連情報を検索することにより、アシスタントの応答を事実の栄養データに基づかせます。これらの技術は連携して、ユーザーのクエリを理解し、栄養情報を検索し、正確な計算を処理します。
“ 開発環境のセットアップ
開発環境をセットアップするには、必要なライブラリをインストールし、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)
```
Google AI Studioのウェブサイトから取得した実際のGemini APIキーに`YOUR_API_KEY`を置き換えてください。
“ 栄養知識ベースの構築
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()
```
このデータセットには、3,600以上の食品の詳細な栄養情報が含まれています。このデータを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"Food: {row['name']}, Calories: {row['calories']}, Protein: {row['protein_g']}g, Fat: {row['fat_g']}g, Carbs: {row['carbohydrate_g']}g"
# 一意のIDを持つコレクションに追加
nutrition_collection.add(
documents=[document],
ids=[f"food_{i}"]
)
```
このコードはChromaDBコレクションを作成し、栄養データでそれを埋め込み、意味検索を可能にします。
“ 専門的な栄養関数の作成:BMIとカロリー計算
BMI計算と毎日のカロリー必要量推定という、2つの不可欠な栄養関数を実装します:
```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):
"""ハリス・ベネディクト方程式に基づいて毎日のカロリー必要量を計算します。"""
#基礎代謝量(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 # 非常に激しい運動と肉体労働または1日2回のトレーニング
}
# 総エネルギー消費量(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カロリーの deficit
"weight_gain": round(tdee + 500) # 500カロリーの surplus
}
```
`calculate_bmi`関数はボディマス指数(BMI)の公式を実装し、`calculate_calorie_needs`関数はハリス・ベネディクト方程式を使用します。
“ Geminiとの関数呼び出しの実装
Geminiがこれらの関数を使用するための関数スキーマを定義します:
```python
nutrition_functions = [
{
"name": "calculate_bmi",
"description": "BMI(ボディマス指数)を計算し、体重カテゴリを決定します",
"parameters": {
"type": "object",
"properties": {
"weight_kg": {
"type": "number",
"description": "体重(kg)"
},
"height_cm": {
"type": "number",
"description": "身長(cm)"
}
},
"required": ["weight_kg", "height_cm"]
}
},
{
"name": "calculate_calorie_needs",
"description": "個人の統計に基づいて毎日のカロリー必要量を計算します",
"parameters": {
"type": "object",
"properties": {
"weight_kg": {
"type": "number",
"description": "体重(kg)"
},
"height_cm": {
"type": "number",
"description": "身長(cm)"
},
"age": {
"type": "integer",
"description": "年齢(歳)"
},
"gender": {
"type": "string",
"description": "性別(男性または女性)"
},
"activity_level": {
"type": "string",
"description": "活動レベル(sedentary, light, moderate, active, very_active)"
}
},
"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を計算してもらえますか?体重は70kg、身長は175cmです。",
"私は30歳の男性、体重80kg、身長180cm、中程度の活動レベルですが、毎日のカロリー摂取量はどれくらいですか?",
"筋肉をつけるための高タンパク質の食品は何ですか?",
"減量のための食事プランを提案してもらえますか?"
]
for query in test_queries:
print(f"\nクエリ:{query}")
print("-" * 50)
response = nutrition_assistant(query)
print(response)
print("=" * 80)
```
これらの例は、AIパーソナル栄養士の汎用性を示しており、事実に基づくクエリ、計算の実行、およびパーソナライズされた推奨事項の提供を処理します。
“ 将来の強化と結論
将来の強化には、栄養データベースの拡張、カロリー推定の精度の向上、より複雑な食事要件のサポートの追加、ウェアラブルデバイスとの統合などが含まれます。AIパーソナル栄養士アシスタントは、LLM、関数呼び出し、およびRAGを組み合わせて、パーソナライズされた栄養ガイダンスを提供します。このシステムは、栄養に関する質問に答えたり、BMIやカロリー必要量を計算したり、パーソナライズされた推奨事項を提供したりでき、個人の健康におけるAIの可能性を示しています。
元のリンク: https://www.linkedin.com/pulse/building-your-personal-ai-nutritionist-smart-meal-planner-ahmed-ali-qudjf
コメント(0)