Kurs
Docker, tutarlı, taşınabilir ve yalıtılmış ortamlar oluşturmanıza olanak tanır; bu da LLMOps (Large Language Models Operations) için vazgeçilmezdir. Çeşitli LLM uygulamalarını ve bağımlılıklarını konteynerlarda kapsülleyerek Docker, dağıtımı basitleştirir, sistemler arası uyumluluğu sağlar ve test süreçlerini düzenler.
Bu eğitimde, bir “doküman Soru-Cevap” sohbet botu uygulamasını nasıl oluşturacağınızı ve Docker kullanarak buluta nasıl dağıtacağınızı öğreneceksiniz. Kullanıcı arayüzü için Gradio, orkestrasyon için LlamaIndex, dokümanları ayrıştırmak için LlamaParse, gömlemeler için Mixedbread AI, büyük dil modellerine erişmek için Groq, uygulamayı ve bağımlılıklarını paketlemek için Docker ve uygulamayı buluta dağıtmak için Hugging Face Spaces kullanacağız.
Bu eğitim, yapay zeka uygulamalarının nasıl çalıştığına dair sınırlı bilgisi olan herkesin ücretsiz olarak uygulama geliştirebilmesini sağlayacak kadar basit tasarlanmıştır.
Proje Açıklaması
Yapay zeka uygulamaları geliştirmek ve dağıtmak için iki temel yaklaşım vardır:
- Tamamen açık kaynak: Bu yaklaşım mahremiyet ve veri korumasını önceler.
- Tamamen kapalı kaynak: Bu yöntem birden çok API ve bulut hizmetinin entegre edilmesini içerir.
Her iki yaklaşımın da artıları ve eksileri vardır. Bizim durumumuzda, birden fazla yapay zeka hizmetini entegre ettiğimiz ikinci yaklaşımı seçtik. Bu sayede birkaç saniye içinde geliştirip dağıtabileceğimiz hızlı bir yapay zeka uygulaması oluşturabiliyoruz. Ana odağımız Docker imaj boyutunu küçültmek; bunu da birden fazla yapay zeka hizmetini entegre ederek etkili biçimde başarabiliriz.
Gizliliği artırmak için açık kaynak araç ve çerçevelerle bir LLM uygulaması geliştirmek üzere Docker, n8n, Qdrant ve Ollama ile Lokal AI eğitimine göz atın!
Kullanıcıların belgeleri yükleyip onlarla gerçek zamanlı sohbet edebileceği genel amaçlı bir Soru-Cevap sohbet botu oluşturacağız. Google’ın NotebookLM’ine oldukça benzer.

Proje diyagramı. Görsel: Yazar
Bu projede kullanacağımız araçlar şunlardır:
- Gradio Blocks: Kullanıcıların herhangi bir metin belgesini yükleyip belgeyle kolayca sohbet etmesini sağlayan bir kullanıcı arayüzü oluşturmak için.
- LlamaCloud: Dosyaları ayrıştırıp metin verisini markdown stilinde çıkarmak için.
- MixedBread AI: Yüklenen belgeleri ve sohbet mesajlarını bağlam geri getirimi için gömlemelere dönüştürmek üzere.
- Groq Cloud: Hızlı LLM yanıtlarına erişmek için. Bu projede llama-3.1-70b modelini kullanacağız.
- LlamaIndex: Tüm yapay zeka hizmetlerini orkestre eden RAG (Retrieval Augmented Generation) hattını oluşturmak için. Hat, yüklenen dosyayı ve kullanıcı mesajlarını kullanarak bağlama duyarlı yanıtlar üretecek.
- Docker: Uygulamayı, bağımlılıkları, ortamı ve yapılandırmaları kapsüllemek için.
- Hugging Face Cloud: Tüm dosyaları Spaces deposuna iteceğiz ve Hugging Face, Dockerfile’ı kullanarak imajı otomatik olarak oluşturup sunucuya dağıtacak.
LLM’lere yeniyseniz, temel kavramları, yöntemleri, etik hususları ve en güncel araştırmaları öğrenmek için Large Language Models (LLMs) Concepts kursunu değerlendirin.
1. Ortamın Kurulması
LLM uygulamasını oluşturmadan önce resmi web sitesinden Docker’ı indirip kurmamız gerekiyor.
- Docker’ı yerel sisteminize varsayılan seçeneklerle kurun.
- Ardından, favori IDE’nizi kullanarak bir proje dizini oluşturun ve bir
.envdosyası ekleyin. Bu dosyayı LlamaCloud, MixedBread AI ve Groq Cloud için API anahtarlarını saklamak amacıyla kullanacağız. - Daha sonra LlamaCloud’a kaydolup API anahtarınızı oluşturun. LlamaCloud’u Excel, txt, Word ve PDF’ler dahil çeşitli metin formatlarını ayrıştırmak için kullanacağız.

LlamaCloud’da yeni anahtar oluşturma. Görsel kaynağı: LlamaCloud
- Ardından MixedBread AI’a kaydolup API anahtarınızı oluşturun. Üst düzey gömme modeline ücretsiz erişim için bu anahtarı kullanacağız.

MixedBread’de API anahtarı oluşturma. Görsel kaynağı: MixedBread
- GroqCloud’a gidin, kaydolun ve ücretsiz olarak API anahtarınızı oluşturun. Yüksek hızlı LLM’lere erişmek için GroqCloud’u kullanacağız.

GroqCloud’da bir API anahtarı oluşturma. Görsel kaynağı: GroqCloud
GroqCloud hakkında her şeyi Groq LPU Çıkarım Motoru makalesini okuyarak öğrenin. Kod örnekleriyle Groq API ve özelliklerini keşfedeceksiniz. Ayrıca Groq API ve LlamaIndex kullanarak bağlama duyarlı yapay zeka uygulamalarının nasıl geliştirileceğini öğrenin.
.env dosyanız şöyle görünmelidir:
LLAMA_CLOUD_API_KEY=llx-XXXXXX
GROQ_API_KEY=gsk_XXXXXXX
MXBAI_API_KEY=emb_XXXXXX
API anahtarlarınızı yanlışlıkla kamuya açık etmeyi önlemek için .env dosyasını .gitignore’a eklemeyi unutmayın.
2. LLM Uygulamasını Oluşturma
Şimdi app.py adlı bir Python betiği oluşturacağız ve kullanıcı arayüzü bileşenlerini ekleyerek, LlamaIndex ile Retrieval-Augmented Generation (RAG) hattını geliştirmek üzere LlamaParser kullanarak tüm yapay zeka hizmetlerini entegre edeceğiz.
app.py betiği şunları yapacaktır:
- Gerekli tüm Python paketlerini yüklemek.
.envdosyasından tüm API anahtarlarını güvenli şekilde okumak.- LlamaCloud API anahtarını kullanarak LlamaParser’ı başlatmak.
- Çeşitli yaygın dosya uzantılarını işleyen bir dosya ayrıştırıcı tanımlamak.
- MixedBread AI API anahtarıyla, adı
mixedbread-ai/mxbai-embed-large-v1olan gömme modelini başlatmak. - Groq Cloud API anahtarı ve adı
llama-3.1-70b-versatileolan model ile büyük dil modelini başlatmak.
Ardından şu Python fonksiyonlarını uygulayacaktır:
load_files(): Bu fonksiyon dosyaları yükleyecek, LlamaParser ile ayrıştıracak, gömlemelere dönüştürüp vektör deposunda saklayacaktır. Dosya olmayan ya da desteklenmeyen biçimlerin yüklendiği durumlar için istisna yönetimi de eklenecek.respond(): Bu fonksiyon kullanıcı girdisini alacak, vektör deposundan içerik getirecek ve Groq modelini kullanarak yanıt oluşturacaktır. Yanıt üretimi akış (streaming) formatında olacak ve hiç dosya yüklenmemişse istisna yönetimi uygulanacaktır.
Son olarak, dosya yükleyici, butonlar, sohbet kutusu ve genel sohbet arayüzü dahil olmak üzere UI bileşenlerini oluşturacaktır.
LlamaIndex çerçevesi hakkında daha fazla bilgi edinmek için daha yalın LlamaIndex eğitimini takip edin.
İşte app.py betiği:
import os
import gradio as gr
from llama_index.core import SimpleDirectoryReader, VectorStoreIndex
from llama_index.embeddings.mixedbreadai import MixedbreadAIEmbedding
from llama_index.llms.groq import Groq
from llama_parse import LlamaParse
# API keys
llama_cloud_key = os.environ.get("LLAMA_CLOUD_API_KEY")
groq_key = os.environ.get("GROQ_API_KEY")
mxbai_key = os.environ.get("MXBAI_API_KEY")
if not (llama_cloud_key and groq_key and mxbai_key):
raise ValueError(
"API Keys not found! Ensure they are passed to the Docker container."
)
# models name
llm_model_name = "llama-3.1-70b-versatile"
embed_model_name = "mixedbread-ai/mxbai-embed-large-v1"
# Initialize the parser
parser = LlamaParse(api_key=llama_cloud_key, result_type="markdown")
# Define file extractor with various common extensions
file_extractor = {
".pdf": parser,
".docx": parser,
".doc": parser,
".txt": parser,
".csv": parser,
".xlsx": parser,
".pptx": parser,
".html": parser,
".jpg": parser,
".jpeg": parser,
".png": parser,
".webp": parser,
".svg": parser,
}
# Initialize the embedding model
embed_model = MixedbreadAIEmbedding(api_key=mxbai_key, model_name=embed_model_name)
# Initialize the LLM
llm = Groq(model="llama-3.1-70b-versatile", api_key=groq_key)
# File processing function
def load_files(file_path: str):
global vector_index
if not file_path:
return "No file path provided. Please upload a file."
valid_extensions = ', '.join(file_extractor.keys())
if not any(file_path.endswith(ext) for ext in file_extractor):
return f"The parser can only parse the following file types: {valid_extensions}"
document = SimpleDirectoryReader(input_files=[file_path], file_extractor=file_extractor).load_data()
vector_index = VectorStoreIndex.from_documents(document, embed_model=embed_model)
print(f"Parsing completed for: {file_path}")
filename = os.path.basename(file_path)
return f"Ready to provide responses based on: {filename}"
# Respond function
def respond(message, history):
try:
# Use the preloaded LLM
query_engine = vector_index.as_query_engine(streaming=True, llm=llm)
streaming_response = query_engine.query(message)
partial_text = ""
for new_text in streaming_response.response_gen:
partial_text += new_text
# Yield an empty string to cleanup the message textbox and the updated conversation history
yield partial_text
except (AttributeError, NameError):
print("An error occurred while processing your request.")
yield "Please upload the file to begin chat."
# Clear function
def clear_state():
global vector_index
vector_index = None
return [None, None, None]
# UI Setup
with gr.Blocks(
theme=gr.themes.Default(
primary_hue="green",
secondary_hue="blue",
font=[gr.themes.GoogleFont("Poppins")],
),
css="footer {visibility: hidden}",
) as demo:
gr.Markdown("# DataCamp Doc Q&A 🤖📃")
with gr.Row():
with gr.Column(scale=1):
file_input = gr.File(
file_count="single", type="filepath", label="Upload Document"
)
with gr.Row():
btn = gr.Button("Submit", variant="primary")
clear = gr.Button("Clear")
output = gr.Textbox(label="Status")
with gr.Column(scale=3):
chatbot = gr.ChatInterface(
fn=respond,
chatbot=gr.Chatbot(height=300),
theme="soft",
show_progress="full",
textbox=gr.Textbox(
placeholder="Ask questions about the uploaded document!",
container=False,
),
)
# Set up Gradio interactions
btn.click(fn=load_files, inputs=file_input, outputs=output)
clear.click(
fn=clear_state, # Use the clear_state function
outputs=[file_input, output],
)
# Launch the demo
if __name__ == "__main__":
demo.launch()
- Yukarıdaki Python dosyasını terminalinizde aşağıdaki komutla çalıştırarak Gradio sunucusunu başlatın:
$ python app.py
Çıktı:

- Oluşturulan URL’yi tarayıcıya kopyalayıp yapıştırarak Gradio arayüzüne erişebilirsiniz. Ardından bir dosya yükleyip hakkında sorular sormaya başlayabilirsiniz.

Gradio uygulamasına tarayıcıdan erişim. Görsel: Yazar
Bu eğitimde LLM uygulamamızı oluşturup dağıtmak için LlamaIndex kullanıyoruz. Benzer bir uygulamayı Developing LLM Applications with LangChain kısa kursunu alarak LangChain ile de geliştirebilirsiniz.
3. Dockerfile Oluşturma
Dockerfileoluşturup uygulama betiğini, Python bağımlılıklarını ve sunucu yapılandırmalarını paketleyin ve Gradio sunucusunu başlatın.
Dockerfile şu görevleri gerçekleştirecek:
- Python 3.9 ortamı kurmak.
- Çalışma dizinini tanımlamak.
requirements.txtdosyasını/appdizinine kopyalamak. Bu dosya gerekli tüm Python paketlerinin adlarını içerir.requirements.txt’te belirtilen tüm bağımlılıkları yüklemek.app.pydosyasını/appdizinine kopyalamak.- Portu açmak ve Gradio sunucu adresini ayarlamak.
- Sunucuyu başlatmak için uygulama dosyasını çalıştırmak.
İşte Dockerfile’ın görünümü:
# Dockerfile
# Use the official Python image with the desired version
FROM python:3.9-slim
# Set the working directory inside the container
WORKDIR /app
# Copy the requirements file to the working directory
COPY requirements.txt /app
# Install the dependencies
RUN pip install --no-cache-dir -r requirements.txt
# Copy the rest of the application code to the working directory
COPY app.py /app
# Expose the port that Gradio will run on (default is 7860)
EXPOSE 7860
ENV GRADIO_SERVER_NAME="0.0.0.0"
# Command to run your application
CMD ["python", "app.py"]
- Ayrıca
requirements.txtdosyası da şöyle. Bunu da projenize ekleyin:
gradio
llama-index-embeddings-mixedbreadai
llama-index-llms-groq
llama-index
4. Docker İmajını Oluşturma ve Konteynerı Çalıştırma
- Terminale aşağıdaki komutu yazarak
docqadocker imajını oluşturun. Docker imajını oluşturmak içinDockerfilekullanılacaktır.
$ docker build -t docqa .
Docker imajı oluşturulurken gerçekleşen işlemlerin günlüklerini görebiliriz:

LLM Docker imajının oluşturulması. Görsel: Yazar
- İmaj başarıyla oluşturulduktan sonra Docker Desktop’a gidin, Images sekmesine tıklayın ve imajı seçerek günlükleri ve imajı çalıştırmaya yönelik talimatları görüntüleyin.

Docker Desktop’ta Docker imajını görüntüleme. Görsel: Yazar
Şimdi imajı kullanarak Docker konteynerını yerelde çalıştıracağız. Port numarasını, ortam değişkenlerini ayarlamak için bir .env dosyasını, Docker konteyner adını ve Docker imaj etiketini belirteceğiz.
- Terminalde aşağıdaki komutu çalıştırın:
$ docker run -p 7860:7860 --env-file .env --name docqa-container docqa
Konteyner çalışmaya başladıktan sonra, bu örnekte http://0.0.0.1:7860/ URL’sini tarayıcıya yapıştırarak Gradio uygulamasına erişebilirsiniz.

Docker konteyner LLM uygulamasını test etme. Görsel: Yazar
- Yerelde çalışan tüm konteynerlara ilişkin bilgileri görmek için şu komutu yazın:
$ docker ps
Çıktı:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ff2a11da13d7 docqa "python app.py" 17 seconds ago Up 16 seconds 0.0.0.0:7860->7860/tcp docqa-container
- Docker konteynerını
stopkomutuyla durdurabilirsiniz:
$ docker stop docqa-container
rmkomutuyla kaldırabilirsiniz:
$ docker rm docqa-container
Bir Docker imajına sahip olduğumuzda, LLM uygulamamızı her yere dağıtabiliriz: GCP, AWS, Azure veya Docker dağıtımını destekleyen herhangi bir bulut sunucusu.
5. LLM Uygulamasını Docker Kullanarak Hugging Face’e Dağıtma
Yeni başlayanlar için işleri basitleştirmek adına uygulamayı Docker ile Hugging Face Cloud (Spaces) üzerinde dağıtacağız.
- Hugging Face panosuna gidin, profil resmine tıklayın ve + New Space seçeneğini seçin.
- Space’inize bir ad verin, kısa açıklama ekleyin, lisans ve SDK’yı seçin ve Space deposunu oluşturun.

Docker kullanarak yeni Hugging Face Space oluşturma. Görsel kaynağı: Hugging Face
Space deposu oluşturulduğunda, nasıl klonlayacağınız ve gerekli dosyaları nasıl ekleyeceğinizle ilgili talimatlar alacaksınız.
- Depoyu klonlamak için şu komutu kullanın (URL’yi kendi Space’inize ait olanla güncelleyin):
$ git clone https://huggingface.co/spaces/kingabzpro/doc-qa-docker
- Proje dizinindeki tüm dosyaları yeni depoya kopyalayıp yapıştırın:
Tüm dosyalarla birlikte proje dizininiz şöyle görünmelidir. .env dosyasını asla push etmediğinizden emin olun; bu nedenle .gitignore’a ekleyin.

Proje dosya yapısı. Görsel: Yazar
- Dosyaları hazırlayın, bir mesajla commit edin ve Hugging Face Space’e push edin:
$ git add .
$ git commit -m "Deploying the App"
$ git push
Çıktı:
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Delta compression using up to 16 threads
Compressing objects: 100% (7/7), done.
Writing objects: 100% (7/7), 7.60 KiB | 7.60 MiB/s, done.
Total 7 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
To https://huggingface.co/spaces/kingabzpro/doc-qa-docker
afb20ad..5ca6388 main -> main
- Uygulamaya erişmek için Hugging Face Space’inize gidin. Docker imajını oluşturacak ve ardından uygulamayı sunacaktır:

Hugging Face Cloud’da Docker imajının oluşturulması. Görsel kaynağı: Doc Qa Docker
Aşağıdakine benzer bir hata görürseniz endişelenmeyin. Ortam değişkenlerinin eksikliğinden kaynaklanır. Yapmamız gereken tek şey bu değişkenleri Hugging Face Space içinde ayarlamak.

Dağıtılan uygulamada çalışma zamanı hatası. Görsel kaynağı: Doc Qa Docker
- Space’inizde yeni bir ortam değişkeni eklemek için Settings bölümüne gidin, aşağı kaydırın ve New secret düğmesine tıklayın. Ardından, aşağıda gösterildiği gibi ortam değişkeninin adını ve değerini girin. Bu durumda gerekli API anahtarlarını ekliyoruz:

Dağıtılan uygulamaya gizli anahtarlar ekleme. Görsel kaynağı: Doc Qa Docker ayarları.
Gerekli tüm API anahtarlarını ortam değişkenleri olarak ekledikten sonra gizli anahtarlarınız şöyle görünmelidir:

Dağıtılan uygulamanın gizli anahtarları. Görsel kaynağı: Doc Qa Docker ayarları.
Gizli anahtarları ayarladıktan sonra uygulama otomatik olarak yeniden başlayacak ve uygulamanın çalıştığını görmelisiniz. Kullanın ve bulutta belge Soru-Cevap uygulamanızın keyfini çıkarın!

Hugging Face Spaces üzerinde LLM uygulaması. Görsel kaynası: Doc Qa Docker
Sonuçları yeniden üretmek için tüm dosya ve yapılandırmalar GitHub deposunda mevcuttur: kingabzpro/Deploy-Doc-QA.
6. Dağıtılan Uygulamayı İzleme
Yapay zeka hizmetlerini kullanmanın avantajları vardır: Herhangi bir hizmeti dağıtıp yönetmek zorunda kalmazsınız, yüksek iş hacmi elde edersiniz ve günlüklerin bulunduğu bir panoya sahip olursunuz.
LlamaCloud panonuz, ayrıştırılmış tüm belgeleri kaydeder. Geçmişe bakabilir, istekleri ve kullanımı karşılaştırabilirsiniz.

Llama Cloud panosu. Görsel kaynağı: LlamaCloud
Benzer şekilde, gömme modeli için kullandığımız token sayısını ve oluşturulan istek sayısını da kontrol edebilirsiniz.

Mixedbread panosu. Görsel kaynağı: Mixedbread
Her bir API’ye ait en ayrıntılı günlükler GroqCloud üzerinde bulunur; gecikme, token sayısı, AI anahtarı ve sisteminizi hata ayıklamanızı sağlayacak istek kimliği bilgilerini içerir.

GroqCloud günlükleri. Görsel kaynağı: GroqCloud
Son Söz
Bu kılavuzda, birden fazla hizmeti birleştirerek minimum kaynak kullanımı ve hesaplama yüküyle verimli bir doküman Soru-Cevap uygulaması nasıl oluşturulur öğrendik. Kullandığımız tüm hizmet ve araçlar, kendi uygulamanızı test edip oluşturmanız için ücretsizdir.
Birden çok hazır yapay zeka hizmeti kullanarak Docker imaj boyutumuzu 600 MB azalttık. Her şeyi kendimiz dağıtmış olsaydık imaj boyutu yaklaşık 20 GB veya daha fazla olurdu.
Öğrenme yolculuğunuzun bir sonraki adımı olarak LLMOps Concepts: From Ideation to Deployment kursunu almanızı öneririm. Bu kurs, LLM geliştirme yaşam döngüsü ve uygulama dağıtımının zorluklarına dair içgörüler kazandıracak ve bu kavramları etkin biçimde nasıl uygulayacağınızı öğretecektir.
Yapay Zeka Uygulamaları Geliştirin
Sertifikalı bir veri bilimcisi olarak, yenilikçi makine öğrenimi uygulamaları oluşturmak için en son teknolojileri kullanmaya büyük ilgi duyuyorum. Konuşma tanıma, veri analizi ve raporlama, MLOps, konuşma yapay zekası ve NLP alanlarında güçlü bir geçmişe sahip olarak, gerçek bir etki yaratabilecek akıllı sistemler geliştirme becerilerimi geliştirdim. Teknik uzmanlığımın yanı sıra, karmaşık kavramları açık ve özlü bir dille ifade etme yeteneğine sahip, becerikli bir iletişimciyim. Sonuç olarak, veri bilimi konusunda aranan bir blog yazarı oldum ve giderek büyüyen veri profesyonelleri topluluğuyla görüşlerimi ve deneyimlerimi paylaşıyorum. Şu anda, içerik oluşturma ve düzenlemeye odaklanıyorum. Büyük dil modelleriyle çalışarak, hem işletmelerin hem de bireylerin verilerinden en iyi şekilde yararlanmalarına yardımcı olabilecek güçlü ve ilgi çekici içerikler geliştiriyorum.

