آیا تا به حال فکر کرده‌اید که ساخت چت‌بات هوش مصنوعی روی کامپیوتر شخصی خودتان چقدر می‌تواند شگفت‌انگیز باشد؟ شاید تصور می‌کردید این کار نیازمند سال‌ها تجربه برنامه‌نویسی است، اما خبر خوب این است که دیگر این‌طور نیست! به لطف پیشرفت‌های خیره‌کننده در حوزه هوش مصنوعی، شما برای ایجاد یک چت‌بات سفارشی، نیازی به کدنویس حرفه‌ای بودن ندارید. در واقع، شما بیشتر شبیه به یک “کارگردان” هستید؛ کسی که با دیدی هوشمندانه، ابزارهای قدرتمند موجود را کنار هم قرار می‌دهد تا به بهترین نتیجه برسد. این رویکرد جدید، دنیایی از امکانات را پیش روی شما می‌گشاید تا بدون نگرانی از پیچیدگی‌ها، چت‌بات هوش مصنوعی خود را بسازید و از مزایای آن لذت ببرید، بدون کدنویسی و حفظ کامل حریم خصوصی.

پارت اول ویدیو: آموزش نصب Ollama: هوش مصنوعی شخصی، رایگان و آفلاین روی کامپیوتر – پارت اول

یکی از شگفت‌انگیزترین نکات در مسیر create-ai-chatbot-pc، قدرت “کتابخانه‌ها” است. این مجموعه‌های کدهای از پیش نوشته شده، وظایف پیچیده‌ای مانند طراحی رابط کاربری حرفه‌ای را تنها با چند خط دستور ساده برای شما انجام می‌دهند. تصور کنید: به جای صرف هفته‌ها برای کدنویسی، می‌توانید با ابزارهایی مانند Streamlit، یک رابط کاربری زیبا و کاربردی را در عرض چند دقیقه راه‌اندازی کنید. فرآیند کلی نیز به سادگی “نصب، کپی و اجرا” خلاصه می‌شود. شما فقط کافیست ابزارهای اولیه را نصب کنید، کدهای آماده را کپی و پیست کرده و با یک دستور ساده، چت‌بات خود را در مرورگرتان فعال کنید. این یعنی یک تغییر انقلابی در شیوه تعامل ما با تکنولوژی، و فرصتی برای همه تا به راحتی هوش مصنوعی شخصی خود را داشته باشند. ساخت چت‌بات هوش مصنوعی روی کامپیوتر شخصی - پارت دوم

اما جذابیت ساخت چت‌بات هوش مصنوعی روی کامپیوتر شخصی تنها به سادگی آن محدود نمی‌شود؛ کنترل کامل و حفظ حریم خصوصی داده‌ها، مزایای بی‌نظیری را به همراه دارد. شما می‌توانید چت‌بات خود را دقیقاً مطابق با نیازها و سلیقه خود سفارشی‌سازی کنید، از انتخاب مدل‌های مختلف هوش مصنوعی گرفته تا افزودن قابلیت‌هایی مانند ذخیره تاریخچه مکالمات، آپلود فایل، یا حتی تغییر ظاهر (مثل حالت تاریک یا روشن). چون همه چیز روی سیستم شخصی شما اجرا می‌شود، اطلاعات و مکالماتتان کاملاً خصوصی می‌مانند و هیچ نیازی به نگرانی بابت سرویس‌های ابری و شخص ثالث نخواهید داشت. با create-ai-chatbot-pc، شما نه تنها یک ابزار قدرتمند می‌سازید، بلکه حریم خصوصی خود را نیز حفظ می‌کنید و دنیایی از امکانات را تجربه می‌کنید.

راهنمای نصب و اجرای Ollama در PyCharm

1. دانلود و نصب پایتون و PyCharm

قبل از شروع، باید پایتون و PyCharm را نصب کنید.

  • دانلود پایتون:

به سایت رسمی Python مراجعه کنید.

آخرین نسخه پایتون را برای سیستم‌عامل خود دانلود و نصب کنید.

هنگام نصب، گزینه Add Python to PATH را فعال کنید.

  • دانلود PyCharm:

به سایت JetBrains مراجعه کنید.

نسخه Community (رایگان) یا Professional را دانلود و نصب کنید.

پس از نصب، یک پروژه جدید ایجاد کنید.

2. نصب کتابخانه‌های لازم

اول از همه، باید کتابخانه‌های مورد نیاز را نصب کنید. شما می‌توانید این کار را در محیط مجازی (virtual environment) پایتون انجام دهید تا وابستگی‌های پروژه‌تان مدیریت شود.

pip install ollama gradio 
  • ollama: برای ارتباط با مدلی که از طریق Ollama نصب کردهاید.
  • gradio: برای ایجاد رابط کاربری وب.

3. ایجاد یک اسکریپت پایتون

حالا یک فایل پایتون جدید در PyCharm ایجاد کنید و کد زیر را در آن قرار دهید:


import ollama
import gradio as gr

# تابعی که مدل را فراخوانی می‌کند و پاسخ می‌دهد
def generate_response(prompt):
response = ollama.generate(model='deepseek-r1:1.5b', prompt=prompt)
return response['response']

# ایجاد رابط کاربری با Gradio
iface = gr.Interface(
fn=generate_response, # تابعی که قرار است فراخوانی شود
inputs="text", # نوع ورودی (متن)
outputs="text", # نوع خروجی (متن)
title="Chat with DeepSeek", # عنوان رابط کاربری
description="Ask anything to the DeepSeek model." # توضیحات
)

# اجرای رابط کاربری
iface.launch()

4. اجرای اسکریپت

حالا اسکریپت را در PyCharm اجرا کنید. پس از اجرا، یک لینک محلی (مثلاً http://127.0.0.1:7860) در ترمینال نمایش داده می‌شود. این لینک را در مرورگر خود باز کنید تا به رابط کاربری دسترسی پیدا کنید.

5. استفاده از رابط کاربری

در رابط کاربری، می‌توانید متن خود را وارد کنید و مدل پاسخ خواهد داد. این رابط بسیار شبیه به ChatGPT خواهد بود.

توضیحات بیشتر:

  • Ollama: این کتابخانه به شما امکان می‌دهد تا مدل‌های محلی را اجرا کنید و با آنها تعامل داشته باشید.
  • Gradio: این کتابخانه به شما کمک می‌کند تا به سرعت یک رابط کاربری وب برای مدل‌های خود ایجاد کنید. Gradio از پیش تنظیم شده است تا با مدل‌های متن، تصویر، صدا و غیره کار کند.

نکات مهم:

  • مطمئن شوید که مدل deepseek-r1:1.5b به درستی نصب شده و از طریق ollama قابل دسترسی است.
  • اگر مدل بزرگ است و سیستم شما منابع محدودی دارد، ممکن است نیاز به تنظیمات بیشتری داشته باشید (مثلاً استفاده از GPU یا کاهش اندازه مدل).

جایگزین‌ها:

اگر می‌خواهید رابط کاربری پیشرفته‌تری داشته باشید، می‌توانید از Streamlit استفاده کنید. Streamlit نیز یک کتابخانه عالی برای ایجاد رابط‌های کاربری وب است و کمی انعطاف‌پذیرتر از Gradio است.

pip install streamlit


سپس می‌توانید یک اسکریپت مشابه با Streamlit ایجاد کنید:

import ollama
import streamlit as st

st.title("Chat with DeepSeek")

prompt = st.text_input("Ask anything:")

if prompt:
response = ollama.generate(model='deepseek-r1:1.5b', prompt=prompt)
st.write(response['response'])
و سپس آن را با دستور زیر اجرا کنید:
streamlit run your_script.py

آپدیت پروژه:

کد شما یک رابط کاربری ساده با استفاده از Streamlit ایجاد کرده است که به کاربر اجازه می‌دهد با مدل deepseek-r1:1.5b تعامل کند. برای بهبود این رابط کاربری و اضافه کردن قابلیت‌های بیشتر، می‌توانید موارد زیر را به پروژه خود اضافه کنید:

1. تاریخچه چت (Chat History)

ذخیره و نمایش تاریخچه چت به کاربر کمک می‌کند تا مکالمات قبلی را ببیند و ادامه دهد.

import ollama
import streamlit as st

st.title("Chat with DeepSeek")

# ذخیره تاریخچه چت در session state
if "messages" not in st.session_state:
st.session_state.messages = []

# نمایش تاریخچه چت
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])

prompt = st.chat_input("Ask anything:")

if prompt:
# اضافه کردن سوال کاربر به تاریخچه
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("user"):
st.markdown(prompt)

# دریافت پاسخ از مدل
response = ollama.generate(model='deepseek-r1:1.5b', prompt=prompt)
answer = response['response']

# اضافه کردن پاسخ مدل به تاریخچه
st.session_state.messages.append({"role": "assistant", "content": answer})
with st.chat_message("assistant"):
st.markdown(answer)

2. پاک کردن تاریخچه چت

اضافه کردن یک دکمه برای پاک کردن تاریخچه چت.

if st.button("Clear Chat History"):
st.session_state.messages = []
st.experimental_rerun() # رفرش صفحه برای اعمال تغییرات

3. انتخاب مدل

اگر چند مدل نصب شده دارید، می‌توانید به کاربر اجازه دهید مدل مورد نظر خود را انتخاب کند.

model_list = ["deepseek-r1:1.5b", "another-model"] # لیست مدل‌های نصب شده
selected_model = st.selectbox("Select a model", model_list)

if prompt:
response = ollama.generate(model=selected_model, prompt=prompt)
st.write(response['response'])

4. تنظیم پارامترهای مدل

به کاربر اجازه دهید پارامترهای مدل مانند temperature یا max_tokens را تنظیم کند.

temperature = st.slider("Temperature", min_value=0.1, max_value=1.0, value=0.7)
max_tokens = st.slider("Max Tokens", min_value=50, max_value=500, value=100)

if prompt:
response = ollama.generate(
model='deepseek-r1:1.5b',
prompt=prompt,
options={
"temperature": temperature,
"max_tokens": max_tokens
}
)
st.write(response['response'])

5. نمایش وضعیت مدل

اضافه کردن یک نشانگر وضعیت (مثلاً یک اسپینر) هنگام تولید پاسخ توسط مدل.

import time

if prompt:
with st.spinner("Generating response..."):
response = ollama.generate(model='deepseek-r1:1.5b', prompt=prompt)
st.write(response['response'])

6. پشتیبانی از چندزبانه

اضافه کردن قابلیت انتخاب زبان برای کاربر.

language = st.selectbox("Select Language", ["English", "Persian", "French"])

if prompt:
if language == "Persian":
prompt = f"به زبان فارسی پاسخ دهید: {prompt}"
response = ollama.generate(model='deepseek-r1:1.5b', prompt=prompt)
st.write(response['response'])

7. ذخیره چت

اضافه کردن قابلیت ذخیره تاریخچه چت در یک فایل متنی.

if st.button("Save Chat"):
with open("chat_history.txt", "w", encoding="utf-8") as f:
for message in st.session_state.messages:
f.write(f"{message['role']}: {message['content']}\n")
st.success("Chat history saved to chat_history.txt")

8. افزودن تم (Theming)

استفاده از تم‌های مختلف در Streamlit برای بهبود ظاهر رابط کاربری.

st.set_page_config(page_title="DeepSeek Chat", page_icon="🤖", layout="wide")

9. پشتیبانی از فایل‌های ورودی

اجازه دهید کاربر فایل‌های متنی را آپلود کند و محتوای آن به عنوان ورودی به مدل ارسال شود.

uploaded_file = st.file_uploader("Upload a text file", type=["txt"])
if uploaded_file:
file_contents = uploaded_file.read().decode("utf-8")
st.write("File contents:")
st.write(file_contents)
if st.button("Ask about the file"):
response = ollama.generate(model='deepseek-r1:1.5b', prompt=file_contents)
st.write(response['response'])

10. افزودن قابلیت جستجو

اضافه کردن یک جعبه جستجو برای پرسیدن سوالات خاص از تاریخچه چت.

search_query = st.text_input("Search chat history")
if search_query:
results = [msg for msg in st.session_state.messages if search_query.lower() in msg["content"].lower()]
for result in results:
st.write(f"{result['role']}: {result['content']}")

11. افزودن قابلیت صوتی

استفاده از کتابخانه‌هایی مانند pyttsx3 یا gTTS برای تبدیل پاسخ‌های متنی به صوت.

from gtts import gTTS
import os

if prompt:
response = ollama.generate(model='deepseek-r1:1.5b', prompt=prompt)
answer = response['response']
st.write(answer)

# تبدیل متن به صوت
tts = gTTS(answer, lang="en")
tts.save("response.mp3")
st.audio("response.mp3")

12. افزودن قابلیت اشتراک‌گذاری

استفاده از st.experimental_get_query_params برای ایجاد لینک‌های قابل اشتراک‌گذاری.

query_params = st.experimental_get_query_params()
if "prompt" in query_params:
st.write(f"Shared prompt: {query_params['prompt'][0]}")

13. افزودن قابلیت ارسال ایمیل

استفاده از کتابخانه smtplib برای ارسال پاسخ‌ها به ایمیل کاربر.

import smtplib
from email.mime.text import MIMEText

email = st.text_input("Enter your email to receive the response")
if email and prompt:
response = ollama.generate(model='deepseek-r1:1.5b', prompt=prompt)
answer = response['response']

# ارسال ایمیل
msg = MIMEText(answer)
msg['Subject'] = 'Response from DeepSeek'
msg['From'] = 'your_email@example.com'
msg['To'] = email

with smtplib.SMTP('smtp.example.com') as server:
server.sendmail('your_email@example.com', [email], msg.as_string())
st.success("Response sent to your email!")

14. افزودن قابلیت لاگین

استفاده از st.secrets برای مدیریت کاربران و لاگین.

username = st.text_input("Username")
password = st.text_input("Password", type="password")

if username == st.secrets["USERNAME"] and password == st.secrets["PASSWORD"]:
st.success("Logged in successfully!")
else:
st.error("Invalid credentials")

15. افزودن قابلیت گزارش خطا

ذخیره خطاها در یک فایل لاگ برای بررسی بعدی.

import logging

logging.basicConfig(filename="app.log", level=logging.ERROR)

try:
if prompt:
response = ollama.generate(model='deepseek-r1:1.5b', prompt=prompt)
st.write(response['response'])
except Exception as e:
logging.error(f"Error: {e}")
st.error("An error occurred. Please try again.")

جمع‌بندی

با اضافه کردن این قابلیت‌ها، می‌توانید یک رابط کاربری پیشرفته و کاربرپسند ایجاد کنید. هر یک از این قابلیت‌ها را می‌توانید به تنهایی یا در ترکیب با دیگر قابلیت‌ها استفاده کنید.

سورس کدی که خودم استفاده کردم

import ollama
import streamlit as st
import time
import html

st.title("Chatbot PFXA")

# ذخیره تاریخچه چت در session state
if "messages" not in st.session_state:
st.session_state.messages = []

# نمایش تاریخچه چت
for message in st.session_state.messages:
with st.chat_message(message["role"]):
align = "right" if any("\u0600" <= char <= "\u06FF" for char in message["content"]) else "left"
escaped_content = html.escape(message["content"]) # جلوگیری از مشکلات HTML
st.markdown(
f'<div style="text-align: {align}; direction: {"rtl" if align == "right" else "ltr"};">{escaped_content}</div>',
unsafe_allow_html=True
)

prompt = st.chat_input("Ask anything:")

if prompt:
# اضافه کردن سوال کاربر به تاریخچه
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("user"):
align = "right" if any("\u0600" <= char <= "\u06FF" for char in prompt) else "left"
escaped_prompt = html.escape(prompt) # جلوگیری از HTML injection
st.markdown(
f'<div style="text-align: {align}; direction: {"rtl" if align == "right" else "ltr"};">{escaped_prompt}</div>',
unsafe_allow_html=True
)

# دریافت پاسخ از مدل
response = ollama.generate(model='deepseek-r1:1.5b', prompt=prompt)
answer = response['response']

# Escape کردن پاسخ برای جلوگیری از خطاهای HTML
escaped_answer = html.escape(answer)

# اضافه کردن پاسخ مدل به تاریخچه
st.session_state.messages.append({"role": "assistant", "content": answer})

# نمایش پاسخ به‌صورت تایپینگ (کلمه به کلمه)
with st.chat_message("assistant"):
align = "right" if any("\u0600" <= char <= "\u06FF" for char in answer) else "left"
response_container = st.empty()
typed_response = ""

for char in escaped_answer:
typed_response += char
response_container.markdown(
f'<div style="text-align: {align}; direction: {"rtl" if align == "right" else "ltr"};">{typed_response}</div>',
unsafe_allow_html=True
)
time.sleep(0.02) # تنظیم سرعت تایپینگ

if st.button("Clear Chat History"):
st.session_state.messages = []
st.experimental_rerun() # رفرش صفحه برای اعمال تغییرات

# انتخاب مدل از لیست
model_list = ["deepseek-r1:1.5b", "partai/dorna-llama3"]
selected_model = st.selectbox("Select a model", model_list)

# انتخاب زبان
language = st.selectbox("Select Language", ["English", "Persian", "French"])

if prompt:
if language == "Persian":
prompt = f"به زبان فارسی پاسخ دهید: {prompt}"
response = ollama.generate(model=selected_model, prompt=prompt)

# Escape کردن پاسخ برای جلوگیری از مشکلات HTML
escaped_response = html.escape(response["response"])

# نمایش پاسخ با افکت تایپینگ
align = "right" if language == "Persian" else "left"
response_container = st.empty()
typed_response = ""

for char in escaped_response:
typed_response += char
response_container.markdown(
f'<div style="text-align: {align}; direction: {"rtl" if align == "right" else "ltr"};">{typed_response}</div>',
unsafe_allow_html=True
)
time.sleep(0.02) # سرعت تایپینگ

if st.button("Save Chat"):
with open("chat_history.txt", "w", encoding="utf-8") as f:
for message in st.session_state.messages:
f.write(f"{message['role']}: {message['content']}\n")
st.success("Chat history saved to chat_history.txt")

uploaded_file = st.file_uploader("Upload a text file", type=["txt"])
if uploaded_file:
file_contents = uploaded_file.read().decode("utf-8")

# Escape کردن محتوای فایل
escaped_file_contents = html.escape(file_contents)

st.write("File contents:")
align = "right" if any("\u0600" <= char <= "\u06FF" for char in file_contents) else "left"
st.markdown(
f'<div style="text-align: {align}; direction: {"rtl" if align == "right" else "ltr"};">{escaped_file_contents}</div>',
unsafe_allow_html=True
)
if st.button("Ask about the file"):
response = ollama.generate(model='deepseek-r1:1.5b', prompt=file_contents)

# Escape کردن پاسخ برای جلوگیری از خطاهای HTML
escaped_response = html.escape(response["response"])

# نمایش پاسخ با افکت تایپینگ
align = "right" if any("\u0600" <= char <= "\u06FF" for char in response["response"]) else "left"
response_container = st.empty()
typed_response = ""

for char in escaped_response:
typed_response += char
response_container.markdown(
f'<div style="text-align: {align}; direction: {"rtl" if align == "right" else "ltr"};">{typed_response}</div>',
unsafe_allow_html=True
)
time.sleep(0.02) # تنظیم سرعت تایپینگ