Hibrit Arama ve Yeniden Sıralama ile Bağlamsal RAG Sistemleri Oluşturmaya Yönelik Kapsamlı Bir Kılavuz

Facebok sayfasını beğenin :
sevilen

Tarih:

Daha çok RAG sistemleri olarak bilinen Geri Alma Artırılmış Üretim sistemleri, pahalı ince ayar zahmetleri olmadan özel kurumsal verilerle ilgili soruları yanıtlayan Özelleştirilmiş Akıllı Yapay Zeka Asistanları oluşturmak için fiili standart haline geldi. Büyük Dil Modelleri (LLM'ler). Naif RAG sistemlerinin en büyük zorluklarından biri, kullanıcı sorgularını yanıtlamak için doğru alınan bağlam bilgisini elde etmektir. Parçalama, belgeleri daha küçük bağlam parçalarına veya yığınlarına ayırır ve bu da genellikle tüm belgenin genel bağlam bilgisinin kaybolmasıyla sonuçlanabilir. Bu kılavuzda, şu kaynaktan esinlenerek bir Bağlamsal RAG Sistemini tartışacağız ve oluşturacağız: Anthropic'in ünlü Bağlamsal Geri Alma yaklaşımı ve bunu Hibrit Arama ve Yeniden Sıralama ile adım adım tam bir uygulamalı örnek kullanarak birleştirin. Başlayalım!

İçindekiler

Naive RAG Sistem Mimarisi

Standart bir Naive Retrieval Augmented Generation (RAG) sistem mimarisi genellikle iki ana adımdan oluşur:

  1. Veri İşleme ve İndeksleme
  2. Alma ve Yanıt Oluşturma

1. Adım, Veri İşleme ve Dizinleme'de, genellikle bu belgelerden metin içeriğini yükleyerek, büyük metin öğelerini daha küçük parçalara bölerek (genellikle bağımsız ve izole), bunları bir yerleştirme modeli kullanarak yerleştirmelere dönüştürerek ve ardından bu parçaları ve yerleştirmeleri aşağıdaki şekilde gösterildiği gibi bir vektör veritabanında depolayarak özel kurumsal verilerimizi daha tüketilebilir bir biçime getirmeye odaklanıyoruz.

2. Adımda iş akışı kullanıcının bir soru sormasıyla başlar, girdi sorusuna benzer ilgili metin belgesi parçaları vektör veritabanından alınır ve ardından soru ve bağlam belgesi parçaları aşağıdaki şekilde gösterildiği gibi insan benzeri bir yanıt oluşturmak için bir LLM'ye gönderilir.

Bu iki adımlı iş akışı, endüstride standart bir RAG sistemi oluşturmak için yaygın olarak kullanılır, ancak bunun da kendine özgü sınırlamaları vardır; bunlardan bazılarını aşağıda ayrıntılı olarak ele alacağız.

Naive RAG Sistem sınırlamaları

Saf RAG sistemlerinin bazı sınırlamaları vardır, bunlardan bazıları aşağıda belirtilmiştir:

  • Büyük belgeler bağımsız izole parçalara bölünür
  • Belgenin bağlamsal bilgilerini ve genel temasını daha küçük bağımsız parçalara böler
  • Yukarıdaki sorunlar nedeniyle geri alma performansı ve kalitesi etkilenebilir
  • Standart anlamsal benzerlik tabanlı arama çoğu zaman yeterli değildir

Bu makalede, özellikle bağlamsal bilgilerin belge parçalarına eklenmesi ve hibrit arama ve yeniden sıralama ile standart anlamsal aramanın geliştirilmesi açısından saf RAG sistemlerinin sınırlamalarının çözümüne odaklanacağız.

Standart Hibrit RAG İş Akışı

Standart naif RAG sistemlerinin performansını iyileştirmenin bir yolu, Hibrit RAG yaklaşımını kullanmaktır. Bu temelde, aşağıdaki şekilde gösterildiği gibi anlamsal ve anahtar kelime aramasının bir kombinasyonunu kullanan Hibrit arama ile desteklenen bir RAG sistemidir.

Standart RAG
Standart Hibrit RAG İş Akışı; Kaynak: Antropik

Yukarıdaki şekilde gösterildiği gibi fikir, belgelerinizi almak, bunları yinelemeli karakter metin bölme gibi herhangi bir standart parçalama mekanizması kullanarak parçalara ayırmak ve ardından bu parçalardan yerleştirmeler oluşturmak ve anlamsal aramaya odaklanmak için bir vektör veritabanında saklamaktır. Ayrıca bu parçalardan kelimeleri çıkarırız, sıklıklarını sayarız ve TF-IDF vektörleri elde etmek için normalleştiririz ve bir TF-IDF dizininde saklarız. Ayrıca bu parça vektörlerini temsil etmek için BM25'i anahtar kelime aramasına daha fazla odaklanarak kullanabiliriz. BM25, TF-IDF (Terim Frekansı-Ters Belge Frekansı) vektör uzayı modeline dayanarak çalışır. TF-IDF genellikle bir kelimenin bir belge gövdesindeki bir belge için ne kadar önemli olduğunu ölçen bir değerdir. BM25 bunu aşağıdaki matematiksel gösterimi kullanarak iyileştirir.

Bu nedenle BM25, belge uzunluğunu dikkate alır ve terim sıklığına bir doygunluk fonksiyonu uygular; bu da yaygın kelimelerin sonuçlara hakim olmasını önlemeye yardımcı olur.

Vektör veri tabanı ve BM25 vektör indeksi oluşturulduktan sonra hibrit RAG sistemi şu şekilde çalışır:

  • Kullanıcı sorgusu gelir ve bir sorgu yerleştirmesi elde etmek için vektör veritabanı yerleştirme modeline gider ve vektör veritabanı, en çok benzer K belge parçasını bulmak için yerleştirme anlamsal benzerliğini kullanır
  • Kullanıcı sorgusu ayrıca BM25 vektör dizinine girer, bir sorgu vektör gösterimi oluşturulur ve BM25 benzerliği kullanılarak en çok benzer belge parçaları alınır 
  • Yukarıdaki iki alma işleminden elde edilen sonuçları birleştiriyor ve çoğaltmayı kaldırıyoruz Karşılıklı Sıra Füzyonu (RRF)
  • Bu belge parçaları, bir yanıt oluşturmak için LLM'ye bir talimat isteminde kullanıcı sorgusuyla birlikte bağlam olarak gönderilir

Hybrid RAG, Naive RAG'den daha iyi olsa da, Anthropic'in Contextual RAG üzerine yaptığı araştırmada da vurgulandığı gibi bazı sorunları vardır. Asıl sorun, belgelerin bağımsız ve izole parçalara bölünmesidir. Birçok durumda işe yarar ancak genellikle bu parçalar yeterli bağlamdan yoksun olduğundan, geri alma ve yanıtların kalitesi yeterince iyi olmayabilir. Bu, Anthropic'in kendi örneklerinde açıkça vurgulanmıştır araştırma.

Ayrıca bu sorunun Bağlamsal Geri Çağırma ile çözülebileceğini ve bu konuda birkaç deney yaptıklarını belirtiyorlar.

Bağlamsal Geri Alma'yı Anlamak

Bağlamsal almanın temel odağı, her belge parçasındaki bağlamsal bilginin kalitesini iyileştirmektir. Bu, şu şekilde yapılır: hazırlık Her bir parçada, genel belgeye göre parçaya özgü açıklayıcı bağlam bilgisi. Ancak o zaman bu parçaları yerleştirmeler ve TF-IDF vektörleri oluşturmak için göndeririz. Aşağıda, bir parçanın bağlamsal bir parçaya nasıl dönüştürülebileceğini gösteren Anthropic'ten bir örnek bulunmaktadır.

Geçmişte bağlamı iyileştirmek için başka yaklaşımlar da vardı; bunlar arasında şunlar yer alıyordu: parçalara genel belge özetleri ekleme , varsayımsal belge yerleştirme, ve özet tabanlı dizinleme. Deneylere dayanarak, Anthropic bunların bağlamsal geri çağırma kadar iyi performans göstermediğini buldu. Ancak keşfetmekten, denemekten ve hatta yaklaşımları birleştirmekten çekinmeyin!

Bağlamsal Geri Alma Uygulaması

Her parçaya bağlam katmanın ideal bir yolu, insanların her belgeyi okumasını, anlamasını ve ardından her parçaya ilgili bağlam bilgilerini eklemesini sağlamaktır. Ancak, özellikle çok sayıda belgeniz ve binlerce hatta milyonlarca belge parçanız varsa bu sonsuza kadar sürebilir! Bu nedenle, GPT-4o, Gemini 1.5 veya Claude 3.5 gibi uzun bağlamlı LLM'lerin gücünden yararlanabilir ve bunu akıllıca bir yönlendirmeyle otomatik olarak yapabiliriz. Aşağıda, Anthropic tarafından Claude 3.5'in genel belgeye göre her parça için bağlam bilgilerini almasına yardımcı olmak için yönlendirme yapmak üzere kullanılan yönlendirmenin bir örneği verilmiştir.

Tüm belge şuraya konulacaktır: TÜM_BELGE yer tutucu değişken ve her parça içine konur PAKET_İÇERİK yer tutucu değişken. Genellikle 50-100 belirteçten oluşan (uzunluğunu komut istemi üzerinden kontrol edebilirsiniz) sonuçtaki bağlamsal metin, vektör veritabanı ve BM25 dizinleri oluşturulmadan önce parçaya eklenir.

Kullanım durumunuza, alanınıza ve gereksinimlerinize bağlı olarak yukarıdaki istemi gerektiği gibi değiştirebileceğinizi unutmayın. Örneğin, bu kılavuzda araştırma makalelerine ait parçalara bağlam ekleyeceğiz, bu nedenle her parça için bağlamı oluşturmak ve ardından parçaya eklemek için aşağıdaki özelleştirilmiş istemi kullandım. 

Her bir parçanın bağlam bilgilerinde neyin olması veya olmaması gerektiğini açıkça belirtebilir, ayrıca satır sayısı, kelime sayısı vb. gibi belirli kısıtlamaları da belirtebilirsiniz.

Bağlamsal Alma Ön İşleme Mimarisi

Aşağıdaki şekil, bağlamsal alımı uygulamak için ön işleme mimari akışını gösterir. Deneylerinize ve kullanım durumunuza bağlı olarak kendi belge yükleyicilerinizi ve ayırıcılarınızı istediğiniz gibi seçmekte özgür olduğunuzu unutmayın.

Kullanım durumumuzda farklı kaynaklardan ve formatlardan gelen belgelerin bir karışımı üzerinde bir RAG sistemi oluşturacağız. JSON belgeleri olarak kısa 1-2 paragraf Wikipedia makalelerimiz ve PDF olarak mevcut bazı popüler AI araştırma makalelerimiz var.

Ön işleme boru hattıyla iş akışı

Ön işleme sürecinde aşağıdaki iş akışı izlenir.

  1. JSON Wikipedia makalelerinden metin içeriğini çıkarmak için bir JSON Belge yükleyicisi kullanıyoruz. Çok büyük olmadıkları için olduğu gibi tutuyoruz ve daha fazla parçalamıyoruz.
  2. Her PDF dosyasından metin içeriğini çıkarmak için PyMuPDF gibi bir PDF Belge yükleyicisi kullanıyoruz. 
  3. Daha sonra, PDF belge metnini daha küçük belge parçalarına bölmek için Tekrarlayan Karakter Metin Bölme gibi bir belge parçalama tekniği kullanırız
  4. Daha sonra, her parçayı tüm belgeyle birlikte bir talimat istemi şablonuna geçiriyoruz (yukarıdaki şekilde Bağlam Oluşturucu İstemi olarak gösterilmiştir)
  5. Bu istem daha sonra her parça için bağlamsal bilgi üretmek üzere GPT-4o gibi uzun bağlamlı bir LLM'ye gönderilir
  6. Her bir parçanın bağlam bilgisi daha sonra parça içeriğine eklenir
  7. Daha sonra yerleştirilmeye ve dizine eklenmeye hazır olan tüm işlenmiş parçaları topluyoruz

Her bir parça için bağlam oluşturmanın maliyetli olduğunu unutmayın çünkü istemde parça ile birlikte her seferinde gönderilen tüm belge bilgileri olacak ve özellikle ticari LLM'ler kullanıyorsanız, belirteç sayısına göre ücretlendirileceksiniz. Bunu ele alabileceğiniz birkaç yol vardır:

  • En popüler LLM'lerin istem önbelleğe alma özelliğinden yararlanın Claude ve GPT-4o maliyetlerden tasarruf etmenizi sağlar
  • Tüm belgeyi göndermeyin, ancak parçanın bulunduğu belirli sayfayı veya parçaya yakın birkaç sayfayı gönderebilirsiniz.
  • Tüm belge yerine belgenin bir özetini gönderdi

Her zaman durumunuz için en iyi işe yarayanı deneyin, bağlamsal ön işleme için tek bir en iyi yöntem olmadığını unutmayın. Şimdi bu boru hattını genel RAG boru hattına takalım ve genel Bağlamsal RAG mimarisi hakkında konuşalım.

Hibrit Arama ve Yeniden Sıralama Mimarisi ile Bağlamsal RAG

Aşağıdaki şekil, yanıt oluşturmadan önce alınan belge parçalarının kalitesini iyileştirmek için hibrit arama ve yeniden sıralamayı da uygulayan Bağlamsal RAG sistemimiz için uçtan uca mimari akışını göstermektedir.

Bağlamsal Ön İşleme iş akışı

Yukarıdaki şeklin sol tarafı, önceki bölümde ele aldığımız Bağlamsal Ön İşleme iş akışını göstermektedir. Burada, önceki adımdaki bu ön işlemenin zaten gerçekleştiğini ve şimdi işlenmiş belge parçalarının (eklenen bağlamsal bilgilerle) indekslenmeye hazır olduğunu varsayıyoruz.

ilk adım

Buradaki ilk adım, bu belge parçalarını alıp bunları OpenAI'ninki gibi ilgili bir yerleştirme modelinden geçirmektir text-embedding-3-small gömücü modeli ve parça yerleştirmeleri oluşturma. Bunlar daha sonra şu şekilde bir vektör veritabanına dizine eklenir: Chroma Vektör DB kullanıcı sorgularına benzer belge parçalarını almak için süper hızlı anlamsal alma (genellikle kosinüs benzerliğini yerleştirmeyi kullanarak) sağlayan hafif, açık kaynaklı bir vektör veritabanıdır.

İkinci adım

Bir sonraki adım, aynı belge parçalarını alıp seyrek anahtar kelime sıklığı vektörleri (TF-IDF) oluşturmak ve bunları daha önce açıkladığımız gibi benzer belge parçalarını kullanıcı sorgularına getirmek için BM25 benzerliğini kullanacak bir BM25 dizinine dizinlemektir.

Şimdi, sağdaki yukarıdaki şekilde gösterildiği gibi, sisteme gelen bir kullanıcı sorgusuna dayanarak, ilk önce Vector DB ve BM25 dizininden benzer belge parçalarını alırız. Daha sonra, Vector DB ve BM25 dizininden hem anlamsal hem de anahtar sözcük aramasından alınan belgeleri aldığımız ve benzersiz belge parçalarını (tekrarlama) aldığımız ve ardından kullandığımız karma aramayı etkinleştirmek için bir topluluk alıcısı kullanırız. Karşılıklı Sıra Füzyonu (RRF) Daha alakalı belge parçalarını daha üst sıralara yerleştirmek için belgeleri daha fazla yeniden sıralamak.

Üçüncü adım

Sonra, yalnızca benzerlik tabanlı sıralama yerine alaka tabanlı sıralamaya odaklanmak için sorgu ve belge parçalarını bir yeniden sıralayıcıya geçiriyoruz. Uygulamamızda kullandığımız yeniden sıralayıcı popülerdir BAAI'den BGE Reranker Hugging Face'te barındırılan ve açık kaynaklıdır. Bunu daha hızlı çalıştırmak için bir GPU'ya ihtiyacınız olduğunu unutmayın (veya genellikle ticari olan ve bir maliyeti olan API tabanlı yeniden sıralayıcıları da kullanabilirsiniz). Bu adımda, bağlam belgesi parçaları giriş sorgusuyla alakalarına göre yeniden sıralanır.

Son adım

Son olarak, kullanıcı sorgusunu ve yeniden sıralanmış bağlam belgesi parçalarını, LLM'ye bağlam bilgilerini yalnızca kullanıcı sorgusunu yanıtlamak için kullanmasını talimat veren bir talimat istemi şablonuna gönderiyoruz. Bu daha sonra LLM'ye gönderilir (bizim durumumuzda GPT-4o) yanıt üretimi için.

Son olarak, LLM'den kullanıcı sorgusuna ilişkin ilgili bağlamsal yanıtı alırız ve bu genel akışı tamamlar. Şimdi bu uçtan uca iş akışını bir sonraki bölümde uygulayalım!

Bağlamsal RAG Sistemimizin Uygulamalı Uygulaması 

Bir önceki bölümde detaylı olarak ele aldığımız mimariye dayalı Bağlamsal RAG sistemimiz için uçtan uca iş akışını şimdi adım adım, detaylı açıklamalar, kodlar ve çıktılarla uygulayacağız.

Bağımlılıkları Yükle

Sistemimizi oluşturmak için kullanacağımız kütüphaneler olacak gerekli bağımlılıkları yükleyerek başlıyoruz. Bunlara langchain, pymupdf, jq ve openai, chroma ve bm25 gibi gerekli bağımlılıklar da dahildir.

!pip install langchain==0.3.4
!pip install langchain-openai==0.2.3
!pip install langchain-community==0.3.3
!pip install jq==1.8.0
!pip install pymupdf==1.24.12
!pip install httpx==0.27.2
# install vectordb and bm25 utils
!pip install langchain-chroma==0.1.4
!pip install rank_bm25==0.2.2

Açık AI API Anahtarını Girin

Kodumuzda anahtarımızı yanlışlıkla açığa çıkarmamak için getpass() fonksiyonunu kullanarak Açık AI anahtarımızı giriyoruz.

from getpass import getpass

OPENAI_KEY = getpass('Enter Open AI API Key: ')

Kurulum Ortamı Değişkenleri

Daha sonra LLM'imizi doğrularken kullanacağımız bazı sistem ortam değişkenlerini ayarlıyoruz.

import os

os.environ['OPENAI_API_KEY'] = OPENAI_KEY

Veri Setini Alın

JSON formatında bazı Wikipedia makalelerinden ve birkaç araştırma makalesi PDF'inden oluşan veri setimizi Google Drive'ımızdan aşağıdaki gibi indirdik

!gdown 1aZxZejfteVuofISodUrY2CDoyuPLYDGZ

Çıktı:

Indiriliyor ...
Kaynak: https://drive.google.com/uc?id=1aZxZejfteVuofISodUrY2CDoyuPLYDGZ
Kime: /content/rag_docs.zip
100% 5.92M/5.92M [00:00<00:00, 134MB/s]

Daha sonra sıkıştırılmış dosyayı açıp içindeki belgeleri çıkartıyoruz.

!unzip rag_docs.zip

Çıktı:

Arşiv: rag_docs.zip
   oluşturuluyor: rag_docs/
  şişirme: rag_docs/attention_paper.pdf  
  şişirme: rag_docs/cnn_paper.pdf  
  şişirme: rag_docs/resnet_paper.pdf  
  şişirme: rag_docs/vision_transformer.pdf  
  şişirme: rag_docs/wikidata_rag_demo.jsonl

Şimdi dokümanları türlerine göre ön işleme tabi tutacağız.

JSON Wikipedia Belgelerini Yükle ve İşle

Şimdi JSON dosyasından Wikipedia belgelerini yükleyip işleyeceğiz.

from langchain.document_loaders import JSONLoader

loader = JSONLoader(file_path='./rag_docs/wikidata_rag_demo.jsonl',
                    jq_schema='.',
                    text_content=False,
                    json_lines=True)
wiki_docs = loader.load()

wiki_docs[3]

Çıktı:

Belge(metadata={'kaynak': '/içerik/rag_docs/wikidata_rag_demo.jsonl',
'seq_num': 4}, page_content='{"id": "71548", "title": "Ki-kare
dağıtım", "paragraflar": ["Olasılık teorisinde ve istatistikte,
ki-kare dağılımı (ayrıca ki-kare veya formül_1u00a0 dağılımı)
en yaygın kullanılan teorik olasılık dağılımlarından biridir.
formül_2 serbestlik derecesi ile kare dağılım şu şekilde yazılır
formül_3. ... Bir diğeri de farklı rastgele değişkenlerin (veya
gözlemler) birbirinden bağımsız olmalıdır."]}')

Artık bunları LangChain Belgelerine dönüştürüyoruz çünkü daha sonra bunları işlemek ve dizinlemek daha kolay oluyor ve hatta gerekirse ek meta veri alanları bile ekliyoruz.

import json
from langchain.docstore.document import Document

wiki_docs_processed = []
for doc in wiki_docs:
    doc = json.loads(doc.page_content)
    metadata = {
        "title": doc['title'],
        "id": doc['id'],
        "source": "Wikipedia",
        "page": 1
    }
    data = ' '.join(doc['paragraphs'])
    wiki_docs_processed.append(Document(page_content=data, metadata=metadata))

wiki_docs_processed[3]

Çıktı

Belge(metadata={'title': 'Ki-kare dağılımı', 'id': '71548',
'kaynak': 'Vikipedi', 'sayfa': 1}, page_content='Olasılık teorisinde ve
istatistik, ki-kare dağılımı (ayrıca ki-kare veya formül_1xa0
(dağıtım) en yaygın kullanılan teorik olasılıklardan biridir
dağılımlar. Formül_2 serbestlik derecesine sahip ki-kare dağılımı
formül_3 olarak yazılmıştır. ... Bir diğeri ise farklı rastgele değişkenlerin
(veya gözlemler) birbirinden bağımsız olmalıdır.')

Bağlamsal Bilgilerle PDF Araştırma Makalelerini Yükleyin ve İşleyin

Şimdi araştırma makalesi PDF'lerini yükleyeceğiz, işleyeceğiz ve ayrıca daha önce tartıştığımız gibi bağlamsal geri çağırmayı etkinleştirmek için her parçaya bağlamsal bilgi ekleyeceğiz. Parçalar için bağlam bilgisi üretmek üzere bir LangChain zinciri oluşturarak başlıyoruz.

# create chunk context generation chain
from langchain.prompts import ChatPromptTemplate
from langchain.schema import StrOutputParser
from langchain_openai import ChatOpenAI

chatgpt = ChatOpenAI(model_name="gpt-4o-mini", temperature=0)

def generate_chunk_context(document, chunk):

    chunk_process_prompt = """You are an AI assistant specializing in research  
                              paper analysis. Your task is to provide brief, 
                              relevant context for a chunk of text based on the 
                              following research paper.

                              Here is the research paper:
                              <paper>
                              {paper}
                              </paper>
                            
                              Here is the chunk we want to situate within the whole 
                              document:
                              <chunk>
                              {chunk}
                              </chunk>
                            
                              Provide a concise context (3-4 sentences max) for this 
                              chunk, considering the following guidelines:

                              - Give a short succinct context to situate this chunk 
                                within the overall document for the purposes of  
                                improving search retrieval of the chunk.
                              - Answer only with the succinct context and nothing 
                                else.
                              - Context should be mentioned like 'Focuses on ....'
                                do not mention 'this chunk or section focuses on...'
                              
                              Context:
                           """
    
    prompt_template = ChatPromptTemplate.from_template(chunk_process_prompt)
    agentic_chunk_chain = (prompt_template
                                |
                            chatgpt
                                |
                            StrOutputParser())
    context = agentic_chunk_chain.invoke({'paper': document, 'chunk': chunk})
    return context

LangChain'i kullanarak araştırma makalelerimizin bölümleri için bağlam bilgisi oluşturmak amacıyla bunu kullanıyoruz.

İşte kısa bir açıklama:

  1. ChatGPT Modeli: Tutarlı çıktılar için ChatOpenAI'yi 0 sıcaklıkla başlatır ve GPT-4o-mini LLM'yi kullanır.
  2. generate_chunk_context işlev:
    • Girdiler: belge (tam makale) ve parça (belirli bölüm).
    • Yapay zekaya, parçanın bağlamını belgeye göre özetlemesini talimatlandıran bir istem oluşturur.
  3. İstemi: LLM'yi, arama sonuçlarını iyileştirmeye ve tekrarlayan ifadelerden kaçınmaya odaklanan kısa (3-4 cümle) bir bağlam oluşturmaya yönlendirir.
  4. Zincir Kurulumu: Yapılandırılmış işleme için istemi, chatgpt modelini ve StrOutputParser()'ı birleştirir.
  5. infaz: Parça için özlü bir bağlam oluşturur ve döndürür.

Daha sonra, her PDF belgesini yüklemek, onu yinelemeli karakter metin bölme kullanarak parçalara ayırmak, yukarıdaki işlem hattını kullanarak her parça için bağlam oluşturmak ve bağlamı her parçanın başına eklemek (önceden eklemek) için bir ön işleme işlevi tanımlıyoruz.

from langchain.document_loaders import PyMuPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
import uuid

def create_contextual_chunks(file_path, chunk_size=3500, chunk_overlap=0):
    print('Loading pages:', file_path)
    loader = PyMuPDFLoader(file_path)
    doc_pages = loader.load()
    print('Chunking pages:', file_path)
    splitter = RecursiveCharacterTextSplitter(chunk_size=chunk_size,
                                              chunk_overlap=chunk_overlap)
    doc_chunks = splitter.split_documents(doc_pages)
    print('Generating contextual chunks:', file_path)
    original_doc = 'n'.join([doc.page_content for doc in doc_chunks])
    contextual_chunks = []
    for chunk in doc_chunks:
        chunk_content = chunk.page_content
        chunk_metadata = chunk.metadata
        chunk_metadata_upd = {
            'id': str(uuid.uuid4()),
            'page': chunk_metadata['page'],
            'source': chunk_metadata['source'],
            'title': chunk_metadata['source'].split('/')[-1]
        }
        context = generate_chunk_context(original_doc, chunk_content)
        contextual_chunks.append(Document(page_content=context+'n'+chunk_content,
                                          metadata=chunk_metadata_upd))
    print('Finished processing:', file_path)
    print()
    return contextual_chunks

Yukarıdaki işlev, PDF araştırma makalelerini daha iyi analiz ve geri alma için bağlamsallaştırılmış parçalara işler. İşte kısa bir açıklama:

  1. Ithalat:
    • PDF yükleme için PyMuPDFLoader'ı ve metni parçalara ayırmak için RecursiveCharacterTextSplitter'ı kullanır.
    • uuid her parça için benzersiz kimlikler üretir.
  2. bağlamsal_parçalar_oluştur işlev:
    • Girdiler: Dosya yolu, parça boyutu ve örtüşme boyutu.
    • Süreç:
      • Belge sayfalarını PyMuPDFLoader kullanarak yükler.
      • Belgeyi RecursiveCharacterTextSplitter kullanarak daha küçük parçalara böler.
    • Her parça için:
      • Meta veriler benzersiz bir kimlik, sayfa numarası, kaynak ve başlıkla güncellenir.
      • Daha önce tanımladığımız generate_chunk_context'i kullanarak parça için bağlamsal bilgi üretir.
      • Bağlamı orijinal parçaya ekler ve ardından onu bir Belge nesnesi olarak bir listeye ekler.
  3. Çıktı: Bağlamsal meta veriler ve içerikle işlenmiş parçaların bir listesini döndürür.

Bu fonksiyon araştırma makalesi PDF'lerimizi yükler, parçalara ayırır ve her parçaya anlamlı bir bağlam ekler. Şimdi bu fonksiyonu PDF'lerimizde şu şekilde çalıştırıyoruz.

from glob import glob

pdf_files = glob('./rag_docs/*.pdf')
paper_docs = []
for fp in pdf_files:
    paper_docs.extend(create_contextual_chunks(file_path=fp, 
                                               chunk_size=3500))

Çıktı:

Sayfalar yükleniyor: ./rag_docs/attention_paper.pdf
Sayfaları parçalama: ./rag_docs/attention_paper.pdf
Bağlamsal parçalar oluşturma: ./rag_docs/attention_paper.pdf
İşlem tamamlandı: ./rag_docs/attention_paper.pdf

Sayfalar yükleniyor: ./rag_docs/resnet_paper.pdf
Sayfaları parçalama: ./rag_docs/resnet_paper.pdf
Bağlamsal parçalar oluşturuluyor: ./rag_docs/resnet_paper.pdf
İşlem tamamlandı: ./rag_docs/resnet_paper.pdf
Kendi ID’n ile mağazalarını oluştur

paper_docs[0]

Çıktı:

Document(metadata={'id': 'd5c90113-2421-42c0-bf09-813faaf75ac7', 'page': 0,
'kaynak': './rag_docs/resnet_paper.pdf', 'başlık': 'resnet_paper.pdf'},
page_content='Kalıcı öğrenme çerçevesinin tanıtımına odaklanır
önemli ölçüde daha derin sinir ağlarının eğitimini kolaylaştırmak için tasarlanmıştır,
kaybolan eğimler ve bozulma gibi zorlukların ele alınması
doğruluk. Kalıntı ağların deneysel başarısını vurgular,
özellikle ImageNet veri kümesindeki performansları ve
2015 yılında birden fazla yarışmayı kazanmada temel rol oynadı.nDerin Kalıntı
Görüntü Tanıma için ÖğrenmeKaiming HenXiangyu ZhangnShaoqing
RennJian SunnMicrosoft Researchn{kahe, v-xiangz, v-shren,
jiansun}@microsoft.comnÖzetDaha derin sinir ağları daha zordur
eğitmek için. Eğitimini kolaylaştırmak için kalıcı bir öğrenme çerçevesi sunuyoruz
...öncekilerden önemli ölçüde daha derin ağlar...')

Yukarıdaki parçada, gerçek parça içeriğinin ardından gelen LLM tarafından oluşturulmuş bazı bağlamsal bilgilere sahip olduğumuzu görebilirsiniz. Son olarak, JSON ve PDF belgelerimizden tüm belge parçalarımızı tek bir listede birleştiriyoruz.

total_docs = wiki_docs_processed + paper_docs
len(total_docs)

Çıktı:

1880

Vektör Veritabanı Dizini Oluşturun ve Anlamsal Alımı Ayarlayın

Şimdi belge parçalarımız için yerleştirmeler oluşturacağız ve bunları vektör veritabanımıza aşağıdaki kodu kullanarak dizine ekleyeceğiz:

from langchain_openai import OpenAIEmbeddings
from langchain_chroma import Chroma

openai_embed_model = OpenAIEmbeddings(model='text-embedding-3-small')
# create vector DB of docs and embeddings - takes < 30s on Colab
chroma_db = Chroma.from_documents(documents=total_docs,
                                  collection_name='my_context_db',
                                  embedding=openai_embed_model,
                                  collection_metadata={"hnsw:space": "cosine"},
                                  persist_directory="./my_context_db")

Daha sonra, kosinüs yerleştirme benzerliğini kullanan ve kullanıcı sorgularına benzeyen ilk 5 belge parçasını alan bir anlamsal alma stratejisi kurduk.

similarity_retriever = chroma_db.as_retriever(search_type="similarity",
                                              search_kwargs={"k": 5})

BM25 Dizini Oluşturun ve Anahtar Kelime Alımını Ayarlayın

Şimdi belge parçalarımız için TF-IDF vektörleri oluşturacağız ve bunları BM25 dizinimize ekleyeceğiz ve aşağıdaki kodu kullanarak kullanıcı sorgularına benzer şekilde en iyi 25 belge parçasını döndürmek için BM5'i kullanacak bir alıcı ayarlayacağız.

from langchain.retrievers import BM25Retriever

bm25_retriever = BM25Retriever.from_documents(documents=total_docs,
                                              k=5)

Toplu Arama ile Hibrit Aramayı Etkinleştir

Şimdi, daha önce tartıştığımız gibi semantik ve anahtar sözcük alımından gelen sonuçları birleştiren ve Karşılıklı Sıra Füzyonu (RRF) kullanan bir topluluk alıcısı kullanarak alım sırasında hibrit aramanın yürütülmesini sağlayacağız. Her alıcıya belirli ağırlıklar da verebiliriz ve bu durumda her alıcıya eşit ağırlık veririz.

from langchain.retrievers import EnsembleRetriever
# reciprocal rank fusion
ensemble_retriever = EnsembleRetriever(
    retrievers=[bm25_retriever, similarity_retriever],
    weights=[0.5, 0.5]
)

Retriever'ı Reranker ile Geliştirme

Şimdi daha önce tartıştığımız yeniden sıralama modelimizi, giriş sorgusuyla alakalı olmalarına göre topluluk alıcısından bağlam belgesi parçalarını yeniden sıralamak için kullanacağız. Burada açık kaynaklı çapraz kodlayıcı yeniden sıralama modeli kullanıyoruz.

from langchain_community.cross_encoders import HuggingFaceCrossEncoder
from langchain.retrievers.document_compressors import CrossEncoderReranker
from langchain.retrievers import ContextualCompressionRetriever

# download an open-source reranker model - BAAI/bge-reranker-v2-m3
reranker = HuggingFaceCrossEncoder(model_name="BAAI/bge-reranker-v2-m3")
reranker_compressor = CrossEncoderReranker(model=reranker, top_n=5)
# Retriever 2 - Uses a Reranker model to rerank retrieval results from the previous retriever
final_retriever = ContextualCompressionRetriever(
    base_compressor=reranker_compressor,
    base_retriever=ensemble_retriever
)

Alma Boru Hattımızı Test Ediyoruz

Şimdi hibrit arama ve yeniden sıralamayı kullanarak arama hattımızı test edeceğiz ve bazı örnek kullanıcı sorgularında nasıl çalıştığını göreceğiz.

from IPython.display import display, Markdown
def display_docs(docs):
    for doc in docs:
        print('Metadata:', doc.metadata)
        print('Content Brief:')
        display(Markdown(doc.page_content[:1000]))
        print()
query = "what is machine learning?"
top_docs = final_retriever.invoke(query)
display_docs(top_docs)

Çıktı:

Meta veri: {'id': '564928', 'sayfa': 1, 'kaynak': 'Vikipedi', 'başlık':
'Makine öğrenimi'

İçerik Özeti:

Makine öğrenimi, bilgisayarlara herhangi bir kısıtlama olmadan öğrenme yeteneği kazandırır.
açıkça programlanmıştır (Arthur Samuel, 1959). Bilgisayarın bir alt alanıdır
bilim. Fikir yapay zekadaki çalışmalardan geldi. Makine
Öğrenme, algoritmaların incelenmesi ve inşasını araştırır ...

Meta veri: {'id': '663523', 'page': 1, 'source': 'Vikipedi', 'title': 'Derin
öğrenme'}

İçerik Özeti:

Derin öğrenme (derin yapılandırılmış öğrenme veya hiyerarşik öğrenme olarak da adlandırılır)
çoğunlukla belirli türdeki makinelerle kullanılan bir tür makine öğrenmesidir
sinir ağları...
Kendi ID’n ile mağazalarını oluştur

query = "what is the difference between transformers and vision transformers?"
top_docs = final_retriever.invoke(query)
display_docs(top_docs)

Çıktı:

Meta veri: {'id': '07117bc3-34c7-4883-aa9b-6f9888fc4441', 'sayfa': 0, 'kaynak':
'./rag_docs/vision_transformer.pdf', 'başlık': 'vision_transformer.pdf'}

İçerik Özeti:

Vizyon Dönüştürücü (ViT) modelinin tanıtımına odaklanıyor.
görüntü sınıflandırma görevlerine saf bir Transformatör mimarisi uygular
görüntü parçalarını belirteç olarak ele almak...

Meta veri: {'id': 'b896c93d-6330-421c-a236-af9437e9c725', 'sayfa': 1, 'kaynak':
'./rag_docs/vision_transformer.pdf', 'başlık': 'vision_transformer.pdf'}

İçerik Özeti:

Vizyon Transformatörünün (ViT) performansına odaklanıyor
evrişimli sinir ağları (CNN'ler), büyük ağların avantajlarını vurgulayarak
ImageNet-21k ve JFT-300M gibi veri kümelerinde ölçek eğitimi. Nasıl tartışılır
ViT, görüntü tanıma kıyaslamalarında son teknoloji sonuçlarına ulaşıyor
CNN'lere özgü belirli tümevarımsal önyargılardan yoksundur. Ek olarak,
Öz-dikkat mekanizmalarıyla ilgili çalışmalara referanslar...

Kendi ID’n ile mağazalarını oluştur

Genel olarak, oldukça iyi çalışıyor ve eklenen bağlamsal bilgilerle doğru bağlam parçalarını elde ediyor gibi görünüyor. Şimdi RAG boru hattımızı oluşturalım.

Bağlamsal RAG Boru Hattımızı Oluşturuyoruz

Şimdi tüm bileşenleri bir araya getirip uçtan uca Bağlamsal RAG boru hattımızı oluşturacağız. Standart bir RAG talimat istemi şablonu oluşturarak başlıyoruz.

from langchain_core.prompts import ChatPromptTemplate

rag_prompt = """You are an assistant who is an expert in question-answering tasks.
                Answer the following question using only the following pieces of 
                retrieved context.
                If the answer is not in the context, do not make up answers, just 
                say that you don't know.
                Keep the answer detailed and well formatted based on the 
                information from the context.
                
                Question:
                {question}
                
                Context:
                {context}
                
                Answer:
            """

rag_prompt_template = ChatPromptTemplate.from_template(rag_prompt)

İstem şablonu alınan bağlam belgesi parçalarını alır ve LLM'ye kullanıcı sorgularını yanıtlamak için bunları kullanmasını söyler. Son olarak, LangChain'in LCEL bildirimsel sözdizimini kullanarak RAG boru hattımızı oluştururuz; bu, boru hattındaki bilgi akışını adım adım açıkça gösterir.

from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI

chatgpt = ChatOpenAI(model_name="gpt-4o-mini", temperature=0)

def format_docs(docs):
    return "nn".join(doc.page_content for doc in docs)

qa_rag_chain = (
    {
        "context": (final_retriever
                      |
                    format_docs),
        "question": RunnablePassthrough()
    }
      |
    rag_prompt_template
      |
    chatgpt
)

Zincir, LangChain kullanarak kullanıcı sorgularını yanıtlamak için alınan belge parçalarını işleyen Retrieval-Augmented Generation (RAG) boru hattımızdır. İşte temel bileşenleri:

  1. Giriş İşleme:
    • "bağlam":
      • final_retriever'ımızla başlar (hibrit arama + yeniden sıralama kullanarak ilgili belgeleri alır).
      • Alınan belgeleri, belgenin içeriğini yapılandırılmış bir dizeye biçimlendiren format_docs fonksiyonuna geçirir.
    • "soru":
      • Kullanıcının sorgusunu herhangi bir değişiklik yapmadan doğrudan geçirmek için RunnablePassthrough()'u kullanır.
  2. Bilgi İstemi Şablonu:
    • Biçimlendirilmiş bağlamı ve kullanıcı sorusunu rag_prompt_template'de birleştirir.
    • Bu, modelin yalnızca sağlanan bağlama göre yanıt vermesini sağlar.
  3. Model Yürütme:
    • Doldurulan istemi, kesin yanıtlar için 4 sıcaklıkla yanıt oluşturma amacıyla chatgpt modeline (gpt-0o-mini) geçirir.

Bu zincir, LLM'nin soruları yalnızca ilgili alınan bilgileri kullanarak yanıtlamasını ve halüsinasyonlar olmadan bağlam odaklı yanıtlar sağlamasını sağlar. Şimdi geriye kalan tek şey RAG Sistemimizi test etmek!

Bağlamsal RAG Sistemimizi Test Ediyoruz

Şimdi Bağlamsal RAG Sistemimizi aşağıdaki örneklerde gösterildiği gibi bazı örnek sorgular üzerinde test edelim.

from IPython.display import display, Markdown
query = "What is machine learning?"
result = qa_rag_chain.invoke(query)
display(Markdown(result.content))

Çıktı

Makine öğrenimi, bilgisayar biliminin bilgisayarlara bilgi sağlayan bir alt alanıdır.
açıkça programlanmadan öğrenme yeteneği. Kavram
Arthur Samuel tarafından 1959 yılında tanıtılan ve yapay kökenli olan
zeka. Makine öğrenimi, zekanın incelenmesi ve inşasına odaklanır.
verilerden öğrenebilen ve tahminlerde bulunabilen veya kararlar alabilen algoritmalar
Bu algoritmalar programlanmış talimatları takip eder ancak aynı zamanda
Örnek girdilerden modeller oluşturarak performanslarını uyarlayabilir ve geliştirebilirler.

Makine öğrenimi, özellikle tasarım ve
açık algoritmaları programlamak pratik değildir. Bazı yaygın uygulamalar
Makine öğrenmesi şunları içerir:

1. Spam filtreleme
2. Ağ saldırganlarının veya kötü niyetli içeridekilerin tespiti
3. Optik karakter tanıma (OCR)
4. Arama motorları
5. Bilgisayarla görme

Makine öğrenimi alanında, derin öğrenme olarak bilinen bir alt küme vardır
öğrenme, öncelikli olarak belirli tipteki sinir ağlarını kullanır. Derin
öğrenme, gözetimsiz, yarı gözetimli ve gözetimsiz olabilen öğrenme oturumlarını içerir
denetlenen veya denetlenen ve genellikle birden fazla katmanı içerir
işleme, modelin giderek daha soyut öğrenmesine olanak tanır
verilerin temsilleri.

Genel olarak, makine öğrenimi, yetenekte önemli bir ilerlemeyi temsil eder
Bilgisayarların bilgiyi işlemesi ve bilgiye dayalı kararlar alması
o bilgi.

query = "How is a resnet better than a CNN?"
result = qa_rag_chain.invoke(query)
display(Markdown(result.content))

Çıktı

ResNet (Artık Ağ), geleneksel bir CNN'den daha iyi kabul edilir
(Evrişimsel Sinir Ağı) birkaç nedenden dolayı, özellikle
daha derin mimarileri eğitme ve daha iyi performans elde etme bağlamında
çeşitli görevler. İşte ResNets'in standart CNN'lere göre temel avantajları:

1. Bozulma Sorununun Azaltılması: Geleneksel CNN'ler genellikle şu sorunla karşı karşıyadır:
bozulma sorunu, ağın derinliğinin artırılmasının
daha yüksek eğitim hatası. ResNets bu sorunu kısayolu tanıtarak ele alır
geri yayılım sırasında eğimlerin daha kolay akmasına izin veren bağlantılar.
Bu, kalan öğrenmenin daha derin ağları optimize etmesini kolaylaştırır
çerçeve, modelin artık eşlemeleri öğrenmesine olanak tanır
orijinal referans alınmamış eşlemeler.

2. Arttırılmış Derinlikle Daha Yüksek Doğruluk: ResNet'ler önemli ölçüde daha derin olabilir
performans düşüşü yaşamadan geleneksel CNN'lerden daha iyidir.
Örneğin, 50, 101 veya hatta 152 katmana sahip ResNet mimarileri
daha sığ ağlara kıyasla daha iyi doğruluk elde ettiği gösterilmiştir.
deneysel sonuçlar, daha derin ResNet'lerin önemli ölçüde üretebileceğini göstermektedir
ImageNet ve CIFAR-10 gibi veri kümelerinde daha iyi sonuçlar.

3. Genelleme Performansı: ResNet'ler iyi genelleme sergiler
çeşitli tanıma görevlerinde performans. Bağlam, şunu belirtiyor
Daha Hızlı R-CNN çerçevesinde VGG-16'nın ResNet-101 ile değiştirilmesi,
COCO gibi zorlu veri kümelerinde tespit ölçümlerinde kayda değer artış,
ResNet'lerin görülmemiş verilere daha iyi genelleme yapabileceğini gösterir.

4. Mimari Verimlilik: Daha derin olmalarına rağmen ResNet'ler daha düşük
VGG-16 gibi geleneksel mimarilere kıyasla hesaplama karmaşıklığı.
Örneğin, 152 katmanlı bir ResNet'in karmaşıklığı daha düşüktür (11.3 milyar FLOP)
VGG-16'dan (15.3 milyar FLOP) daha verimli eğitim ve
çıkarım.

5. Yarışmalarda Deneysel Başarı: ResNets, yarışmalarda en üst sıralarda yer aldı.
ILSVRC ve COCO 2015 gibi çeşitli yarışmalar,
gerçek dünya uygulamalarında etkililik. Bağlam, modellerin
derin kalıntı ağlarına dayalı olarak birçok alanda birincilik kazandı,
üstün performanslarını sergiliyorlar.

Özetle, ResNets, geleneksel CNN'leri etkili bir şekilde ele alarak geliştirir
bozulma sorunu, daha derin mimarilerin eğitilmesine olanak tanır
başarılı bir şekilde, daha yüksek doğruluk elde ederek ve güçlü bir şekilde göstererek
farklı görevler arasında genelleme yetenekleri.

query = "How does a resnet work?"
result = qa_rag_chain.invoke(query)
display(Markdown(result.content))

Çıktı

ResNet veya Kalan Ağ, kalan öğrenme ilkesine göre çalışır
Derin sinir ağlarının eğitimiyle ilişkili zorlukların üstesinden gelmek.
İşte nasıl çalıştığına dair detaylı açıklama:

ResNet'in Temel Kavramları

1. Kalıntı Haritalama:

İstenen temel eşlemeyi (H(x)) doğrudan öğrenmek yerine, ResNets
kalıntı eşlemesini öğrenmeye odaklanın ( F(x) = H(x) - x ). Bu, şu anlama gelir:
ağ, istenen çıktı ile girdi arasındaki farkı öğrenir,
Genellikle optimize edilmesi daha kolaydır.

2. Kısayol Bağlantıları:

ResNets, bir veya daha fazla katmanı atlayan kısayol bağlantıları kullanır. Bunlar
bağlantılar kimlik eşlemesini gerçekleştirir ve girdinin ( x ) eklenmesine izin verir
doğrudan yığılmış katmanların çıktısına. Bu matematiksel olarak yapılabilir
şu şekilde temsil edilir: [ H(x) = F(x) + x ]

Girişin (x) eklenmesi, kaybolan eğimin azaltılmasına yardımcı olur
sorunu çözerek ağın öğrenmesini kolaylaştırır.

3. Optimizasyonun Faydaları:

( F(x) + x ) formülasyonu, ağın kalıntıyı (
Kimlik eşlemesi optimum ise F(x) ) sıfıra doğru. Bu genellikle
özellikle derinliğin karmaşık bir eşlemeyi doğrudan yerleştirmekten daha kolay olması
ağ artar.

mimari

1. ResNet'ler 18, 34, 50, 101 gibi çeşitli derinliklerde oluşturulabilir.
ve hatta 152 katman. Mimari şunları içerir:

Evrişimsel Katmanlar: Bu katmanlar giriş görüntülerinden özellikleri çıkarır.

Toplu Normalizasyon: Her bir evrişimden sonra stabilize etmek ve
eğitimi hızlandırmak.

Havuzlama Katmanları: Özellik haritalarının alt örneklemesi için kullanılır.

Tam Bağlantılı Katmanlar: Sınıflandırma görevleri için ağın sonunda.

Performans

1. ResNet'ler derinlik arttıkça doğrulukta önemli gelişmeler gösterdi
geleneksel düz ağların aksine, daha yüksek oranda zarar gören artışlar
artan derinlikle eğitim hataları. Örneğin, 34 katmanlı bir ResNet
18 katmanlı ResNet'i geride bırakarak daha derin ağların kullanılabileceğini gösteriyor
Performansta bozulma olmadan etkili bir şekilde eğitilmek.

Ampirik Sonuçlar

1. ImageNet ve CIFAR-10 gibi veri kümeleri üzerinde yapılan kapsamlı deneyler
ResNets'in etkinliğini doğruladılar. En son teknolojiye ulaştılar
2015 katmanlı bir tekneyle ILSVRC 152 yarışmasını kazanmak da dahil olmak üzere sonuçlar
VGG-16/19 gibi önceki modellere göre daha düşük karmaşıklığa sahip olan ResNet.

Özetle, ResNets kalıcı öğrenmeyi ve kısayol bağlantılarını kullanır
çok derin ağların eğitimini kolaylaştırarak optimizasyonun üstesinden gelmek
tipik olarak artan derinlikle ortaya çıkan zorluklar. Bu mimari
Çeşitli görüntü tanıma görevlerinde oldukça etkili olduğu kanıtlanmıştır.

query = "What is the difference between AI, ML and DL?"
result = qa_rag_chain.invoke(query)
display(Markdown(result.content))

İşte Çıktı

Yapay Zeka, Makine Öğrenmesi ve Öğrenme (DL) arasındaki farklar şu şekilde özetlenebilir:

Yapay Zeka (AI)

1. Tanım: Yapay zeka, bir bilgisayar programının veya makinesinin
düşün ve öğren, insan bilişini taklit eder. Geniş bir yelpazeyi kapsar
Makineleri "akıllı" hale getirmeyi amaçlayan teknolojiler ve uygulamalar.

2. Kökeni: "Yapay Zeka" terimi John McCarthy tarafından ortaya atıldı.
1955

3. İşlevsellik: Yapay zeka sistemleri harici verileri yorumlayabilir, onlardan öğrenebilir ve
belirli hedeflere ulaşmak için uyarlayın. Teknoloji ilerledikçe, görevler bir kez
optik karakter tanıma gibi zeka gerektirdiği düşünülen
artık yapay zeka olarak sınıflandırılmıyor.

Makine Öğrenmesi (ML)

1. Tanım: ML, yapay zekanın, yapay zekanın geliştirilmesine odaklanan bir alt alanıdır.
bilgisayarların öğrenmesine ve tahminler yapmasına olanak tanıyan algoritmalar
açıkça programlanmadan veriler.

2. İşlevsellik: ML algoritmaları örnek girdilerden modeller oluşturur ve
Verilere dayalı kararlar veya tahminler. Özellikle şu durumlarda faydalıdır:
spam gibi geleneksel programlamanın pratik olmadığı senaryolar
filtreleme ve bilgisayarlı görme.

Derin Öğrenme (DL)

1. Tanım: DL, öncelikle makine öğreniminin uzmanlaşmış bir alt kümesidir.
çok katmanlı sinir ağlarını (çok katmanlı sinir ağları) kullanır
Veri işleme.

2. İşlevsellik: Derin öğrenmede, işlenen bilgiler
her eklenen katmanla giderek daha soyut hale geliyor ve bu da onu özellikle
konuşma ve görüntü tanıma gibi karmaşık görevler için etkilidir. DL modelleri
biyolojik sinir sisteminden esinlenmiştir ancak önemli ölçüde farklıdır
İnsan beyninin yapısal ve işlevsel özellikleri.

Özetle, AI, ML ve DL'yi içeren genel alandır ve ML,
AI içinde verilerden öğrenmeyi sağlayan belirli bir yaklaşım olmak ve DL
derin sinir ağlarını kullanan ML'nin daha ileri bir uzmanlığıdır
daha karmaşık veri işleme görevleri.

query = "What is the difference between transformers and vision transformers?"
result = qa_rag_chain.invoke(query)
display(Markdown(result.content))

Çıktı

Geleneksel Transformatörler ile Vision arasındaki temel fark
Transformatörler (ViT) uygulamaları ve giriş işleme yöntemlerinde yatmaktadır.

1. Giriş Gösterimi:

Transformatörler: Doğal dil işlemede (NLP), Transformatörler şu şekilde çalışır:
Genellikle gömülü ifadeler olarak temsil edilen belirteç (kelime) dizileri.
Giriş, bu token yerleştirmelerinin 1 boyutlu dizisidir.

Görüntü Dönüştürücüler (ViT): ViT, görüntü için Transformatör mimarisini uyarlar
sınıflandırma görevleri, görüntü yamalarını belirteçler olarak ele alarak. Bir görüntü
sabit boyutlu parçalara bölünür, daha sonra düzleştirilir ve doğrusal olarak
bir diziye gömülür. Bu yama yerleştirme dizisi,
Transformatör, NLP'de kelime yerleştirmelerinin işlenme biçimine benzer.

2. Mimarlık:

Transformatörler: Standart Transformatör mimarisi katmanlardan oluşur
çok başlı öz-dikkat ve ileri beslemeli sinir ağları, tasarlanmıştır
Sıralı verilerdeki ilişkileri ve bağımlılıkları yakalayın.

Vizyon Transformatörleri (ViT): ViT, çekirdek Transformatör'ü korurken
mimari, 2B görüntü verilerini barındırmak için girişi değiştirir. Model
mekansallığı korumak için konum yerleştirmeleri gibi ek bileşenler içerir
yamalar hakkında bilgi, yamaları anlamak için çok önemlidir
Görüntülerin yapısı.

3. Performans ve Verimlilik:

Transformatörler: NLP'de Transformatörler, şu özellikleri nedeniyle standart haline gelmiştir:
büyük veri kümelerinde ölçeklenebilme ve iyi performans gösterebilme yeteneği, genellikle
önemli hesaplama kaynakları.

Görüntü Dönüştürücüler (ViT): ViT, saf bir Dönüştürücünün şunları başarabileceğini göstermiştir:
Görüntü sınıflandırmasında rekabetçi sonuçlar, genellikle geleneksel yöntemlerden daha iyi performans gösterir
verimlilik ve ölçeklenebilirlik açısından evrişimli sinir ağları (CNN'ler)
büyük veri kümeleri üzerinde önceden eğitildiğinde. ViT önemli ölçüde daha az gerektirir
son teknoloji CNN'lerle karşılaştırıldığında eğitilecek hesaplama kaynakları,
Görüntü tanıma görevleri için umut vadeden bir alternatiftir.

Özetle, her iki mimari de Transformer çerçevesini kullanırken,
Görüntü Dönüştürücüler, giriş ve işleme yöntemlerini etkili bir şekilde uyarlar
görüntü verilerini işleyerek performansta önemli avantajlar elde eder ve
Bilgisayarlı görüş alanında kaynak verimliliği.

Genel olarak, Bağlamsal RAG Sistemimizin kullanıcı sorgularına yüksek kalitede yanıtlar üretme konusunda oldukça iyi bir iş çıkardığını görebilirsiniz.

Bağlamsal RAG'ı Neden Önemsiyoruz?

Hibrit Arama ve Yeniden Sıralama ile Bağlamsal RAG Sisteminin uçtan uca çalışan bir prototipini uyguladık. Peki neden böyle bir sistem inşa etmekle ilgilenmelisiniz? Gerçekten çabaya değer mi? Sistemi her zaman kendi verileriniz üzerinde test etmeli ve kıyaslama yapmalısınız, ancak Anthropic'in bazı kıyaslamalar çalıştırdığında ve Yeniden Sıralanmış Bağlamsal Yerleştirme ve Bağlamsal BM25'in ilk 20 parça alma başarısızlık oranını %67 (5.7% → 1.9%) oranında azalttığını bulduğunda elde ettiği sonuçlar şunlardır. Bu, aşağıdaki şekilde gösterilmiştir.

Hibrit Arama ve Yeniden Sıralamaların, düzenli veya bağlamsal arama olmasına bakılmaksızın zaman ayırmaya değer olduğu oldukça açıktır ve zamanınız ve çabanız varsa, bağlamsal aramalara da kesinlikle zaman ayırmalısınız!

Sonuç 

Bunu okuyorsanız, bu kapsamlı rehberde sonuna kadar doğru kalma çabalarınızı takdir ediyorum! Burada, özellikle parçalama ve alma ile ilgili olarak Naive RAG sistemlerindeki mevcut zorlukların derinlemesine bir anlayışını ele aldık. Daha sonra hibrit arama, yeniden sıralama, bağlamsal alma nedir, Anthropic'in son çalışmalarından ilham aldık ve bağlamsal oluşturma, vektör arama, anahtar kelime arama, hibrit arama, topluluk alma, yeniden sıralamayı ele almak için kendi mimarimizi tasarladık ve bunları yerleşik Hibrit Arama ve Yeniden Sıralama ile kendi Bağlamsal RAG Sistemimizi oluşturmak için bir araya getirdik! Şuraya mutlaka göz atın bu Colab not defteri Koda kolayca erişebilmek için bu sistemi daha da özelleştirmeyi ve geliştirmeyi deneyin!

Sıkça Sorulan Sorular

S1. Geri Alma Artırılmış Üretim (RAG) sistemi nedir?

Cevap: RAG sistemleri, ilgili bağlama dayalı yanıtlar üretmek için bilgi alma işlemini dil modelleriyle birleştirir; bu yanıtlar çoğunlukla özel veri kümelerinden alınır.

S2. Naif RAG sistemlerinin sınırlamaları nelerdir?

Cevap. Saf RAG sistemleri genellikle belgeleri bağımsız parçalara böler, bağlamı kaybeder ve geri alma doğruluğunu ve yanıt kalitesini etkiler.

S3. RAG sistemlerinde hibrit arama yaklaşımı nedir?

Cevap: Hibrit arama, alma doğruluğunu ve bağlam alaka düzeyini iyileştirmek için anlamsal (gömme tabanlı) ve anahtar sözcük (BM25/TF-IDF) aramalarını birleştirir.

S4. Bağlamsal geri çağırma RAG sistemlerini nasıl iyileştirir?

Cevap: Bağlamsal arama, ek açıklayıcı bağlamla belge parçalarını zenginleştirir, arama sonuçlarında alaka düzeyini ve tutarlılığı artırır.

S5. Hibrit RAG sistemlerinde yeniden sıralamanın rolü nedir?

Cevap: Yeniden sıralama, alınan belge parçalarını alaka düzeyine göre önceliklendirir ve dil modeli tarafından üretilen yanıtların kalitesini artırır.

İlgili Makaleler

spot_img

Son Makaleler

spot_img