एलएलएम-संचालित क्यूए सिस्टम्स के लिए एक नया दस्तावेज़ सारांश सूचकांक
इस ब्लॉग पोस्ट में, हम एक बिल्कुल नई LlamaIndex डेटा संरचना पेश करते हैं: एक दस्तावेज़ सारांश अनुक्रमणिका। हम वर्णन करते हैं कि यह कैसे पारंपरिक सिमेंटिक खोज की तुलना में बेहतर पुनर्प्राप्ति प्रदर्शन प्रदान करने में मदद कर सकता है, और एक उदाहरण के माध्यम से भी चलता है।
पृष्ठभूमि
बड़े भाषा मॉडल (एलएलएम) के मुख्य उपयोग मामलों में से एक आपके अपने डेटा पर सवाल-जवाब है। ऐसा करने के लिए, हम एलएलएम को एक "पुनर्प्राप्ति" मॉडल के साथ जोड़ते हैं जो एक ज्ञान कोष पर सूचना पुनर्प्राप्ति का प्रदर्शन कर सकता है, और एलएलएम का उपयोग करके पुनर्प्राप्त ग्रंथों पर प्रतिक्रिया संश्लेषण कर सकता है। इस समग्र ढांचे को पुनर्प्राप्ति-संवर्धित पीढ़ी कहा जाता है।
एलएलएम-संचालित क्यूए सिस्टम बनाने वाले अधिकांश उपयोगकर्ता आज निम्न में से कुछ प्रकार करते हैं:
- स्रोत दस्तावेज़ लें, प्रत्येक को पाठ के टुकड़ों में विभाजित करें
- एक वेक्टर db में टेक्स्ट चंक्स को स्टोर करें
- क्वेरी-समय के दौरान, समानता और/या कीवर्ड फ़िल्टर एम्बेड करके टेक्स्ट भाग पुनर्प्राप्त करें।
- प्रतिक्रिया संश्लेषण करें
मौजूदा दृष्टिकोण की सीमाएं
टेक्स्ट चंक्स का उपयोग करके पुनर्प्राप्ति को एम्बेड करने की कुछ सीमाएँ हैं।
- पाठ के टुकड़ों में वैश्विक संदर्भ का अभाव है। अक्सर प्रश्न को किसी विशिष्ट चंक में अनुक्रमित से परे संदर्भ की आवश्यकता होती है।
- टॉप-के / समानता स्कोर थ्रेसहोल्ड की सावधानीपूर्वक ट्यूनिंग। मान को बहुत छोटा बनाएं और आप संदर्भ से चूक जाएंगे। मूल्य को बहुत बड़ा बनाएं और अधिक अप्रासंगिक संदर्भ के साथ लागत/विलंबता बढ़ सकती है।
- एम्बेडिंग हमेशा किसी प्रश्न के लिए सबसे प्रासंगिक संदर्भ नहीं चुनते हैं। एम्बेडिंग स्वाभाविक रूप से पाठ और संदर्भ के बीच अलग-अलग निर्धारित होते हैं।
दस्तावेज़ सारांश सूचकांक
हम LlamaIndex में एक नई अनुक्रमणिका प्रस्तावित करते हैं जो प्रत्येक दस्तावेज़ के लिए एक असंरचित पाठ सारांश निकालेगा/अनुक्रमित करेगा । यह सूचकांक मौजूदा पुनर्प्राप्ति दृष्टिकोणों से परे पुनर्प्राप्ति प्रदर्शन को बढ़ाने में मदद कर सकता है। यह एकल टेक्स्ट चंक की तुलना में अधिक जानकारी को अनुक्रमित करने में मदद करता है, और कीवर्ड टैग्स की तुलना में अधिक अर्थपूर्ण अर्थ रखता है। यह पुनर्प्राप्ति के अधिक लचीले रूप की भी अनुमति देता है: हम LLM पुनर्प्राप्ति और एम्बेडिंग-आधारित पुनर्प्राप्ति दोनों कर सकते हैं।
यह काम किस प्रकार करता है
बिल्ड-टाइम के दौरान, हम प्रत्येक दस्तावेज़ को निगलते हैं, और प्रत्येक दस्तावेज़ से सारांश निकालने के लिए LLM का उपयोग करते हैं। हम दस्तावेज़ को पाठ खंडों (नोड्स) में भी विभाजित करते हैं। सारांश और नोड दोनों ही हमारे दस्तावेज़ स्टोर सार में संग्रहीत हैं। हम सारांश से स्रोत दस्तावेज़/नोड्स तक मैपिंग बनाए रखते हैं।
क्वेरी-समय के दौरान, हम निम्नलिखित दृष्टिकोणों का उपयोग करते हुए, उनके सारांश के आधार पर क्वेरी के प्रासंगिक दस्तावेज़ों को पुनः प्राप्त करते हैं:
- एलएलएम-आधारित पुनर्प्राप्ति: हम एलएलएम के लिए दस्तावेज़ सारांश के सेट प्रस्तुत करते हैं, और एलएलएम से यह निर्धारित करने के लिए कहते हैं कि कौन से दस्तावेज़ प्रासंगिक हैं + उनका प्रासंगिकता स्कोर।
- एम्बेडिंग-आधारित पुनर्प्राप्ति: हम सारांश एम्बेडिंग समानता (टॉप-के कटऑफ़ के साथ) के आधार पर प्रासंगिक दस्तावेज़ पुनर्प्राप्त करते हैं।
दस्तावेज़ के लिए सारांश संग्रहीत करने से एलएलएम-आधारित पुनर्प्राप्ति भी सक्षम हो जाती है । शुरुआत में पूरे दस्तावेज़ को एलएलएम में फीड करने के बजाय, हम पहले एलएलएम से संक्षिप्त दस्तावेज़ सारांश का निरीक्षण करवा सकते हैं ताकि यह देखा जा सके कि यह प्रश्न के लिए प्रासंगिक है या नहीं। यह एलएलएम की तर्क क्षमता का लाभ उठाता है जो एम्बेडिंग-आधारित लुकअप की तुलना में अधिक उन्नत हैं, लेकिन एलएलएम को पूरे दस्तावेज़ को फीड करने की लागत/विलंबता से बचा जाता है।
अतिरिक्त अंतर्दृष्टि
सारांश के साथ दस्तावेज़ पुनर्प्राप्ति को सभी दस्तावेज़ों में सिमेंटिक खोज और क्रूर-बल सारांश के बीच "मध्यम आधार" के रूप में माना जा सकता है। हम दी गई क्वेरी के साथ सारांश प्रासंगिकता के आधार पर दस्तावेज़ों को देखते हैं, और फिर पुनर्प्राप्त दस्तावेज़ों के अनुरूप सभी *नोड्स* लौटाते हैं।
हमें ऐसा क्यों करना चाहिए? यह पुनर्प्राप्ति विधि दस्तावेज़-स्तर पर संदर्भ पुनर्प्राप्त करके, टेक्स्ट-चंक पर टॉप-के की तुलना में उपयोगकर्ता को अधिक संदर्भ देती है। लेकिन, यह विषय मॉडलिंग की तुलना में अधिक लचीला/स्वचालित दृष्टिकोण भी है; आपके पाठ में सही खोजशब्द टैग हैं या नहीं, इस बारे में और अधिक चिंता करने की आवश्यकता नहीं है!
उदाहरण
आइए एक उदाहरण के माध्यम से चलते हैं जो विभिन्न शहरों के बारे में विकिपीडिया लेखों पर दस्तावेज़ सारांश अनुक्रमणिका दिखाता है।
इस मार्गदर्शिका का शेष भाग प्रासंगिक कोड स्निपेट प्रदर्शित करता है। आप पूरा पूर्वाभ्यास यहां (और यहां नोटबुक लिंक है ) पा सकते हैं ।
हम दस्तावेज़ों के एक सेट पर निर्माण कर सकते हैं GPTDocumentSummaryIndex
, और ResponseSynthesizer
दस्तावेज़ों के सारांश को संश्लेषित करने के लिए एक वस्तु में पास कर सकते हैं।
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...
उच्च स्तरीय एपीआई
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)
पाठ के किसी भी भाग पर स्वत: संक्षिप्तीकरण का दृष्टिकोण वास्तव में रोमांचक है। हम दो क्षेत्रों में एक्सटेंशन विकसित करने को लेकर उत्साहित हैं:
- विभिन्न परतों में स्वत:सारीकरण की खोज जारी रखें। वर्तमान में यह डॉक्टर-स्तर पर है, लेकिन एक बड़े पाठ खंड को एक छोटे से सारांशित करने के बारे में क्या? (उदाहरण के लिए एक-लाइनर)।
- एलएलएम-आधारित पुनर्प्राप्ति की खोज जारी रखें, जो संक्षेपण अनलॉक करने में मदद करता है।
दस्तावेज़ सारांश गाइड
नोटबुक लिंक