AI Engineering Academy · Ders

Bağlamsal Sıkıştırma ve İlgililik Filtreleme

Getirilen parçaları LLM'ye aktarmadan önce ilgisiz cümleleri çıkarmak için bağlamsal sıkıştırma uygulayın; böylece gürültüyü azaltıp belirteçlerden tasarruf edin.

3. ders / 413 adım

Bağlamsal Sıkıştırma ve İlgililik Filtreleme, CoddyKit'te ücretsiz bir AI Engineering Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Engineering Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Engineering Academy kursu toplamda 4 dersten oluşur.

Gürültülü Getirilen Parçalarla İlgili Sorun

Getirilen parçalar çoğu zaman karma ilgililikte içerik barındırır. Veritabanı indeksleme hakkında 500 belirteçlik bir parça, sorgunun ilk iki cümlesini yanıtlayabilir; ancak yedekleme işlemleri hakkında ilgisiz altı cümle de içerebilir. Bu parçanın tamamını LLM'ye göndermek belirteçleri boşa harcar, sinyal-gürültü oranını düşürür ve modelin ilgili cümleler yerine ilgisiz bölüme dayalı bir yanıt üretmesine neden olabilir.

Bağlamsal Sıkıştırma Nedir?

Bağlamsal sıkıştırma, getirilen her parçayı alıp LLM'ye aktarmadan önce yalnızca sorguyla ilgili cümleleri çıkaran bir getirme sonrası adımıdır. Özgün parça en ilgili kısımlarına sıkıştırılır; böylece belirteç kullanımı azalır ve yanıt kalitesi artar. LangChain'in ContextualCompressionRetriever bileşeni, bu çıkarma işlemini gerçekleştiren bir sıkıştırıcı bileşeniyle herhangi bir getiriciyi sarar.

from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import LLMChainExtractor
from langchain_openai import ChatOpenAI

# LLMChainExtractor uses an LLM to extract the relevant portion
llm = ChatOpenAI(model='gpt-4o-mini', temperature=0)
compressor = LLMChainExtractor.from_llm(llm)

compression_retriever = ContextualCompressionRetriever(
    base_compressor=compressor,
    base_retriever=base_retriever,
)

results = compression_retriever.invoke('how does HNSW indexing work?')
for doc in results:
    print(len(doc.page_content), 'chars:', doc.page_content[:150])

LLMChainFilter: İlgililik Filtreleme

Parçalardan cümleleri çıkarmak yerine LLMChainFilter ikili bir karar verir: Bu parça sorguyla ilgili mi, değil mi? İlgisiz parçalar LLM'ye ulaşmadan tamamen çıkarılır. Bu yöntem, çıkarma işleminden daha ucuzdur (LLM çağrısı daha kısadır) ve parçaların kısa ve tutarlı olduğu, kısmi çıkarmanın yarar sağlamadığı durumlarda kullanışlıdır. Başlangıçta getirilen parçaların genellikle %20-40'ı filtrelenir.

from langchain.retrievers.document_compressors import LLMChainFilter

filter_compressor = LLMChainFilter.from_llm(
    llm=ChatOpenAI(model='gpt-4o-mini', temperature=0)
)

filtering_retriever = ContextualCompressionRetriever(
    base_compressor=filter_compressor,
    base_retriever=base_retriever,
)

# Fetch 10 docs, filter drops irrelevant ones
results = filtering_retriever.invoke('what are the pgvector distance operators?')
print(f'{len(results)} chunks passed the relevance filter')

Gömme Tabanlı İlgililik Filtreleme

Filtreleme için LLM kullanmak gecikme ve maliyet ekler. Daha ucuz bir alternatif olan gömme tabanlı filtreleme, sorgu gömmesiyle her parçanın gömmesi arasındaki kosinüs benzerliğini hesaplar ve benzerlik eşiğinin altındaki parçaları çıkarır. Bu yöntem belirlenimlidir, hızlıdır ve ücretsizdir; ek bir LLM çağrısı yapmadan getirme sırasında zaten hesaplanmış gömmeleri yeniden kullanır.

from langchain.retrievers.document_compressors import EmbeddingsFilter
from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings()
embeddings_filter = EmbeddingsFilter(
    embeddings=embeddings,
    similarity_threshold=0.76,  # cosine similarity threshold
)

embedding_retriever = ContextualCompressionRetriever(
    base_compressor=embeddings_filter,
    base_retriever=base_retriever,
)

results = embedding_retriever.invoke('BM25 hyperparameter tuning')
print(f'Filtered to {len(results)} relevant chunks')

Birden Çok Sıkıştırıcıyı Zincirleme

DocumentCompressorPipeline kullanarak birden çok sıkıştırıcıyı sırayla zincirleyebilirsiniz. Yaygın bir örüntü, önce açıkça ilgisiz parçaları kaldırmak için hızlı bir gömme tabanlı filtre uygulamak, ardından uzun parçaları cümlelere ayırmak için cümle bölme işlemi yapmak ve son olarak en ilgili cümleleri almak için LLM ile çıkarma uygulamaktır. Bu katmanlı yaklaşım, maliyet ve isabet arasında denge kurar.

from langchain.retrievers.document_compressors import DocumentCompressorPipeline
from langchain_community.document_transformers import EmbeddingsRedundantFilter
from langchain_text_splitters import CharacterTextSplitter

# Step 1: split chunks into individual sentences
sentence_splitter = CharacterTextSplitter(
    chunk_size=200,
    chunk_overlap=0,
    separator='. ',
)

# Step 2: remove redundant sentences via embeddings
redundant_filter = EmbeddingsRedundantFilter(embeddings=OpenAIEmbeddings())

# Step 3: keep only relevant sentences
relevance_filter = EmbeddingsFilter(embeddings=OpenAIEmbeddings(), similarity_threshold=0.76)

pipeline = DocumentCompressorPipeline(
    transformers=[sentence_splitter, redundant_filter, relevance_filter]
)

piped_retriever = ContextualCompressionRetriever(
    base_compressor=pipeline,
    base_retriever=base_retriever,
)

Yinelenen Parçaları Kaldırma

Birden çok getirilen parça temelde aynı şeyi söylüyorsa bunların tamamını LLM'ye göndermek, bilgi eklemeden belirteçleri boşa harcar. EmbeddingsRedundantFilter, ikili kosinüs benzerliğini hesaplayarak ve önceden seçilmiş parçalara fazla benzeyen parçaları çıkararak neredeyse yinelenen parçaları kaldırır. Bu, alım sırasında yüksek örtüşme ayarları nedeniyle derleminizde çok sayıda örtüşen parça bulunduğunda özellikle değerlidir.

from langchain_community.document_transformers import EmbeddingsRedundantFilter
from langchain_core.documents import Document

redundant_filter = EmbeddingsRedundantFilter(
    embeddings=OpenAIEmbeddings(),
    similarity_threshold=0.95,  # treat docs with >95% cosine sim as duplicates
)

# Simulate near-duplicate documents
docs = [
    Document(page_content='pgvector is a PostgreSQL extension for vector similarity search'),
    Document(page_content='pgvector extends PostgreSQL to support vector similarity search'),  # near duplicate
    Document(page_content='HNSW and IVFFlat are the two index types in pgvector'),
]

filtered = redundant_filter.transform_documents(docs, query='')
print(f'Kept {len(filtered)} of {len(docs)} documents after deduplication')

Cümle Düzeyinde İlgililik Çıkarma

İlgili içeriğin uzun belgelerin geneline dağıldığı durumlarda, çapraz kodlayıcıyla yapılan cümle düzeyinde çıkarma en yüksek kesinliği sağlar. Getirilen parçadaki her cümleyi sorguya göre puanlayın, yalnızca eşik üzerindeki cümleleri tutun ve sıkıştırılmış bir belge oluşturun. Bu yaklaşım, ilgili cümlelerin tamamını korurken bağlam boyutunu genellikle %40-70 oranında azaltır.

from sentence_transformers import CrossEncoder
import re

sentence_reranker = CrossEncoder('cross-encoder/ms-marco-MiniLM-L-6-v2')

def compress_with_cross_encoder(
    query: str, chunk: str, min_score: float = 0.0
) -> str:
    sentences = re.split(r'(?<=[.!?]) +', chunk)
    if len(sentences) <= 1:
        return chunk

    pairs = [[query, s] for s in sentences]
    scores = sentence_reranker.predict(pairs)

    relevant = [
        sentence
        for sentence, score in zip(sentences, scores)
        if float(score) >= min_score
    ]
    return ' '.join(relevant) if relevant else chunk

Sıkıştırmayla Belirteç Bütçesini Yönetme

Bağlamsal sıkıştırma, etkili bir belirteç bütçesi yönetimi aracıdır. Bağlam penceresi sınırlı bir modele 5 belge göndermek istiyorsanız her belgeyi 500 belirteçten 100 ilgili belirtece sıkıştırmak, 5 kat daha fazla bilgiyi sığdırmanızı sağlar. Bu, daha kısa bağlam pencerelerine ve daha sıkı gecikme gereksinimlerine sahip GPT-4o-mini gibi daha küçük ve hızlı modellerle çalışırken özellikle değerlidir.

def compress_to_budget(
    query: str,
    docs: list[str],
    total_token_budget: int = 2000,
    tokens_per_char: float = 0.25,
) -> list[str]:
    compressed = []
    used_tokens = 0

    for doc in docs:
        compressed_doc = compress_with_cross_encoder(query, doc)
        doc_tokens = int(len(compressed_doc) * tokens_per_char)

        if used_tokens + doc_tokens <= total_token_budget:
            compressed.append(compressed_doc)
            used_tokens += doc_tokens
        else:
            break  # stop when budget is exhausted

    print(f'Using {used_tokens} tokens across {len(compressed)} docs')
    return compressed

Sıkıştırma Kalitesini Ölçme

Sıkıştırma bir risk oluşturur: sorguyu yanıtlamak için kritik olan bir cümleyi yanlışlıkla kaldırabilirsiniz. Sıkıştırılmış bağlamın doğru yanıtı hâlâ destekleyip desteklemediğini denetleyen RAGAS veya özel bir LLM değerlendiricisi kullanarak sıkıştırma öncesi ve sonrası sadakat puanlarını karşılaştırın. Sıkıştırmadan sonra sadakat düşerse eşiği azaltın veya filtreleme yerine çıkarmaya geçin.

def measure_compression_faithfulness(query, original_docs, compressed_docs, llm):
    # Use LLM to check if answer from compressed context matches
    # answer from full context
    def generate_answer(docs, q):
        context = '\n'.join(docs)
        resp = llm.invoke(f'Answer from context:\n{context}\nQ: {q}')
        return resp.content

    full_answer = generate_answer([d.page_content for d in original_docs], query)
    comp_answer = generate_answer(compressed_docs, query)

    # Check semantic similarity between answers
    vecs = [embed(full_answer), embed(comp_answer)]
    sim = cosine_similarity(vecs[0], vecs[1])
    print(f'Answer similarity after compression: {sim:.3f}')
    return sim

Sıkıştırmayı Ne Zaman Atlamalısınız?

Bağlamsal sıkıştırma her zaman yararlı değildir. Kısa ve tutarlı parçalar için (200 belirtecin altında) parçanın tamamı genellikle ilgilidir ve sıkıştırma yalnızca gecikme ekler. Yanıtın bir prosedürün tüm bölümlerine (örneğin numaralandırılmış bir adım dizisine) bağlı olduğu teknik belgelerde, tek tek cümleleri filtrelemek kritik adımları kaldırabilir. Sıkıştırmayı dikkatli uygulayın ve belirli kullanım alanınızda yanıt kalitesini iyileştirdiğini her zaman doğrulayın.

Üretime Hazır Sıkıştırma İşlem Hattı

Sağlam bir üretim sıkıştırma işlem hattı; gömme tabanlı filtrelemeyi (hızlı, ucuz), yinelenen içeriği kaldırmayı (aynı bilgiyi tekrarlamaktan kaçınmak için) ve isteğe bağlı çapraz kodlayıcıyla cümle çıkarmayı (isabetli ancak daha yavaş) birleştirir. Hızlı aşamaları önce çalıştırın ve maliyetli, LLM tabanlı aşamayı yalnızca yüksek değerli sorgular için veya hızlı aşamalardan sonra çok fazla parça kaldığında uygulayın. Bu uyarlamalı yaklaşım hem maliyeti hem de kaliteyi en iyi duruma getirir.

class AdaptiveCompressor:
    def __init__(self, embeddings, cross_encoder=None, threshold=0.76):
        self.emb_filter = EmbeddingsFilter(embeddings=embeddings,
                                           similarity_threshold=threshold)
        self.dedup = EmbeddingsRedundantFilter(embeddings=embeddings)
        self.cross_encoder = cross_encoder

    def compress(self, query: str, docs, use_cross_encoder: bool = False):
        # Stage 1: embedding filter
        docs = self.emb_filter.compress_documents(docs, query=query)
        # Stage 2: deduplication
        docs = self.dedup.transform_documents(docs, query=query)
        # Stage 3: optional sentence-level extraction
        if use_cross_encoder and self.cross_encoder:
            docs = [
                type(d)(page_content=compress_with_cross_encoder(
                    query, d.page_content
                ), metadata=d.metadata)
                for d in docs
            ]
        return docs

Hızlı Kontrol

Bu derste bağlamsal sıkıştırmayı anlayıp anlamadığınızı test edin.

Ders Özeti

Bu derste şunları öğrendiniz: bağlamsal sıkıştırma, alınan parçalar LLM'ye ulaşmadan önce ilgisiz içeriği ayıklayarak veya filtreleyerek gürültüyü azaltır; DocumentCompressorPipeline, birden fazla sıkıştırıcıyı (filtreleme, yinelenenleri kaldırma, ayıklama) sırayla birbirine bağlar ve gömme tabanlı filtreleme, çoğu senaryoda LLM tabanlı sıkıştırmaya hızlı ve düşük maliyetli bir alternatif sunar. Sıkıştırma, belirteç bütçelerini yönetmenize yardımcı olur ve yanıt kalitesini artırır. Sırada, yeniden sıralamanın getirme kalitesi üzerindeki gerçek etkisini ölçüyoruz.

Başlamak ücretsiz

Yapay zeka eğitmeniyle Python öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
30
Dersler
120

Sıkça Sorulan Sorular

“Bağlamsal Sıkıştırma ve İlgililik Filtreleme” dersi ücretsiz mi?

Evet — “Bağlamsal Sıkıştırma ve İlgililik Filtreleme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Engineering Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Engineering Academy kursu toplamda 4 dersten oluşur.

“Bağlamsal Sıkıştırma ve İlgililik Filtreleme” dersinde ne öğreneceğim?

Getirilen parçaları LLM'ye aktarmadan önce ilgisiz cümleleri çıkarmak için bağlamsal sıkıştırma uygulayın; böylece gürültüyü azaltıp belirteçlerden tasarruf edin. AI Engineering Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

AI Engineering Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te AI Engineering Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Bağlamsal Sıkıştırma ve İlgililik Filtreleme” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu AI Engineering Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her AI Engineering Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. İki Aşamalı Getirmenin İşe Yaramasının Nedeni
  2. Cohere ve BGE ile Çapraz Kodlayıcı Yeniden Sıralaması
  3. Bağlamsal Sıkıştırma ve İlgililik Filtreleme
  4. Yeniden Sıralamanın Etkisini Ölçme
← AI Engineering Academy Sayfasına Dön