Kendi verileri için evrensel bir arama motoru olarak Ollama ve Qdrant ile RAG

Giderek karmaşıklaşan bilgi dünyasında, kendi veritabanlarınızı hedefe yönelik bir şekilde aranabilir hale getirmek giderek daha önemli hale geliyor - klasik tam metin aramaları yoluyla değil, anlamsal olarak alakalı yanıtlar yoluyla. İşte tam da bu noktada RAG veritabanı prensibi devreye giriyor - iki temel bileşenden oluşan yapay zeka destekli bir arama çözümü:


Yapay zeka üzerine güncel konular

  1. herhangi bir içeriğin sayısal vektörler olarak depolandığı bir vektör veritabanı (Qdrant gibi),
  2. ve ilgili talepleri uygun içerikle akıllı bir şekilde birleştiren bir dil modeli (örn. Ollama aracılığıyla).

Modelin "tahmin etmesine" izin vermek yerine, bu mimari kendi bilgi kaynaklarını kullanır - örneğin:

  • kendi yazdığı belgeseller,
  • Web sitelerinin içeriği,
  • teknik kılavuzlar,
  • Veritabanlarını destekleyin,
  • SSS listeleri,
  • veya arşivlenmiş metin kaynakları (örneğin eski veritabanlarından).

Belirleyici faktör: Tüm bu kaynaklar önceden hazırlanabilir ve daha sonra bir kullanıcı sorusu için en alakalı metin alıntılarını sağlayabilmek için "parçalara ayrılabilir" (yani küçük metin birimlerine ayrılabilir).

İster kendi bilgi veritabanınızı, ister şirket içi dokümantasyonunuzu veya tüm bir ürün arşivini analiz edilebilir hale getirmek isteyin - Ollama + Qdrant Bunu kendi Mac'inizde, herhangi bir bulut kısıtlaması olmadan ve veriler üzerinde tam kontrol sahibi olarak yapabilirsiniz.

RAG veritabanı nedir - ve neden "yığınlama"?

RAG, Retrieval-Augmented Generation'ın kısaltmasıdır - başka bir deyişle: destekli bilgi alımı ile metin üreten yapay zeka. GPT, Mistral veya LLaMA gibi bir dil modelini yalnızca "bildikleri" üzerinde eğitmek yerine, bağlı bir bilgi veritabanı (genellikle vektör veritabanı olarak adlandırılır) aracılığıyla kendi ek bilgilerine erişebilir.

Örnek:

Bir dil modeline "2023 vergi beyannamemde ne var?" diye sorarsanız, orijinal verilere erişimi olmadan tahmin etmek zorunda kalacaktır. Ancak, bu belgenin yerel olarak depolanmış, vektör tabanlı bir temsiline erişimi varsa, ilgili bilgileri alabilir ve yanıtına dahil edebilir.

İçerik neden "yığınlanır"?

Belgeler, web siteleri veya kitaplar genellikle tek seferde işlenemeyecek veya aranamayacak kadar uzundur. Modern dil modellerinin de belirteç sınırları vardır - yani bir kerede anlayabilecekleri sınırlı bir metin uzunluğu (genellikle yaklaşık 4.000-8.000 belirteç, hatta daha yeni modellerde 32.000 veya daha fazla).

Bu yüzden RAG aşağıdaki hileyi kullanır:

  1. Orijinal metin küçük bölümlere (parçalara) ayrılmıştır.
  2. Her bir yığın bir dil modeli (gömme) tarafından bir vektöre dönüştürülür.
  3. Bu vektörler Qdrant gibi bir veritabanında saklanır.
  4. Kullanıcı bir istekte bulunduğunda, istem de bir vektöre çevrilir ve en benzer parçalar alınır.
  5. Bu içerik daha sonra dil modeline eklenir - örneğin bir sistem istemi veya bağlam enjeksiyonu yoluyla.

Bu, bellek gibi davranan bir sistem yaratır - ancak klasik anahtar kelimeler veya tam metin araması olmadan, tamamen anlam tabanlı (semantik).

Gereksinimler ve hedef

Aşağıdakilerden oluşan yerel bir RAG sistemi kuruyoruz:

  • Ollama aracılığıyla yerel bir LLM
  • Qdrant adlı bir vektör veritabanı
  • metinleri parçalara ayıran, vektörleştiren ve veritabanına ekleyen bir Python betiği
  • İsteğe bağlı: sorgulama için basit bir arayüz veya API

Hedef platform: macOS (Intel veya Apple Silicon)

Bu bir ön koşuldur:

  • macOS 12 veya daha yeni (Monterey veya üstü)
  • Temel terminal bilgisi
  • Python 3.10 veya daha yeni sürüm
  • İsteğe bağlı: Homebrew installiert

Adım 1: Ollama 1TP12Hayvan

Ollama, Mistral, LLaMA, Gemma veya Codellama gibi yerel dil modellerini internet olmadan da kendi bilgisayarınızda çalıştırmanızı sağlayan yalın bir araçtır.

Mac üzerinde kurulum:

curl -fsSL https://ollama.com/install.sh | sh

Alternatif olarak Ollama, Homebrew install üzerinden de atanabilir:
brew install ollama

Kurulumdan sonra:

ollama run mistral

Bu, Mistral 7B modelini indirir ve yerel olarak başlatır. Ollama, daha sonra vektörleştirme için kullanacağımız bir REST API ile birlikte gelir. Elbette Gemma3 (12B), Mistral Small (24B) veya diğer LLM'ler gibi diğer modelleri de kullanabilirsiniz.

Adım 2: Qdrant 1TP12 hayvanları (yerel vektör veritabanı)

Qdrant, Rust tabanlı yıldırım hızında bir vektör veritabanıdır. Ücretsiz, açık kaynak kodlu ve Mac'te başlatması kolay - tercihen Docker aracılığıyla. Docker'ı henüz Mac 1TP12'nize yüklemediyseniz, şu adresten indirebilirsiniz Docker web sitesi ücretsiz olarak yükleyebilir ve Mac'inizde normal bir masaüstü uygulaması installieren olarak çalıştırabilirsiniz. Alternatif olarak, zaten Homebrew kullanıyorsanız Docker'ı Homebrew install üzerinden de yükleyebilirsiniz:

brew install --cask docker

Ardından Docker aracılığıyla Qdrant'ı başlatın:

docker run -p 6333:6333 -v qdrant_storage:/qdrant/storage qdrant/qdrant

Qdrant'a daha sonra şu adresten ulaşılabilir

http://localhost:6333

Test için:

curl http://localhost:6333/collections

Adım 3: Python ortamını hazırlayın

Yığınlama, gömme ve Qdrant ile iletişim için Python'a ihtiyacımız var.

Hazırlık:

python3 -m venv rag-env
source rag-env/bin/activate
pip install qdrant-client sentence-transformers ollama numpy

Eğer ollama bir Python paketi olarak tanınmıyorsa, REST API'yi doğrudan istekler aracılığıyla kullanın:

pip install requests

Adım 4: Yığınlama ve gömme

Aşağıda, bir metin belgesini parçalara ayıran, Ollama aracılığıyla katıştırmalar oluşturan ve bunları Qdrant'a ekleyen örnek bir kod bulacaksınız:

import requests
from qdrant_client import QdrantClient
from qdrant_client.models import PointStruct
import uuid

# Konfiguration
CHUNK_SIZE = 500 # Zeichen
COLLECTION_NAME = "mein_rag_wissen"

# Text vorbereiten
with open("mein_text.txt", "r") as f:
text = f.read()

chunks = [text[i:i+CHUNK_SIZE] for i in range(0, len(text), CHUNK_SIZE)]

# Qdrant vorbereiten
client = QdrantClient("localhost", port=6333)

# Neue Collection anlegen (falls noch nicht vorhanden)
client.recreate_collection(
collection_name=COLLECTION_NAME,
vectors_config={"size": 4096, "distance": "Cosine"}
)

def get_embedding_ollama(text):
response = requests.post(
"http://localhost:11434/api/embeddings",
json={"model": "mistral", "prompt": text}
)
return response.json()["embedding"]

# Embeddings erzeugen und in Qdrant speichern
points = []
for i, chunk in enumerate(chunks):
vector = get_embedding_ollama(chunk)
points.append(PointStruct(
id=str(uuid.uuid4()),
vector=vector,
payload={"text": chunk}
))

client.upsert(collection_name=COLLECTION_NAME, points=points)
print(f"{len(points)} Chunks erfolgreich eingefügt.")

Adım 5: Anlamsal arama yoluyla sorgular

Artık sorguları Qdrant'a bir vektör olarak gönderebilir ve en alakalı metin bölümlerini bulmasını sağlayabilirsiniz:

query = "Wie funktioniert ein RAG-System?"
query_vector = get_embedding_ollama(query)

results = client.search(
collection_name=COLLECTION_NAME,
query_vector=query_vector,
limit=3
)

for r in results:
print(r.payload["text"])

Daha sonra bu parçaları örneğin bir sistem istemi aracılığıyla Ollama'ye iletebilir ve bunların bağlamla ilgili bir yanıt olarak formüle edilmesini sağlayabilirsiniz.

FileMaker ve diğer veritabanlarına yığınlama + JSON aktarımı

Birçok durumda, yığınlama mevcut bir veritabanı çözümünde - örneğin FileMaker'de - zaten gerçekleştirilebilir. Kendi çalışma ortamımda tam olarak bu şekilde çalışıyor: kaynak veriler - web sitesi içeriği, destek girişleri veya teknik makaleler gibi - FileMaker'de yapılandırılmış biçimde zaten mevcut.

Süreç bu şekilde işlemektedir:

  1. Metinler, FileMaker'nin kendi öbekleme mantığı kullanılarak örneğin 300-500 karakterlik bölümlere ayrılır.
  2. Her yığına kendi kimliği ve varsa meta verileri (başlık, kategori, kaynak, dil, vb.) verilir.
  3. Tüm parçalar otomatik olarak JSON dosyaları olarak dışa aktarılır - örneğin bir ağ sürücüsündeki belirli bir dizine veya doğrudan AI sunucusunun sabit sürücüsüne.
  4. Sunucudaki bir Python betiği bu JSON dosyalarını okur ve Qdrant veritabanına kaydeder.

Dışa aktarılan bir yığın dosyası örneği (chunk_00017.json)

{
"id": "00017",
"text": "Dies ist ein einzelner Textabschnitt mit ca. 400 Zeichen, der aus einer größeren Quelle stammt. Er wurde in FileMaker vorbereitet und enthält alle relevanten Inhalte, die für eine semantische Suche benötigt werden.",
"metadata": {
"source": "support_center",
"category": "Fehlermeldung",
"language": "de",
"title": "Drucker wird nicht erkannt"
}
}

Daha sonra içe aktarma komut dosyası otomatik olarak veya terminal üzerinden düzenli olarak çalıştırılabilir - örneğin bir cron işi veya manuel çağrı yoluyla:

python3 import_json_chunks.py /Users/markus/Desktop/chunks/

Kod her bir JSON yığınını okur, ilgili vektörü oluşturur (örneğin Ollama veya SentenceTransformers aracılığıyla) ve girişi Qdrant veritabanına aktarır.

Bu yöntem sadece şeffaf olmakla kalmaz, aynı zamanda mevcut BT yapılarıyla da çok iyi bir şekilde birleştirilebilir - özellikle halihazırda FileMaker kullanan veya süreç netliği nedeniyle her şeyi merkezi ve görsel olarak kontrol etmek isteyen şirketlerde.

Tüm veritabanlarını yerel yapay zekanıza bağlayın

Ollama ve Qdrant ile Mac üzerinde kısa sürede eksiksiz, yüksek performanslı bir RAG sistemi kurulabilir:

  • Yerel, bulut veya abonelik olmadan
  • Kendi içeriğinizle genişletilebilir
  • Bilgisayardan hiçbir şey çıkmadığı için veriler güvende
  • Qdrant büyük miktarda veride bile hızlı kaldığı için verimli

Yapay zekanızı sadece sohbet etmek için değil, gerçek bir bilgi ve hafıza sistemi olarak kullanmak istiyorsanız, bu kombinasyon bir zorunluluktur. Ve kendi verileriniz üzerinde tam kontrol ile çok az çabayla çalışır.


Yerel yapay zeka sistemlerinin kullanımına ilişkin güncel anket

MLX veya Ollama gibi yerel olarak çalışan yapay zeka yazılımları hakkında ne düşünüyorsunuz?

Görünüm: RAG, Ollama ve Qdrant ile neler mümkün

Bu makalede anlatılan düzenek, bilgiyle başa çıkmanın yeni bir yolunun teknik temelini oluşturuyor - yerel, kontrollü ve esnek bir şekilde genişletilebilir. Ancak yolculuk hiçbir şekilde burada bitmiyor. Yığınlama, gömme, anlamsal arama ve dil modellerinin etkileşimini anladıktan sonra, bu mimarinin pratikte ne kadar çok yönlü olduğunu çabucak fark edeceksiniz.

1. kendi veritabanlarına bağlantı

İster FileMaker, MySQL, PostgreSQL veya MongoDB olsun - herhangi bir içerik düzenli olarak ayıklanabilir, parçalara ayrılabilir ve hedeflenen sorgular kullanılarak vektör veritabanına otomatik olarak eklenebilir. Bu, klasik bir veritabanını semantik olarak aranabilir bir bilgi kaynağına dönüştürür. Özellikle destek sistemlerinde, ürün arşivlerinde veya dijital kütüphanelerde bu, çalışanlar veya müşteriler için tamamen yeni erişim seçeneklerinin önünü açar.

2. Web sayfalarının, PDF'lerin veya belgelerin otomatik olarak içe aktarılması

İçeriğin manuel olarak aktarılması gerekmez. BeautifulSoup, readability, pdfplumber veya docx2txt gibi araçlarla tüm web siteleri, PDF kılavuzları veya Word belgeleri otomatik olarak içe aktarılabilir, metin formuna dönüştürülebilir ve yığınlama için hazırlanabilir. Örneğin, teknik wiki'ler, müşteri portalları veya çevrimiçi belgeler düzenli olarak güncellenebilir ve RAG veritabanına beslenebilir.

3. Yapılandırma yoluyla uzun vadeli bilgi birikimi oluşturma

Her soruyla sıfırdan başlayan klasik bir yapay zeka uygulamasının aksine, bir RAG kurulumu, temel bilginin adım adım genişletilmesine ve iyileştirilmesine olanak tanır. Parçaların hedefli seçimi ve hazırlanması, her girişte daha değerli hale gelen kendi semantik hafızasını yaratır.

4. Bilgi grafikleri ile bağlantı (Neo4j)

Bir adım daha ileri gitmek isterseniz, bilgileri yalnızca semantik olarak depolamakla kalmaz, aynı zamanda mantıksal olarak da bağlayabilirsiniz. Bir grafik veritabanı olan Neo4j ile terimler, kişiler, konular veya kategoriler arasındaki ilişkiler görselleştirilebilir ve özel olarak sorgulanabilir. Bu, bir metin koleksiyonunu hem insanlar hem de yapay zeka tarafından kullanılabilen yapılandırılmış bir bilgi grafiğine dönüştürür - örneğin nedensel zincirleri, zamansal dizileri veya tematik kümeleri görselleştirmek için.

5. Kendi araçlarınızda, uygulamalarınızda veya sohbet botlarınızda kullanın

Bir kez kurulduktan sonra, RAG mantığı hemen hemen her uygulamaya entegre edilebilir: dahili bir web uygulamasında semantik bir arama işlevi olarak, bir CRM sisteminde akıllı bir giriş yardımı olarak veya şirket web sitesinde kendi uzmanlığına sahip bir sohbet robotu olarak. Yerel API'ler (örneğin Ollama REST ve Qdrant gRPC) kullanılarak, tüm bileşenler esnek ve genişletilebilir kalır - geleneksel şirket sınırlarının ötesinde bile.

Bu araçlara aşina olma cesaretini gösterenler, kontrol, egemenlik ve teknik netlik ruhu içinde, gerçek kullanım değerine sahip bağımsız, yerel yapay zeka sistemlerinin temelini oluştururlar.


ERP yazılımı ile ilgili güncel konular

Ollama + Qdrant ile RAG hakkında sıkça sorulan sorular

1. RAG veritabanı nedir ve ne işe yarar?

Bir RAG veritabanı (Retrieval Augmented Generation) bir vektör veritabanını bir dil modeliyle birleştirir. Yapay zeka modellerinin özellikle kendi veritabanınızın ilgili bölümlerine erişebilmesi için kendi içeriğinizi (örneğin belgeler veya web siteleri) semantik olarak aranabilir hale getirmenizi mümkün kılar.

2 Bu bağlamda "yığınlama" ne anlama gelmektedir?

Parçalara ayırma, uzun metinleri daha küçük, anlamlı bir şekilde tutarlı bölümlere (parçalara) ayırmak anlamına gelir - genellikle 200 ila 500 karakter arasında. Bu, tek tek metin bölümlerinin vektör veritabanına verimli bir şekilde kaydedilmesini ve sorular ortaya çıktığında daha sonra geri getirilmesini sağlar.

3. Neden tüm metinleri Qdrant'a kaydedemiyorsunuz?

Çünkü yapay zeka modelleri ve vektör aramaları sınırlı metin uzunluklarıyla çalışır. Büyük belgeler önemli içeriği "gizler" ya da hatalı hale getirir. Yığınlama doğruluğu artırır çünkü tam metinler yerine belirli bölümler karşılaştırılır.

4. Herhangi bir kaynaktan içerik kullanabilir miyim?

Evet, metinleri düzenlenebilir bir biçimde (örneğin düz metin, HTML, Markdown, PDF, FileMaker girdileri vb. olarak) aldığınız sürece, bunları hazırlayabilir, parçalara ayırabilir ve Qdrant'a entegre edebilirsiniz. Karışık kaynaklar da mümkündür.

5. Böyle bir sistem kurmak için programlama yapabilmem gerekir mi?

Temel Terminal ve Python bilgisi yardımcı olur, ancak gerekli değildir. Birçok adım (örneğin FileMaker'de yığınlama, JSON dışa aktarma) görsel ve otomatik olarak uygulanabilir. Qdrant içe aktarma betiği kolayca özelleştirilebilir.

6. Birkaç belge veya kategoriyi de yönetebilir miyim?

Evet, her yığın meta veri içerebilir - örneğin başlık, kaynak, dil veya kategori. Bunlar, sonuçları daha spesifik olarak filtrelemek için arama sırasında dikkate alınabilir.

7 Yerleştirme üretimi için hangi modeller uygundur?

Ollama aracılığıyla yerel bir model (örneğin mistral, llama2, gemma) ya da cümle dönüştürücülerden all-MiniLM gibi ayrı bir gömme modeli kullanabilirsiniz. Modelin gömme çıktılarını vektör olarak üretmesi önemlidir.

8. Mac'te Qdrant'ı nasıl başlatabilirim?

En kolay yol Docker komutudur:

docker run -p 6333:6333 -v qdrant_storage:/qdrant/storage qdrant/qdrant

Qdrant daha sonra http://localhost:6333 altında çalışır

9. veri̇ hacmi̇m ne kadar büyük olabi̇li̇r?

Qdrant çok performanslıdır ve on binlerce veya yüz binlerce parçayı kolayca yönetebilir. Ana sınırlama RAM ve depolama alanıdır, sayı değil.

10. Bu FileMaker ile de çalışıyor mu?

Evet, tüm yığınlama ve JSON dışa aktarma işlemlerini doğrudan FileMaker'de yapabilirsiniz. Parçalar ayrı JSON dosyaları olarak dışa aktarılır ve bunlar daha sonra bir Python betiği aracılığıyla Qdrant'a aktarılır - orijinal sistemden tamamen bağımsız olarak.

11. Bunu Mac yerine başka bir sunucuda da çalıştırabilir miyim?

Kesinlikle. Bu kurulum Linux sunucularında, Raspberry Pi'de veya bulutta (istenirse) da çalışır. Docker bunu platformdan bağımsız hale getirir. Verimli kullanım için genellikle daha fazla RAM ve GPU desteğine sahip bir sunucu önerilir.

12. Vektör aramasını Ollama ile nasıl birleştirebilirim?

Önce Ollama (Embedding API) aracılığıyla bir kullanıcı sorusu için bir vektör oluşturursunuz, bunu Qdrant'ta en alakalı parçaları aramak için kullanırsınız ve bunları bağlam olarak dil modeline verirsiniz. Ollama daha sonra soruyu + bağlamla ilgili bilgileri işler ve sağlam temelli bir yanıt oluşturur.

Resim (c) geralt @ pixabay

Yorum yapın