LLM destekli KG Sistemleri için Yeni Belge Özeti Dizini
Bu blog gönderisinde, yepyeni bir LlamaIndex veri yapısını tanıtıyoruz: Belge Özeti Dizini. Geleneksel semantik aramaya kıyasla daha iyi geri alma performansı sunmaya nasıl yardımcı olabileceğini açıklıyoruz ve ayrıca bir örnek üzerinden ilerliyoruz.
Arka plan
One of the core use cases of Large Language Models (LLMs) is question-answering over your own data. To do this, we pair the LLM with a “retrieval” model that can perform information retrieval over a knowledge corpus, and perform response synthesis over the retrieved texts using the LLM. This overall framework is called Retrieval-Augmented Generation.
Most users building LLM-powered QA systems today tend to do some form of the following:
- Take source documents, split each one into text chunks
- Store text chunks in a vector db
- During query-time, retrieve text chunks by embedding similarity and/or keyword filters.
- Perform response synthesis
Limitations of Existing Approaches
There are a few limitations of embedding retrieval using text chunks.
- Metin parçaları genel bağlamdan yoksundur. Çoğu zaman soru, belirli bir yığında indekslenenin ötesinde bir bağlam gerektirir.
- En iyi k / benzerlik puanı eşiklerinin dikkatli bir şekilde ayarlanması. Değeri çok küçük yaparsanız bağlamı kaçırırsınız. Değeri çok büyük yaparsanız, daha alakasız bağlamlarda maliyet/gecikme artabilir.
- Yerleştirmeler her zaman bir soru için en alakalı bağlamı seçmez. Gömmeler doğası gereği metin ve bağlam arasında ayrı ayrı belirlenir.
Belge Özeti Dizini
LlamaIndex'te , her belge için yapılandırılmamış bir metin özetini çıkaracak/dizinleyecek yeni bir dizin öneriyoruz . Bu dizin, alma performansını mevcut alma yaklaşımlarının ötesinde artırmaya yardımcı olabilir. Tek bir metin öbeğinden daha fazla bilgiyi indekslemeye yardımcı olur ve anahtar kelime etiketlerinden daha fazla semantik anlam taşır. Ayrıca, daha esnek bir geri alma biçimine de izin verir: hem LLM alma hem de gömme tabanlı alma yapabiliriz.
Nasıl çalışır
Oluşturma süresi boyunca, her belgeyi alıyoruz ve her belgeden bir özet çıkarmak için bir LLM kullanıyoruz. Ayrıca belgeyi metin parçalarına (düğümler) böldük. Hem özet hem de düğümler, Document Store soyutlamamızda saklanır . Özetten kaynak belgeye/düğümlere bir eşleme sağlıyoruz.
Sorgu süresi boyunca, aşağıdaki yaklaşımları kullanarak özetlerine dayalı olarak sorguyla ilgili belgeleri alırız:
- LLM-tabanlı Alma: LLM'ye belge özetleri seti sunarız ve LLM'den hangi belgelerin alakalı olduğunu + alaka puanlarını belirlemesini isteriz.
- Gömmeye Dayalı Alma: İlgili belgeleri, özet katıştırma benzerliğine göre alırız (en yüksek k kesme ile).
Bir belge için özetlerin saklanması LLM tabanlı almayı da sağlar . Başlangıçta tüm belgeyi LLM'ye vermek yerine, önce LLM'nin sorguyla alakalı olup olmadığını görmek için kısa belge özetini incelemesini sağlayabiliriz. Bu, LLM'lerin katıştırma tabanlı aramaya göre daha gelişmiş olan muhakeme yeteneklerinden yararlanır, ancak tüm belgeyi LLM'ye besleme maliyetinden/gecikmesinden kaçınır.
Ek Bilgiler
Özetlerle belge alma, tüm belgelerde semantik arama ve kaba kuvvet özetleme arasında bir "orta yol" olarak düşünülebilir. Belgeleri verilen sorguyla özet alaka düzeyine göre ararız ve ardından alınan belgelere karşılık gelen tüm *düğümleri* döndürürüz.
Bunu neden yapmalıyız? Bu alma yöntemi, bir belge düzeyinde bağlam alarak, kullanıcıya bir metin yığını üzerinden üst-k'den daha fazla bağlam sağlar. Ancak aynı zamanda konu modellemeden daha esnek/otomatik bir yaklaşımdır; Artık metninizin doğru anahtar kelime etiketlerine sahip olup olmadığı konusunda endişelenmenize gerek yok!
Örnek
Farklı şehirlerle ilgili Wikipedia makaleleri üzerinden belge özet dizinini gösteren bir örnek üzerinden gidelim.
Bu kılavuzun geri kalanında ilgili kod parçacıkları gösterilmektedir. İzlenecek yolun tamamını burada bulabilirsiniz (ve not defteri bağlantısı da buradadır ).
Bir dizi belge üzerinde oluşturabilir GPTDocumentSummaryIndex
ve ResponseSynthesizer
belgelerin özetlerini sentezlemek için bir nesneyi iletebiliriz.
from llama_index import (
SimpleDirectoryReader,
LLMPredictor,
ServiceContext,
ResponseSynthesizer
)
from llama_index.indices.document_summary import GPTDocumentSummaryIndex
from langchain.chat_models import ChatOpenAI
# load docs, define service context
...
# build the index
response_synthesizer = ResponseSynthesizer.from_args(response_mode="tree_summarize", use_async=True)
doc_summary_index = GPTDocumentSummaryIndex.from_documents(
city_docs,
service_context=service_context,
response_synthesizer=response_synthesizer
)
summary = doc_summary_index.get_document_summary("Boston")
from llama_index.indices.document_summary import DocumentSummaryIndexRetriever
retriever = DocumentSummaryIndexRetriever(
doc_summary_index,
# choice_select_prompt=choice_select_prompt,
# choice_batch_size=choice_batch_size,
# format_node_batch_fn=format_node_batch_fn,
# parse_choice_select_answer_fn=parse_choice_select_answer_fn,
# service_context=service_context
)
retrieved_nodes = retriever.retrieve("What are the sports teams in Toronto?")
print(retrieved_nodes[0].score)
print(retrieved_nodes[0].node.get_text())The retriever will retrieve a set of relevant nodes for a given index.
8.0
Toronto ( (listen) tə-RON-toh; locally [təˈɹɒɾ̃ə] or [ˈtɹɒɾ̃ə]) is the capital city of the Canadian province of Ontario. With a recorded population of 2,794,356 in 2021, it is the most populous city in Canada...
Üst düzey API
query_engine = doc_summary_index.as_query_engine(
response_mode="tree_summarize", use_async=True
)
response = query_engine.query("What are the sports teams in Toronto?")
print(response)
# use retriever as part of a query engine
from llama_index.query_engine import RetrieverQueryEngine
# configure response synthesizer
response_synthesizer = ResponseSynthesizer.from_args()
# assemble query engine
query_engine = RetrieverQueryEngine(
retriever=retriever,
response_synthesizer=response_synthesizer,
)
# query
response = query_engine.query("What are the sports teams in Toronto?")
print(response)
Herhangi bir metin parçası üzerinde otomatik özetleme yaklaşımı gerçekten heyecan verici. İki alanda uzantılar geliştirmekten heyecan duyuyoruz:
- Otomatik özetlemeyi farklı katmanlarda keşfetmeye devam edin. Şu anda belge düzeyinde, ancak büyük bir metin yığınını daha küçük bir metin yığınına özetlemeye ne dersiniz? (örneğin tek astar).
- Özetlemenin kilidini açmaya yardımcı olduğu LLM tabanlı almayı keşfetmeye devam edin.
Belge Özeti Kılavuzu
Not Defteri Bağlantısı