File size: 10,842 Bytes
c3b86b9
 
 
 
 
 
2fce8d6
8479604
c3b86b9
 
 
 
 
 
5895065
 
 
c3b86b9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d338173
43ca981
d338173
c3b86b9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7f6aa65
f1a461d
 
7f6aa65
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c3b86b9
4ccaf3c
 
 
 
 
 
 
 
 
 
 
c3b86b9
 
c8b30ba
c3b86b9
 
7cbe168
c3b86b9
 
 
 
8479604
c3b86b9
 
185613a
c3b86b9
 
 
 
 
 
 
7f6aa65
 
 
c3b86b9
 
 
 
 
 
 
 
7f6aa65
 
c3b86b9
 
 
7f6aa65
c3b86b9
 
 
 
 
7f6aa65
 
 
 
c3b86b9
7f6aa65
 
 
 
 
c3b86b9
7f6aa65
c3b86b9
 
 
7f6aa65
b8a48ec
 
9ffdb83
c3b86b9
 
f1a461d
c3b86b9
f1a461d
c3b86b9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
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)