Indeks Ringkasan Dokumen Baru untuk Sistem QA yang didukung LLM

May 09 2023
Dalam postingan blog ini, kami memperkenalkan struktur data LlamaIndex baru: Indeks Ringkasan Dokumen. Kami menjelaskan bagaimana ini dapat membantu menawarkan kinerja pengambilan yang lebih baik dibandingkan dengan pencarian semantik tradisional, dan juga menelusuri contoh.

Dalam postingan blog ini, kami memperkenalkan struktur data LlamaIndex baru: Indeks Ringkasan Dokumen. Kami menjelaskan bagaimana ini dapat membantu menawarkan kinerja pengambilan yang lebih baik dibandingkan dengan pencarian semantik tradisional, dan juga menelusuri contoh.

Latar belakang

Salah satu kasus penggunaan inti dari Model Bahasa Besar (LLM) adalah menjawab pertanyaan atas data Anda sendiri. Untuk melakukan ini, kami memasangkan LLM dengan model "pengambilan" yang dapat melakukan pengambilan informasi melalui korpus pengetahuan, dan melakukan sintesis respons atas teks yang diambil menggunakan LLM. Kerangka keseluruhan ini disebut Retrieval-Augmented Generation.

Sebagian besar pengguna yang membangun sistem QA bertenaga LLM saat ini cenderung melakukan beberapa bentuk berikut:

  1. Ambil dokumen sumber, pisahkan masing-masing menjadi potongan teks
  2. Simpan potongan teks dalam vektor db
  3. Selama waktu kueri, ambil potongan teks dengan menyematkan kesamaan dan/atau filter kata kunci.
  4. Lakukan sintesis respons

Keterbatasan Pendekatan yang Ada

Ada beberapa batasan pengambilan embedding menggunakan potongan teks.

  • Potongan teks tidak memiliki konteks global. Seringkali pertanyaan membutuhkan konteks di luar apa yang diindeks dalam potongan tertentu.
  • Penyetelan yang hati-hati dari ambang skor top-k / kesamaan. Buat nilainya terlalu kecil dan Anda akan kehilangan konteks. Buat nilainya terlalu besar dan biaya/latensi dapat meningkat dengan konteks yang lebih tidak relevan.
  • Penyematan tidak selalu memilih konteks yang paling relevan untuk sebuah pertanyaan. Penyematan secara inheren ditentukan secara terpisah antara teks dan konteks.

Indeks Ringkasan Dokumen

Diagram untuk Indeks Ringkasan Dokumen

Kami mengusulkan indeks baru di LlamaIndex yang akan mengekstrak/mengindeks ringkasan teks tidak terstruktur untuk setiap dokumen . Indeks ini dapat membantu meningkatkan kinerja pengambilan di luar pendekatan pengambilan yang ada. Ini membantu untuk mengindeks lebih banyak informasi daripada satu potongan teks, dan membawa lebih banyak makna semantik daripada tag kata kunci. Ini juga memungkinkan untuk bentuk pengambilan yang lebih fleksibel: kita dapat melakukan pengambilan LLM dan pengambilan berbasis embedding.

Bagaimana itu bekerja

Selama waktu pembuatan, kami menyerap setiap dokumen, dan menggunakan LLM untuk mengekstrak ringkasan dari setiap dokumen. Kami juga membagi dokumen menjadi potongan teks (node). Ringkasan dan node disimpan dalam abstraksi Penyimpanan Dokumen kami . Kami mempertahankan pemetaan dari ringkasan ke dokumen/node sumber.

Selama waktu kueri, kami mengambil dokumen yang relevan dengan kueri berdasarkan ringkasannya, menggunakan pendekatan berikut:

  • Pengambilan Berbasis LLM: Kami menyajikan kumpulan ringkasan dokumen ke LLM, dan meminta LLM untuk menentukan dokumen mana yang relevan + skor relevansinya.
  • Pengambilan Berbasis Penyematan: Kami mengambil dokumen yang relevan berdasarkan kesamaan penyematan ringkasan (dengan cutoff top-k).

Menyimpan ringkasan untuk dokumen juga memungkinkan pengambilan berbasis LLM . Alih-alih memberi makan seluruh dokumen ke LLM di awal, pertama-tama kita dapat meminta LLM memeriksa ringkasan dokumen singkat untuk melihat apakah itu relevan dengan kueri sama sekali. Ini memanfaatkan kemampuan penalaran LLM yang lebih maju daripada pencarian berbasis penyematan, tetapi menghindari biaya/latensi untuk memasukkan seluruh dokumen ke LLM

Wawasan Tambahan

Pengambilan dokumen dengan ringkasan dapat dianggap sebagai "jalan tengah" antara pencarian semantik dan ringkasan paksa di semua dokumen. Kami mencari dokumen berdasarkan relevansi ringkasan dengan kueri yang diberikan, lalu mengembalikan semua *node* yang sesuai dengan dokumen yang diambil.

Mengapa kita harus melakukan ini? Metode pengambilan ini memberi pengguna lebih banyak konteks daripada top-k melalui potongan teks, dengan mengambil konteks pada tingkat dokumen. Namun, ini juga merupakan pendekatan yang lebih fleksibel/otomatis daripada pemodelan topik; tidak perlu lagi mengkhawatirkan apakah teks Anda memiliki tag kata kunci yang tepat!

Contoh

Mari telusuri contoh yang menampilkan indeks ringkasan dokumen, melalui artikel Wikipedia tentang berbagai kota.

Bagian selanjutnya dari panduan ini menampilkan cuplikan kode yang relevan. Anda dapat menemukan langkah-langkah lengkapnya di sini (dan inilah tautan buku catatannya ).

Kita dapat membangun GPTDocumentSummaryIndexlebih dari satu set dokumen, dan mengirimkan ResponseSynthesizerobjek untuk mensintesis ringkasan untuk dokumen tersebut.

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...

API tingkat tinggi

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)

Pendekatan autosummarization atas setiap bagian teks sangat menarik. Kami senang mengembangkan ekstensi di dua area:

  • Lanjutkan menjelajahi autosummarization di berbagai lapisan. Saat ini berada di tingkat dokumen, tetapi bagaimana dengan meringkas potongan teks besar menjadi lebih kecil? (misalnya one-liner).
  • Lanjutkan menjelajahi pengambilan berbasis LLM, yang membantu untuk membuka kunci ringkasan.

Panduan Ringkasan Dokumen

Tautan Buku Catatan