Spaces:
Sleeping
Sleeping
import os | |
import gradio as gr | |
from together import Together | |
from langchain.prompts import PromptTemplate | |
from langchain.memory import ConversationBufferMemory | |
from langchain.schema import SystemMessage, HumanMessage, AIMessage | |
os.environ["TOGETHER_API_KEY"] = "e9e74dc49951281481f5c7ec603f867f55cfe5ef776a1459289974cbe5a4af11" | |
# مدل LLM برای Chatbot | |
client = Together() | |
# تعریف قالب Prompt | |
prompt_template = """ | |
شما یک دکتر و کارشناس تغذیه به نام دکتر مهرشاد بنت یعقوب هستید و میخواهید برای بیماران خود رژیم غذایی مناسب و شخصیسازیشدهای را طراحی کنید. شما با گرفتن اطلاعات از بیمار، رژیم دقیق و متناسب با وضعیت او را تجویز میکنید. ابتدا تک تک سوالات زیر را از بیمار بپرسید و سپس بر اساس پاسخها، محاسبات رژیم غذایی را انجام دهید. | |
حتما حتما تمام این موارد با توجه به سر فصل از بیمار میپرسی تک به تک و دونه دونه | |
حتما حتما تمام این موارد رو به صورت سوال می کنی و تک به تک هر سوال شامل یکی از موارد باید باشد | |
### **مشخصات فردی**: | |
1. لطفا نام و نام خانوادگی خود را وارد کنید. | |
2. جنسیت شما چیست؟ (مرد/زن) | |
3. سن شما چقدر است؟ | |
4. شغل شما چیست؟ | |
### **مشخصات تن سنجی**: | |
1. وزن شما چقدر است؟ (به کیلوگرم) | |
2. قد شما چقدر است؟ (به سانتیمتر) | |
3. دور کمر شما چقدر است؟ | |
4. دور باسن شما چقدر است؟ | |
### **سوالات مربوط به فعالیت بدنی**: | |
1. میزان فعالیت بدنی شما چگونه است؟ (کم / متوسط / زیاد) | |
2. آیا فعالیت ورزشی دارید؟ (بله / خیر) | |
3. اگر بله، نوع فعالیت ورزشی شما چیست؟ لطفا مدت و زمان فعالیت خود را توضیح دهید. | |
4. آیا تا به حال رژیم غذایی گرفتهاید؟ تحت نظر چه کسی و به مدت چقدر؟ آیا در انجام رژیم موفق بودهاید؟ | |
5. آیا تا به حال از دستگاه کمک لاغری استفاده کردهاید؟ | |
### **بیماریهای زمینهای**: | |
1. آیا مشکلات گوارشی نظیر نفخ، ریفلاکس، یبوست، بیاشتهایی یا پر اشتهایی دارید؟ (بله / خیر) توضیح دهید. | |
2. داروها یا مکملهایی که مصرف میکنید را نام ببرید. | |
3. اگر آلرژی یا تمایلات غذایی خاصی دارید، لطفا توضیح دهید. | |
4. آیا به ماده غذایی خاصی آلرژی یا حساسیت دارید؟ (بله / خیر) | |
5. تنفرات یا عدم تمایلات غذایی خود را توضیح دهید. | |
6. به کدام ماده یا مواد غذایی تمایل زیادی دارید و بیش از اندازه مصرف میکنید؟ | |
### **بررسی الگوی غذای روزانه**: | |
1. مصرف صبحانه شما چگونه است؟ (همیشه / اغلب / گاهی / به ندرت / اصلا) | |
2. معمولا صبحانه چه میخورید؟ چه مقدار؟ | |
3. میان وعدهها چه میخورید؟ چه مقدار؟ | |
4. مصرف نان یا برنج در ناهار شما چقدر است؟ | |
5. مصرف میان وعده عصر شما چگونه است؟ | |
6. آیا شام میل میکنید؟ (بله / خیر) | |
7. آیا وعدهی قبل از خواب میل میکنید؟ (بله / خیر) | |
8. چه زمان از روز بیشتر احساس گرسنگی میکنید؟ | |
### **عادات غذایی**: | |
1. آیا فست فودها و غذاهای سرخکردنی مصرف میکنید؟ (بله / خیر) | |
2. میزان مصرف سبزیجات، لبنیات و میوهها در طول روز شما چقدر است؟ | |
3. آیا به شیرینیجات، شکلات، کیک و بیسکوییت تمایل دارید؟ (بله / خیر) | |
4. میزان ریزهخواری شما چقدر است؟ آیا به غذا ناخنک میزنید؟ | |
--- | |
### **محاسبات رژیم غذایی**: | |
حالا که تمامی اطلاعات از بیمار دریافت شد، لطفا محاسبات زیر را انجام بدهید: | |
1. **محاسبه BMR (Basal Metabolic Rate)**: | |
برای **مردان**: | |
BMR = 88.362 + (13.397 × وزن به کیلوگرم) + (4.799 × قد به سانتیمتر) - (5.677 × سن) | |
برای **زنان**: | |
BMR = 447.593 + (9.247 × وزن به کیلوگرم) + (3.098 × قد به سانتیمتر) - (4.330 × سن) | |
2. **محاسبه TDEE (Total Daily Energy Expenditure)**: | |
برای محاسبه TDEE، BMR را بر اساس سطح فعالیت فرد ضرب کنید: | |
- **کم تحرک**: TDEE = BMR × 1.1 | |
- **فعالیت متوسط**: TDEE = BMR × 1.3 | |
- **فعالیت زیاد**: TDEE = BMR × 1.55 | |
3. **توزیع ماکروها** (کربوهیدراتها، پروتئینها، چربیها): | |
براساس هدف رژیم (کاهش وزن، حفظ وزن، یا افزایش عضله): | |
- **کاهش وزن**: پروتئین: ۲-۲.۵ گرم به ازای هر کیلوگرم وزن بدن، کربوهیدراتها: ۴۰-۴۵% از کالری روزانه، چربیها: ۳۰-۳۵% از کالری روزانه. | |
- **حفظ وزن**: پروتئین: ۱.۵-۲ گرم به ازای هر کیلوگرم وزن بدن، کربوهیدراتها: ۴۵-۵۵% از کالری روزانه، چربیها: ۲۵-۳۰% از کالری روزانه. | |
- **افزایش وزن**: پروتئین: ۲-۲.۵ گرم به ازای هر کیلوگرم وزن بدن، کربوهیدراتها: ۵۰-۶۰% از کالری روزانه، چربیها: ۲۰-۲۵% از کالری روزانه. | |
4. **ایجاد رژیم غذایی روزانه**: | |
براساس محاسبات انجام شده، یک رژیم غذایی دقیق و مناسب به فرد پیشنهاد دهید که شامل وعدههای غذایی، مقدار کالری و تقسیم بندی ماکروها باشد. | |
--- | |
**توضیحات:** | |
در این پرامپت، تمامی سوالات مهم جهت جمعآوری اطلاعات بیمار بهطور دقیق و کامل پرسیده میشود. سپس پس از دریافت پاسخها، محاسبات مورد نیاز برای طراحی رژیم غذایی شخصی انجام میشود. | |
با این روش، میتوانید رژیم غذایی مناسب هر فرد را متناسب با ویژگیها، سطح فعالیت بدنی، و هدفهای شخصی او (کاهش وزن، حفظ وزن، یا افزایش عضله) تنظیم کنید. | |
chat history: | |
{chat_history} | |
""" | |
# ایجاد Prompt | |
prompt = PromptTemplate(template=prompt_template, input_variables=["chat_history"]) | |
# حافظه مکالمه | |
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True) | |
# تابع برای تبدیل تاریخچه مکالمه به رشته | |
def get_chat_history_string(chat_memory): | |
history = "" | |
for msg in chat_memory.messages: | |
if isinstance(msg, HumanMessage): | |
history += f"کارفرما: {msg.content}\n" | |
elif isinstance(msg, AIMessage): | |
history += f"دستیار: {msg.content}\n" | |
return history | |
# تابع اصلی برای مدیریت مکالمه | |
def agent_respond(message): | |
# بهروزرسانی حافظه با پیام کاربر | |
memory.chat_memory.add_user_message(message) | |
# آمادهسازی پیامها برای LLM | |
messages = memory.chat_memory.messages.copy() | |
# اضافه کردن Prompt به عنوان پیام سیستم | |
system_prompt = prompt.format(chat_history=get_chat_history_string(memory.chat_memory)) | |
messages.insert(0, SystemMessage(content=system_prompt)) | |
# ارسال پیام به مدل `Together` و دریافت پاسخ | |
response = client.chat.completions.create( | |
model="meta-llama/Llama-3.3-70B-Instruct-Turbo", | |
messages=[{"role": "system", "content": system_prompt}] + [{"role": "user", "content": message}], | |
max_tokens=500, | |
temperature=0, | |
top_p=0.7, | |
top_k=50, | |
repetition_penalty=1, | |
stop=["<|eot_id|>", "<|eom_id|>"], | |
_gl="1*1kgd2gr*_gcl_au*NzkwMDYxMTc0LjE3MzMzOTYxOTM.", | |
stream=True | |
) | |
# دریافت و نمایش پاسخ مدل | |
response_content = "" | |
for token in response: | |
if hasattr(token, 'choices'): | |
response_content += token.choices[0].delta.content | |
memory.chat_memory.add_ai_message(response_content) | |
return response_content | |
def clear_memory(): | |
memory.chat_memory.clear() | |
return [], "" | |
def save_chat_history(): | |
chat_history = get_chat_history_string(memory.chat_memory) | |
file_path = "/tmp/chat_history.txt" # مسیر موقت برای Hugging Face Spaces | |
with open(file_path, "w", encoding="utf-8") as file: | |
file.write(chat_history) | |
return file_path | |
with gr.Blocks() as demo: | |
chatbot = gr.Chatbot() | |
msg = gr.Textbox(show_label=False, placeholder="پیامتان را وارد کنید...") | |
with gr.Row(): | |
submit_btn = gr.Button("ارسال") | |
clear_btn = gr.Button("🧹 پاک کردن حافظه") | |
download_btn = gr.Button("📥 دانلود تاریخچه چت") | |
download_link = gr.File(label="دانلود فایل تاریخچه چت") # برای نمایش لینک دانلود | |
def fix_bidi_text(text): | |
RLE = '\u202B' # Right-To-Left Embedding | |
PDF = '\u202C' # Pop Directional Formatting | |
return f"{RLE}{text}{PDF}" | |
def respond(message, chat_history): | |
bot_response = agent_respond(message) | |
fixed_message = fix_bidi_text(message) | |
fixed_bot_response = fix_bidi_text(bot_response) | |
chat_history.append((fixed_message, fixed_bot_response)) | |
return chat_history, "" | |
def download_chat_history(): | |
file_path = save_chat_history() | |
return file_path # بازگرداندن مسیر فایل | |
submit_btn.click(respond, [msg, chatbot], [chatbot, msg]) | |
msg.submit(respond, [msg, chatbot], [chatbot, msg]) | |
clear_btn.click(clear_memory, inputs=None, outputs=[chatbot, msg]) | |
download_btn.click(download_chat_history, inputs=None, outputs=download_link) # | |
# اجرای برنامه Gradio | |
if __name__ == "__main__": | |
demo.launch(share=True) | |