
如何使用LangChain打造你的个人健身教练? 原创
许多人满怀热情地走进健身房,相信自己正走在实现健身目标的正确道路上。但由于饮食计划不合理和缺乏方向,健身效果往往不尽如人意。聘请私人教练、添置昂贵的健身器材并非总是切实可行。因此我撰写了这篇博文,介绍如何利用LangChain的强大功能打造你的健身教练。有了它,你现在可以以最低的成本获得根据你的目标定制的锻炼和饮食建议。不妨开始运用这项令人惊叹的技术,将其变成你的健身助手!
为什么使用 Langchain?
Langchain通过将大语言模型(LLM)与工具、数据源和内存相结合,使你在构建高级 AI 应用程序时能够发挥更大的作用。你无需使用纯文本提示调用LLM,而是可以创建智能体来调用函数、查询信息和管理状态对话。就健身教练而言,Langchain 允许你将LLM智能与定制逻辑相结合——比如创建锻炼建议、跟踪进度和获取健康数据,这样你就可以成为一名更智能的互动教练,无需自己费心思考所有事情。
前提条件
要使用LangChain创建你的健身教练,你需要:
- 用于访问语言模型的OpenAI API密钥
- 用于使用互联网搜索的SerpAPI服务密钥
- 对Python 有基本的了解
好了,你现在可以开始了。
如何构建你的健身教练?
在本节中,我将演示如何使用Langchain智能体创建健身教练。确保你已根据前提条件做好了一切准备。我将逐步指导你构建解决方案,并解释每个步骤在实现结果中所起的作用。
FitCoach AI是一种对话式健身教练,它持续收集用户数据,并使用LangChain智能体和OpenAI生成个性化的锻炼和饮食计划。
核心依赖项
要安装构建健身智能体所需的所有库,请在命令行中运行以下命令:
pip install gradio langchain openai serper-dev python-doten
所有依赖项安装到位后,我们将开始导入任务所需的所有相关模块:
import os
import gradio as gr
import traceback
import datetime
from typing import List, Tuple, Optional
from langchain_openai import ChatOpenAI
from langchain.memory import ConversationBufferMemory
from langchain.agents import initialize_agent, AgentType
from langchain.tools import BaseTool
import json
import requests
import dotenv
# Load environment variables
dotenv.load_dotenv()
SerperSearchTool类
功能:提供实时网页搜索功能,获取最新的健身/营养信息。
主要特性:
- 集成Serper API以获取谷歌搜索结果。
- 返回包含标题、摘要和URL的前5个格式化搜索结果。
- 具有可接受的故障模式和超时保护。
- 支持同步和异步。
# ----------- SERPER SEARCH TOOL ------------
class SerperSearchTool(BaseTool):
name: str = "search_web"
description: str = "Searches the web for real-time information and returns structured results"
def _run(self, query: str) -> str:
"""Search the web using Serper API"""
try:
api_key = os.getenv("SERPER_API_KEY")
if not api_key:
return "Error: SERPER_API_KEY not found in environment variables"
url = "https://google.serper.dev/search"
payload = json.dumps({"q": query})
headers = {
'X-API-KEY': api_key,
'Content-Type': 'application/json'
}
response = requests.post(url, headers=headers, data=payload, timeout=10)
response.raise_for_status()
search_results = response.json()
# Extract and format organic results
results = []
if 'organic' in search_results:
for item in search_results['organic'][:5]: # Limit to top 5 results
results.append({
"title": item.get('title', ''),
"link": item.get('link', ''),
"snippet": item.get('snippet', '')
})
# Format results in a readable way
if results:
formatted_results = "Search Results:\n\n"
for i, result in enumerate(results, 1):
formatted_results += f"{i}. {result['title']}\n"
formatted_results += f" {result['snippet']}\n"
formatted_results += f" URL: {result['link']}\n\n"
return formatted_results
else:
return "No search results found."
except requests.exceptions.RequestException as e:
return f"Error performing search - Network issue: {str(e)}"
except Exception as e:
return f"Error performing search: {str(e)}"
async def _arun(self, query: str) -> str:
"""Async version of search"""
return self._run(query)
UserDataTracker 类
功能:在创建任何健身计划之前获取所有必要的信息。
Required Data Fields (in order):
Fitness goal (weight loss, muscle gain, etc.)
Age (in range 10-100 validation)
Gender (male/female/other)
Weight (in units, - kg/lbs)
Height (in cm or feet/inches)
Activity Level (5 predefined levels)
Diet Preferences (vegetarian, vegan, etc.)
Diet Restrictions/allergy
Workout-Preferencing & limitations
主要特性:
- 字段验证:每个输入都将使用自定义验证函数进行验证。
- 顺序流:所有输入均不可跳过。
- 错误处理:为无效输入提供具体的错误消息。
# ----------- USER DATA TRACKER CLASS ------------
class UserDataTracker:
def __init__(self):
self.data = {}
# Define required fields with their validation functions and question prompts
self.required_fields = {
'fitness_goal': {
'question': "What is your primary fitness goal? (e.g., weight loss, muscle gain, general fitness)",
'validate': self._validate_fitness_goal
},
'age': {
'question': "How old are you? (Must be between 10-100)",
'validate': self._validate_age
},
'gender': {
'question': "What is your gender? (male/female/other)",
'validate': self._validate_gender
},
'weight': {
'question': "What is your current weight? (e.g., 150 lbs or 68 kg)",
'validate': self._validate_weight
},
'height': {
'question': "What is your height? (e.g., 5'10\" or 178 cm)",
'validate': self._validate_height
},
'activity_level': {
'question': "What is your activity level? (sedentary, lightly active, moderately active, very active, extremely active)",
'validate': self._validate_activity_level
},
'dietary_preferences': {
'question': "Do you follow any specific diet? (e.g., vegetarian, vegan, keto, none)",
'validate': self._validate_dietary_preferences
},
'dietary_restrictions': {
'question': "Any food allergies or dietary restrictions? (e.g., nuts, dairy, gluten, none)",
'validate': self._validate_dietary_restrictions
},
'workout_preferences': {
'question': "What are your workout preferences? (e.g., gym, home workouts, equipment available, any injuries?)",
'validate': self._validate_workout_preferences
},
}
self.current_step = 0
Langchain智能体配置
智能体初始化:
- 模型:GPT-4o-mini,温度设置为 0.3,以确保一致性。
- 内存:ConversationBufferMemory,用于上下文一致性。
- 工具:互联网搜索,让智能体可以查找实时信息。
initialize_fitcoach_agent函数用于配置FitCoach,这个Langchain对话智能体充当虚拟健身和营养教练。它连接到语言模型GPT-4o-mini,可以辅以互联网搜索工具,并跟踪对话记忆以获取上下文。该智能体遵循严格的基于规则的对话连续性:它会向用户逐个询问特定问题,以提取有关健身目标、年龄、身体指标、饮食习惯和病史等方面的所有重要信息。只有在收集并确认所有必要信息后,智能体才会根据用户情况生成全面的锻炼计划和膳食计划,提供用户所需的安全、准确和个性化的指导。
# ----------- LANGCHAIN AGENT SETUP ------------
def initialize_fitcoach_agent():
"""Initialize the FitCoach agent with error handling"""
try:
# Check for OpenAI API key
openai_key = os.getenv("OPENAI_API_KEY")
if not openai_key:
raise ValueError("OPENAI_API_KEY not found in environment variables")
# Initialize the language model with correct model name
llm = ChatOpenAI(
model="gpt-4o-mini",
temperature=0.3,
openai_api_key=openai_key
)
# Initialize tools
tools = []
try:
if os.getenv("SERPER_API_KEY"):
search_tool = SerperSearchTool()
tools.append(search_tool)
print("✅ Search tool initialized successfully")
else:
print("⚠️ SERPER_API_KEY not found - search functionality will be limited")
except Exception as e:
print(f"⚠️ Could not initialize search tool: {e}")
# Initialize memory
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
Gradio 聊天机器人逻辑
- is_plan_content:通过检查多个关键词(比如星期几、膳食名称和锻炼对比),确定特定的文本是否包含详细的健身或营养计划。这有助于将计划与非正式的健身对话区分开来。
- format_plan_for_text:将原始健身计划文本格式化为更简洁的部分,同时保留标题、列表和段落,以提高可读性,并使其更适合在聊天或电子邮件中分享。
- chat_function:管理FitCoach聊天流程。分步收集用户信息(用户健身目标、膳食偏好),调用 AI智能体来制定个性化锻炼和膳食计划,并安全处理错误以确保聊天流程畅通无阻。
----------- GRADIO CHATBOT LOGIC ------------
def is_plan_content(text: str) -> bool:
"""Check if the text contains a fitness plan with detailed content"""
if not text or len(text.strip()) < 100: # Too short to be a complete plan
return False
# Check for common plan indicators
plan_indicators = [
'workout plan', 'exercise routine', 'training program',
'meal plan', 'nutrition plan', 'diet plan', 'weekly schedule',
'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday',
'sets x reps', 'rest between sets', 'warm up', 'cool down',
'day 1', 'day 2', 'day 3', 'day 4', 'day 5', 'day 6', 'day 7',
'breakfast', 'lunch', 'dinner', 'snacks', 'meals', 'nutrition',
'exercise', 'workout', 'training', 'routine', 'program', 'plan'
]
# Check for multiple indicators to reduce false positives
text_lower = text.lower()
matching_indicators = [ind for ind in plan_indicators if ind in text_lower]
# Require at least 3 matching indicators to consider it a plan
return len(matching_indicators) >= 3
注意:本文仅展示了部分代码。完整代码可在此处获取:
https://colab.research.google.com/drive/1rr2LrPH-XoXxSKO9GLfkhUUoJ33ZVWjx?usp=sharing。
用户界面
说到用户界面,你可以使用Streamlit或Gradio等解决方案来简化操作。我使用了Gradio,因为它允许我创建一个精致的Web应用程序,附有自定义设计、自动更新以及快速响应的界面,非常适合健康和健身应用。点击此处即可查看源代码:https://colab.research.google.com/drive/1rr2LrPH-XoXxSKO9GLfkhUUoJ33ZVWjx?usp=sharing。
Langchain 的用例
- 客户支持机器人:创建一个可以搜索客户支持知识库以查找客户问题答案的助手。
- 搜索辅助聊天机器人:Curse 可以映射到谷歌和维基百科等实时知识来源。
- 文档问答:允许用户上传 PDF文件,并自动检索带有引用的准确答案。
- 数据操作助手:允许用户在电子表格中上传和探索数据,并提出与数据相关的问题。
- 内容生成工具:生成内容,包括博客、电子邮件或社交媒体帖子。
- 多智能体系统:创建AI智能体进行协作或专门处理特定任务的系统。
结论
总而言之,AI 并非仅仅关乎技术,而是关乎如何利用技术的力量来改善我们日常生活的内部运作!无论是为了塑形、健康饮食还是保持干劲,设计专属于你的私人健身教练就是一个典例,表明了AI如何支持和激励我们,同时让我们对自己的行为负责,最终实现目标。最棒的是,你无需成为技术专家即可开始构建应用程序!市面上有许多工具,比如用于开发的LangChain、用于AI功能的OpenAI以及用于部署智能应用程序的Gradio等等,它们可以帮助任何人构建属于自己的智能且独特的应用程序。健身以及生活其他诸多领域的未来都呈现在我们面前!
原文标题:How to Build your Personal Fitness Coach using LangChain?,作者:Soumil Jain
