paint-brush
Kendi RAG Uygulamanızı Oluşturun: Ollama, Python ve ChromaDB'yi kullanarak LLM'yi yerel olarak kurmak için Adım Adım Kılavuzby@nassermaronie
1,833
1,833

Kendi RAG Uygulamanızı Oluşturun: Ollama, Python ve ChromaDB'yi kullanarak LLM'yi yerel olarak kurmak için Adım Adım Kılavuz

Nasser Maronie13m2024/07/04
Read on Terminal Reader

Bu eğitim, [Ollama], [Python 3 ve [ChromaDB] kullanarak özel bir sohbet robotu oluşturma sürecinde size rehberlik edecektir. Kendi Alma-Artırılmış Nesil (RAG) uygulamanızı yerel olarak barındırmak, kurulum ve özelleştirme üzerinde tam kontrole sahip olduğunuz anlamına gelir.
featured image - Kendi RAG Uygulamanızı Oluşturun: Ollama, Python ve ChromaDB'yi kullanarak LLM'yi yerel olarak kurmak için Adım Adım Kılavuz
Nasser Maronie HackerNoon profile picture
0-item
1-item

Veri gizliliğinin çok önemli olduğu bir çağda, kendi yerel dil modelinizi (LLM) oluşturmak, hem şirketler hem de bireyler için çok önemli bir çözüm sağlar. Bu eğitim, tümü sisteminizde yerel olarak barındırılan Ollama , Python 3 ve ChromaDB'yi kullanarak özel bir sohbet robotu oluşturma sürecinde size rehberlik etmek üzere tasarlanmıştır. Bu eğitime ihtiyaç duymanızın temel nedenleri şunlardır:


  • Tam Özelleştirme: Kendi Almayla Artırılmış Nesil (RAG) uygulamanızı yerel olarak barındırmak, kurulum ve özelleştirme üzerinde tam kontrole sahip olduğunuz anlamına gelir. Harici hizmetlere bağımlı kalmadan, özel ihtiyaçlarınıza uyacak şekilde modelde ince ayar yapabilirsiniz.
  • Gelişmiş Gizlilik: LLM modelinizi yerel olarak kurarak, hassas verilerin internet üzerinden gönderilmesiyle ilişkili risklerden kaçınırsınız. Bu, özellikle gizli bilgileri kullanan şirketler için önemlidir. Modelinizi özel verilerle yerel olarak eğitmek, verilerinizin kontrolünüz altında kalmasını sağlar.
  • Veri Güvenliği: Üçüncü taraf LLM modellerini kullanmak, verilerinizi potansiyel ihlallere ve kötüye kullanıma maruz bırakabilir. Yerel dağıtım, PDF belgeleri gibi eğitim verilerinizi güvenli ortamınızda tutarak bu riskleri azaltır.
  • Veri İşleme Üzerinde Kontrol: Kendi LLM'nizi barındırdığınızda, verilerinizi tam olarak istediğiniz gibi yönetme ve işleme olanağına sahip olursunuz. Bu, özel verilerinizin ChromaDB vektör deponuza yerleştirilmesini ve veri işleme sürecinizin standartlarınızı ve gereksinimlerinizi karşılamasını sağlamayı içerir.
  • İnternet Bağlantısından Bağımsızlık: Chatbotunuzu yerel olarak çalıştırmak, internet bağlantısına bağımlı olmadığınız anlamına gelir. Bu, çevrimdışı senaryolarda bile kesintisiz hizmeti ve sohbet robotunuza erişimi garanti eder.


Bu eğitim, gizlilik veya kontrolden ödün vermeden, ihtiyaçlarınıza göre uyarlanmış, sağlam ve güvenli bir yerel sohbet robotu oluşturmanıza yardımcı olacaktır.

İnce ayar modeli


Alma-Artırılmış Nesil (RAG)

Alma-Artırılmış Oluşturma (RAG), daha doğru ve bağlamsal olarak alakalı yanıtlar oluşturmak için bilgi alma ve metin oluşturmanın güçlü yönlerini birleştiren gelişmiş bir tekniktir. RAG'ın nasıl çalıştığına ve neden faydalı olduğuna dair bir dökümü burada bulabilirsiniz:

RAG nedir?

RAG, harici bir bilgi tabanı veya belge deposu ekleyerek dil modellerinin yeteneklerini geliştiren hibrit bir modeldir. Süreç iki ana bileşenden oluşur:

  • Alma: Bu aşamada model, giriş sorgusuna dayalı olarak veritabanı veya vektör deposu gibi harici bir kaynaktan ilgili belgeleri veya bilgi parçalarını alır.
  • Üretim: Alınan bilgi daha sonra tutarlı ve bağlamsal olarak uygun bir yanıt üretmek için üretken bir dil modeli tarafından kullanılır.

RAG Nasıl Çalışır?

  • Sorgu Girişi: Kullanıcı bir sorgu veya soru girer.
  • Belge Erişimi: Sistem, harici bir bilgi tabanında arama yapmak ve en alakalı belgeleri veya bilgi parçacıklarını almak için sorguyu kullanır.
  • Yanıt Oluşturma: Üretken model, ayrıntılı ve doğru bir yanıt oluşturmak için alınan bilgiyi kendi bilgisiyle bütünleştirerek işler.
  • Çıktı: Bilgi tabanından belirli ve ilgili ayrıntılarla zenginleştirilmiş nihai yanıt kullanıcıya sunulur.

RAG'ın Faydaları

  • Gelişmiş Doğruluk: RAG modelleri, harici verilerden yararlanarak, özellikle alana özgü sorgular için daha kesin ve ayrıntılı yanıtlar sağlayabilir.
  • Bağlamsal Uygunluk: Geri getirme bileşeni, oluşturulan yanıtın ilgili ve güncel bilgilere dayanmasını sağlayarak yanıtın genel kalitesini artırır.
  • Ölçeklenebilirlik: RAG sistemleri, büyük miktarda veriyi içerecek şekilde kolayca ölçeklendirilebilir ve bu da onların çok çeşitli sorguları ve konuları ele almasına olanak tanır.
  • Esneklik: Bu modeller, harici bilgi tabanını basitçe güncelleyerek veya genişleterek çeşitli alanlara uyarlanabilir ve bu da onları oldukça çok yönlü hale getirir.

RAG'ı Neden Yerel Olarak Kullanmalısınız?

  • Gizlilik ve Güvenlik: Bir RAG modelini yerel olarak çalıştırmak, hassas verilerin harici sunuculara gönderilmesi gerekmediğinden güvenli ve özel kalmasını sağlar.
  • Özelleştirme: Tescilli veri kaynaklarının entegrasyonu da dahil olmak üzere, alma ve oluşturma süreçlerini özel ihtiyaçlarınıza uyacak şekilde uyarlayabilirsiniz.
  • Bağımsızlık: Yerel kurulum, sisteminizin internet bağlantısı olmasa bile çalışır durumda kalmasını sağlayarak tutarlı ve güvenilir hizmet sağlar.

Ollama, Python ve ChromaDB gibi araçlarla yerel bir RAG uygulaması kurarak, verileriniz ve özelleştirme seçenekleriniz üzerinde kontrolü korurken gelişmiş dil modellerinin avantajlarından da yararlanabilirsiniz.

RAG uygulaması


GPU

Alma-Artırılmış Üretimde (RAG) kullanılanlar gibi büyük dil modellerini (LLM'ler) çalıştırmak, önemli miktarda hesaplama gücü gerektirir. Verilerin verimli bir şekilde işlenmesini ve bu modellere yerleştirilmesini sağlayan temel bileşenlerden biri Grafik İşleme Birimidir (GPU). GPU'ların bu görev için neden önemli olduğunu ve yerel LLM kurulumunuzun performansını nasıl etkilediklerini burada bulabilirsiniz:

GPU nedir?

GPU, görüntülerin ve videoların işlenmesini hızlandırmak için tasarlanmış özel bir işlemcidir. Sıralı işleme görevleri için optimize edilmiş Merkezi İşlem Birimlerinin (CPU'lar) aksine, GPU'lar paralel işlemede mükemmeldir. Bu, onları makine öğrenimi ve derin öğrenme modellerinin gerektirdiği karmaşık matematiksel hesaplamalar için özellikle uygun hale getiriyor.

Yüksek Lisans Dereceleri için GPU'lar Neden Önemlidir?

  • Paralel İşlem Gücü: GPU'lar aynı anda binlerce işlemi gerçekleştirebilir ve LLM'lerde eğitim ve çıkarım gibi görevleri önemli ölçüde hızlandırır. Bu paralellik, büyük veri kümelerinin işlenmesi ve gerçek zamanlı yanıtlar üretilmesiyle ilişkili ağır hesaplama yükleri açısından çok önemlidir.
  • Büyük Modellerin Kullanımında Verimlilik: RAG'da kullanılanlar gibi LLM'ler önemli miktarda bellek ve hesaplama kaynakları gerektirir. GPU'lar yüksek bant genişlikli bellek (HBM) ve çoklu çekirdeklerle donatılmıştır; bu da onları bu modellerin ihtiyaç duyduğu büyük ölçekli matris çarpımlarını ve tensör işlemlerini yönetebilme yeteneğine sahiptir.
  • Daha Hızlı Veri Yerleştirme ve Alma: Yerel bir RAG kurulumunda, verileri ChromaDB gibi bir vektör deposuna yerleştirmek ve ilgili belgeleri hızlı bir şekilde almak performans için çok önemlidir. Yüksek performanslı GPU'lar bu süreçleri hızlandırarak sohbet robotunuzun hızlı ve doğru yanıt vermesini sağlar.
  • Geliştirilmiş Eğitim Süreleri: Bir Yüksek Lisans eğitimi, milyonlarca (hatta milyarlarca) parametrenin ayarlanmasını içerir. GPU'lar, CPU'lara kıyasla bu eğitim aşaması için gereken süreyi önemli ölçüde azaltabilir ve modelinizde daha sık güncelleme ve iyileştirme yapılmasına olanak tanır.

Doğru GPU'yu Seçmek

Yerel bir LLM kurarken GPU seçimi performansı önemli ölçüde etkileyebilir. Göz önünde bulundurulması gereken bazı faktörler şunlardır:

  • Bellek Kapasitesi: Daha büyük modeller daha fazla GPU belleği gerektirir. Kapsamlı veri kümelerini ve model parametrelerini barındırmak için daha yüksek VRAM'e (video RAM) sahip GPU'ları arayın.
  • Hesaplama Yeteneği: Bir GPU ne kadar çok CUDA çekirdeğine sahip olursa paralel işleme görevlerini o kadar iyi gerçekleştirebilir. Daha yüksek bilgi işlem kapasitesine sahip GPU'lar, derin öğrenme görevleri için daha verimlidir.
  • Bant genişliği: Daha yüksek bellek bant genişliği, GPU ile belleği arasında daha hızlı veri aktarımına olanak tanıyarak genel işlem hızını artırır.

LLM'ler için Yüksek Performanslı GPU Örnekleri

  • NVIDIA RTX 3090: Yüksek VRAM'i (24 GB) ve güçlü CUDA çekirdekleriyle tanınan bu ürün, derin öğrenme görevleri için popüler bir seçimdir.
  • NVIDIA A100: Yapay zeka ve makine öğrenimi için özel olarak tasarlanan bu ürün, geniş bellek kapasitesi ve yüksek bilgi işlem gücüyle olağanüstü performans sunar.
  • AMD Radeon Pro VII: Yüksek bellek bant genişliği ve verimli işleme yetenekleriyle bir başka güçlü rakip.

Yüksek performanslı bir GPU'ya yatırım yapmak, LLM modellerini yerel olarak çalıştırmak için çok önemlidir. Daha hızlı veri işleme, verimli model eğitimi ve hızlı yanıt oluşturma olanağı sunarak yerel RAG uygulamanızı daha sağlam ve güvenilir hale getirir. GPU'ların gücünden yararlanarak, özel ihtiyaçlarınıza ve veri gizliliği gereksinimlerinize göre uyarlanmış kendi özel sohbet robotunuzu barındırmanın faydalarından tam olarak yararlanabilirsiniz.


Önkoşullar

Kuruluma başlamadan önce aşağıdaki önkoşulların yerine getirildiğinden emin olun:

  • Python 3: Python, RAG uygulamanızın kodunu yazmak için kullanacağınız çok yönlü bir programlama dilidir.
  • ChromaDB: Verilerimizin yerleştirmelerini saklayacak ve yönetecek bir vektör veritabanı.
  • Ollama: Özel LLM'leri yerel makinemize indirmek ve sunmak için.

1. Adım: Python 3'ü yükleyin ve ortamınızı kurun

Python 3 ortamımızı kurmak ve kurmak için şu adımları izleyin: Python 3'ü makinenize indirin ve kurun . Ardından Python 3'ünüzün kurulduğundan ve başarıyla çalıştığından emin olun:

 $ python3 --version # Python 3.11.7

Projeniz için local-rag gibi bir klasör oluşturun:

 $ mkdir local-rag $ cd local-rag

venv adında bir sanal ortam oluşturun:

 $ python3 -m venv venv

Sanal ortamı etkinleştirin:

 $ source venv/bin/activate # Windows # venv\Scripts\activate

2. Adım: ChromaDB'yi ve diğer bağımlılıkları yükleyin

ChromaDB'yi pip kullanarak yükleyin:

 $ pip install --q chromadb

Modelinizle sorunsuz bir şekilde çalışmak için Langchain araçlarını yükleyin:

 $ pip install --q unstructured langchain langchain-text-splitters $ pip install --q "unstructured[all-docs]"

Uygulamanızı bir HTTP hizmeti olarak sunmak için Flask'ı yükleyin:

 $ pip install --q flask

3. Adım: Ollama'yı yükleyin

Ollama'yı yüklemek için şu adımları izleyin: Ollama indirme sayfasına gidin ve işletim sisteminize uygun yükleyiciyi indirin. Ollama kurulumunuzu aşağıdakileri çalıştırarak doğrulayın:

 $ ollama --version # ollama version is 0.1.47

İhtiyacınız olan LLM modelini çekin. Örneğin Mistral modelini kullanmak için:

 $ ollama pull mistral

Metin yerleştirme modelini çekin. Örneğin, Nomic Gömme Metin modelini kullanmak için:

 $ ollama pull nomic-embed-text

Ardından Ollama modellerinizi çalıştırın:

 $ ollama serve

RAG uygulamasını derleyin

Artık ortamınızı Python, Ollama, ChromaDB ve diğer bağımlılıklarla kurduğunuza göre özel yerel RAG uygulamanızı oluşturmanın zamanı geldi. Bu bölümde uygulamalı Python kodunu inceleyeceğiz ve uygulamanızı nasıl yapılandıracağınıza dair bir genel bakış sunacağız.

app.py

Bu ana Flask uygulama dosyasıdır. Dosyaları vektör veritabanına gömmek ve modelden yanıt almak için yolları tanımlar.

 import os from dotenv import load_dotenv load_dotenv() from flask import Flask, request, jsonify from embed import embed from query import query from get_vector_db import get_vector_db TEMP_FOLDER = os.getenv('TEMP_FOLDER', './_temp') os.makedirs(TEMP_FOLDER, exist_ok=True) app = Flask(__name__) @app.route('/embed', methods=['POST']) def route_embed(): if 'file' not in request.files: return jsonify({"error": "No file part"}), 400 file = request.files['file'] if file.filename == '': return jsonify({"error": "No selected file"}), 400 embedded = embed(file) if embedded: return jsonify({"message": "File embedded successfully"}), 200 return jsonify({"error": "File embedded unsuccessfully"}), 400 @app.route('/query', methods=['POST']) def route_query(): data = request.get_json() response = query(data.get('query')) if response: return jsonify({"message": response}), 200 return jsonify({"error": "Something went wrong"}), 400 if __name__ == '__main__': app.run(host="0.0.0.0", port=8080, debug=True)

embed.py

Bu modül, yüklenen dosyaların kaydedilmesi, verilerin yüklenmesi ve bölünmesi ve belgelerin vektör veritabanına eklenmesi de dahil olmak üzere yerleştirme sürecini yönetir.

 import os from datetime import datetime from werkzeug.utils import secure_filename from langchain_community.document_loaders import UnstructuredPDFLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from get_vector_db import get_vector_db TEMP_FOLDER = os.getenv('TEMP_FOLDER', './_temp') # Function to check if the uploaded file is allowed (only PDF files) def allowed_file(filename): return '.' in filename and filename.rsplit('.', 1)[1].lower() in {'pdf'} # Function to save the uploaded file to the temporary folder def save_file(file): # Save the uploaded file with a secure filename and return the file path ct = datetime.now() ts = ct.timestamp() filename = str(ts) + "_" + secure_filename(file.filename) file_path = os.path.join(TEMP_FOLDER, filename) file.save(file_path) return file_path # Function to load and split the data from the PDF file def load_and_split_data(file_path): # Load the PDF file and split the data into chunks loader = UnstructuredPDFLoader(file_path=file_path) data = loader.load() text_splitter = RecursiveCharacterTextSplitter(chunk_size=7500, chunk_overlap=100) chunks = text_splitter.split_documents(data) return chunks # Main function to handle the embedding process def embed(file): # Check if the file is valid, save it, load and split the data, add to the database, and remove the temporary file if file.filename != '' and file and allowed_file(file.filename): file_path = save_file(file) chunks = load_and_split_data(file_path) db = get_vector_db() db.add_documents(chunks) db.persist() os.remove(file_path) return True return False

query.py

Bu modül, sorgunun birden çok sürümünü oluşturarak, ilgili belgeleri alarak ve bağlama dayalı yanıtlar sağlayarak kullanıcı sorgularını işler.

 import os from langchain_community.chat_models import ChatOllama from langchain.prompts import ChatPromptTemplate, PromptTemplate from langchain_core.output_parsers import StrOutputParser from langchain_core.runnables import RunnablePassthrough from langchain.retrievers.multi_query import MultiQueryRetriever from get_vector_db import get_vector_db LLM_MODEL = os.getenv('LLM_MODEL', 'mistral') # Function to get the prompt templates for generating alternative questions and answering based on context def get_prompt(): QUERY_PROMPT = PromptTemplate( input_variables=["question"], template="""You are an AI language model assistant. Your task is to generate five different versions of the given user question to retrieve relevant documents from a vector database. By generating multiple perspectives on the user question, your goal is to help the user overcome some of the limitations of the distance-based similarity search. Provide these alternative questions separated by newlines. Original question: {question}""", ) template = """Answer the question based ONLY on the following context: {context} Question: {question} """ prompt = ChatPromptTemplate.from_template(template) return QUERY_PROMPT, prompt # Main function to handle the query process def query(input): if input: # Initialize the language model with the specified model name llm = ChatOllama(model=LLM_MODEL) # Get the vector database instance db = get_vector_db() # Get the prompt templates QUERY_PROMPT, prompt = get_prompt() # Set up the retriever to generate multiple queries using the language model and the query prompt retriever = MultiQueryRetriever.from_llm( db.as_retriever(), llm, prompt=QUERY_PROMPT ) # Define the processing chain to retrieve context, generate the answer, and parse the output chain = ( {"context": retriever, "question": RunnablePassthrough()} | prompt | llm | StrOutputParser() ) response = chain.invoke(input) return response return None

get_vector_db.py

Bu modül, belge yerleştirmelerini depolamak ve almak için kullanılan vektör veritabanı örneğini başlatır ve döndürür.

 import os from langchain_community.embeddings import OllamaEmbeddings from langchain_community.vectorstores.chroma import Chroma CHROMA_PATH = os.getenv('CHROMA_PATH', 'chroma') COLLECTION_NAME = os.getenv('COLLECTION_NAME', 'local-rag') TEXT_EMBEDDING_MODEL = os.getenv('TEXT_EMBEDDING_MODEL', 'nomic-embed-text') def get_vector_db(): embedding = OllamaEmbeddings(model=TEXT_EMBEDDING_MODEL,show_progress=True) db = Chroma( collection_name=COLLECTION_NAME, persist_directory=CHROMA_PATH, embedding_function=embedding ) return db

Uygulamanızı çalıştırın!

Ortam değişkenlerinizi depolamak için .env dosyası oluşturun:

 TEMP_FOLDER = './_temp' CHROMA_PATH = 'chroma' COLLECTION_NAME = 'local-rag' LLM_MODEL = 'mistral' TEXT_EMBEDDING_MODEL = 'nomic-embed-text'

Uygulama sunucunuzu başlatmak için app.py dosyasını çalıştırın:

 $ python3 app.py

Sunucu çalışmaya başladıktan sonra aşağıdaki uç noktalara istekte bulunmaya başlayabilirsiniz:

  • Bir PDF dosyasını gömmek için örnek komut (örneğin, devam.pdf):
 $ curl --request POST \ --url http://localhost:8080/embed \ --header 'Content-Type: multipart/form-data' \ --form file=@/Users/nassermaronie/Documents/Nasser-resume.pdf # Response { "message": "File embedded successfully" }
  • Modelinize soru sormak için örnek komut:
 $ curl --request POST \ --url http://localhost:8080/query \ --header 'Content-Type: application/json' \ --data '{ "query": "Who is Nasser?" }' # Response { "message": "Nasser Maronie is a Full Stack Developer with experience in web and mobile app development. He has worked as a Lead Full Stack Engineer at Ulventech, a Senior Full Stack Engineer at Speedoc, a Senior Frontend Engineer at Irvins, and a Software Engineer at Tokopedia. His tech stacks include Typescript, ReactJS, VueJS, React Native, NodeJS, PHP, Golang, Python, MySQL, PostgresQL, MongoDB, Redis, AWS, Firebase, and Supabase. He has a Bachelor's degree in Information System from Universitas Amikom Yogyakarta." }

Çözüm

Bu talimatları izleyerek ihtiyaçlarınıza göre uyarlanmış Python, Ollama ve ChromaDB'yi kullanarak özel yerel RAG uygulamanızı etkili bir şekilde çalıştırabilir ve etkileşimde bulunabilirsiniz. Uygulamanızın yeteneklerini geliştirmek için işlevselliği gerektiği gibi ayarlayın ve genişletin.

Yerel dağıtımın yeteneklerinden yararlanarak yalnızca hassas bilgileri korumakla kalmaz, aynı zamanda performansı ve yanıt verme hızını da optimize edersiniz. İster müşteri etkileşimlerini geliştiriyor ister dahili süreçleri kolaylaştırıyor olun, yerel olarak dağıtılan bir RAG uygulaması, gereksinimlerinize uyum sağlamanız ve ihtiyaçlarınıza göre büyümeniz için esneklik ve sağlamlık sunar.

Bu depodaki kaynak kodunu kontrol edin:

https://github.com/firstpersoncode/local-rag


Mutlu kodlama!