Belge Dönüştürücü

LangChain'in belge dönüştürücüsü, metin içeriğini parçalara ayırarak büyük bir makaleyi birden çok küçük parçaya bölmek gibi temel işlevlere sahiptir. Bunun nedeni, genellikle büyük modellerin özgünlük uzunluğuna sınırlar getirmesi ve tüm içeriği yapay zekaya iletememeleridir. Bazı büyük modellerin çok uzun özgünlük uzunluklarına izin vermesine rağmen, maliyet açısından bu kadar uzun içeriği yapay zekaya iletmek pratik değildir. Sona dek, içerik ne kadar uzun olursa, API çağrı maliyeti o kadar yüksektir (yerel olarak dağıtılan açık kaynaklı modeller için bile, uzun içerik daha fazla GPU belleği gerektirir ve daha yavaş çıkarım yapar). Mantıklı yaklaşım, yapay zeka modeline istek gönderirken ilişkili içerik parçalarını arka plan bilgisi olarak birleştirmek ve özgünlük uzunluğunu oluşturmak.

LangChain'in kullandığı birçok yerleşik belge dönüştürücü, belge içeriğini kolayca bölebilir, birleştirebilir ve filtreleyebilir.

Metin Ayırıcı

Büyük metin bloklarıyla uğraşırken metni parçalara ayırmak zorundasınız. Basit gibi görünse de burada potansiyel karmaşıklıklar bulunmaktadır. İdeal olarak, semantik olarak ilişkili metin segmentlerini bir arada tutmak istersiniz. "Semantik olarak ilişkili" terimi burada, metin türüne bağlı olabilir.

Temel düzeyde, metin ayırıcının çalışma prensibi şu şekildedir:

  1. Metni küçük, semantik açıdan anlamlı bloklara bölmek (genellikle cümleler).
  2. Bu küçük blokları belirli bir boyuta ulaşana kadar (bir işlev tarafından ölçülen) bir araya getirmeye başlamak.
  3. Bu boyuta ulaşıldığında, bloğu kendi metin segmenti olarak ele almak ve bağlamı korumak için bazı örtüşmeyle yeni bir metin bloğu oluşturmaya başlamak.

Bu, metin ayırıcısını iki farklı eksende özelleştirebileceğiniz anlamına gelir:

  1. Metni nasıl böleceğiniz
  2. Blokların boyutunu nasıl ölçeceğiniz

Örnek

Varsayılan önerilen metin ayırıcı, RecursiveCharacterTextSplitter'dir. Bu metin ayırıcı, karakter listesini kabul eder. Blokları ilk karaktere göre oluşturmayı dener, ancak herhangi bir blok çok büyükse, bir sonraki karaktere geçmeye devam eder. Varsayılan olarak, bölünmeye çalışılan karakterler ["\\\\n\\\\n", "\\\\n", " ", ""]'tir.

Bölünebilecek karakterlerin kontrol edilmesinin yanı sıra, birkaç diğer konuyu da kontrol edebilirsiniz:

  • length_function: Bir bloğun uzunluğunu nasıl hesaplayacağınız. Varsayılan olarak yalnızca karakter sayısı sayılır, ancak genellikle belirteç sayıcılar buraya geçirilir.
  • chunk_size: Bloklarınızın maksimum boyutu (uzunluk işlevi ile ölçülür).
  • chunk_overlap: Bloklar arasındaki maksimum örtüşme. Biraz örtüşme, bloklar arasında sürekliliği korumaya yardımcı olabilir (örneğin, kaydırma penceresi yaparak).
  • add_start_index: Her bloğun orijinal belgedeki başlangıç pozisyonunu metada dahil etmek isteyip istemediğinizi belirtir.
with open('../../state_of_the_union.txt') as f:
    state_of_the_union = f.read()
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size = 100,
    chunk_overlap  = 20,
    length_function = len,
    add_start_index = True,
)
texts = text_splitter.create_documents([state_of_the_union])
print(texts[0])
print(texts[1])
page_content='..ignored text..' metadata={'start_index': 0}
    page_content='..ignored text..' metadata={'start_index': 82}

Diğer Dönüşümler

Redundan Belgeleri Filtreleme, Belgeleri Çevirme, Metadata Çıkarma ve Daha Fazlası

Belgeleri bölmek dışında, belge içeriği üzerinde diğer dönüşümler de yapabiliriz. EmbeddingsRedundantFilter kullanarak benzer belgeleri tanımlayabilir ve gereksiz içeriği filtreleyebiliriz. doctran gibi entegrasyonlar aracılığıyla belgeleri bir dilde diğerine çevirme, gerekli özellikleri çıkarma ve metada eklemeyi ve konuşmaları bir dizi soru/cevap formatlı belgeye dönüştürmeyi gerçekleştirebiliriz.