许多人满怀热情地走进健身房,相信自己正走在实现健身目标的正确道路上。但由于饮食计划不合理和缺乏方向,健身效果往往不尽如人意。聘请私人教练和昂贵的健身器材并非总是可行。正因如此,我撰写了这篇文章,向您展示如何利用 LangChain 的强大功能打造您的健身教练。有了它,您现在可以以最低的成本获得根据您的目标定制的锻炼和饮食建议。让我们开始运用这项令人惊叹的技术,将其变成您的健身副驾驶吧!
为什么使用Langchain?
Langchain 通过将大型语言模型 (LLM) 与工具、数据源和内存相结合,使您在构建高级 AI 应用程序时能够做更多的事情。您可以创建代理来调用函数、查询信息和管理状态对话,而无需使用纯文本提示符调用 LLM。对于健身教练,Langchain 允许您将 LLM 智能与自定义逻辑相结合——例如,创建锻炼建议、跟踪进度和获取健康数据——这样您就可以成为一名更智能的互动教练,而无需自己弄清楚所有事情。
先决条件
要使用 LangChain 创建您的健身教练,您需要:
- 一个用于访问语言模型的 OpenAI API 密钥
- 一个用于使用网络搜索的 SerpAPI 服务密钥
- Python 基础知识
好了,您现在可以开始了。
如何构建您的健身教练?
在本节中,我将演示如何使用 Langchain 代理创建您的健身教练。请确保您已根据先决条件做好一切准备。我将逐步指导您构建解决方案,并解释每个步骤在实现结果中所起的作用。
FitCoach AI 是一款对话式健身教练,它持续收集用户数据,并使用 OpenAI 的 LangChain 代理生成个性化的锻炼和饮食计划。
核心依赖项
要安装构建健身代理所需的所有库,请在命令行中运行以下命令:
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 获取 Google 搜索结果
- 返回包含标题、摘要和 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/allergyWorkout-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,用于上下文一致性。
- 工具:Web 搜索,用于代理查找实时信息。
initialize_fitcoach_agent
函数用于配置 FitCoach,这是一个 Langchain 对话代理,可充当虚拟健身和营养教练。它连接到语言模型 GPT-4o-mini,可以通过 Web 搜索工具进行增强,并跟踪对话记忆以获取上下文。该代理遵循严格的基于规则的对话连续性:它会逐个向用户询问特定问题,以提取有关健身目标、年龄、身体指标、饮食习惯和病史等所有重要信息。只有在收集并确认所有需要的信息后,代理才会承诺不生成任何健身或饮食计划。通过这种方式,代理可以提供用户所需的安全、准确和个性化的指导。一旦收集到所有必要的信息,FitCoach 就会根据用户生成全面的锻炼计划和膳食计划,同时提供互动且引人入胜的指导计划。
# ----------- 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
注意:我在文章中只展示了部分代码。完整的代码可以在这里找到。
用户界面
说到用户界面,您可以使用 Streamlit 或 Gradio 等解决方案来简化操作。我选择了 Gradio,因为它允许我创建一个精致的 Web 应用,该应用具有自定义设计、自动更新以及快速响应的界面,非常适合健康和健身应用。点击此处查看源代码。
Langchain用例
- 客户支持机器人:创建一个可以搜索客户支持知识库以查找客户问题答案的助手。
- 搜索辅助聊天机器人:Curse 映射到 Google 和维基百科等实时知识来源。
- 文档问答:允许用户上传 PDF 文件并自动检索带有引文的准确答案。
- 数据操作助手:允许用户上传和浏览电子表格中的数据,同时提出与数据相关的问题。
- 内容生成工具:生成内容,包括博客、电子邮件或社交媒体帖子。
- 多智能体系统:创建 AI 智能体可以协作或专门处理任务的系统。
小结
总而言之,人工智能不仅仅是技术;它关乎如何利用技术的力量来改善我们日常生活的内在运作!无论是塑造体形、健康饮食还是保持动力,设计专属于您的私人健身教练都是人工智能如何支持和激励我们,同时又让我们对自己的行为负责,最终实现目标的完美范例。最棒的是,您无需成为技术专家即可开始构建应用程序!市面上有许多工具,例如用于开发的 LangChain、用于 AI 功能的 OpenAI 以及用于部署智能应用程序的 Gradio,等等,它们可以帮助任何人构建专属的智能应用程序。健身的未来,以及生活的其他诸多领域,都已触手可及!
评论留言