在這篇博文中,我們介紹了一種全新的 LlamaIndex 數(shù)據(jù)結(jié)構(gòu):文檔摘要索引。我們描述了與傳統(tǒng)語義搜索相比,它如何幫助提供更好的檢索性能,并通過一個(gè)示例進(jìn)行了介紹。
1背景
大型語言模型 (LLM) 的核心場景之一是對(duì)用戶自己的數(shù)據(jù)進(jìn)行問答。為此,我們將 LLM 與“檢索”模型配對(duì),該模型可以對(duì)知識(shí)語料庫執(zhí)行信息檢索,并使用 LLM 對(duì)檢索到的文本執(zhí)行響應(yīng)合成。這個(gè)整體框架稱為檢索增強(qiáng)生成。
今天大多數(shù)構(gòu)建 LLM 支持的 QA 系統(tǒng)的用戶傾向于執(zhí)行以下某種形式的操作:
- 獲取源文檔,將每個(gè)文檔拆分為文本塊
- 將文本塊存儲(chǔ)在向量數(shù)據(jù)庫中
- 在查詢期間,通過嵌入相似性和/或關(guān)鍵字過濾器來檢索文本塊。
- 執(zhí)行響應(yīng)并匯總答案
由于各種原因,這種方法提供了有限的檢索性能。
2
現(xiàn)有方法的局限性
使用文本塊進(jìn)行嵌入檢索有一些限制。
- 文本塊缺乏全局上下文。通常,問題需要的上下文超出了特定塊中索引的內(nèi)容。
- 仔細(xì)調(diào)整 top-k / 相似度分?jǐn)?shù)閾值。假設(shè)值太小,你會(huì)錯(cuò)過上下文。假設(shè)值值太大,并且成本/延遲可能會(huì)隨著更多不相關(guān)的上下文而增加,噪音增加。
- 嵌入并不總是為問題選擇最相關(guān)的上下文。嵌入本質(zhì)上是在文本和上下文之間分別確定的。
添加關(guān)鍵字過濾器是增強(qiáng)檢索結(jié)果的一種方法。但這也帶來了一系列挑戰(zhàn)。我們需要手動(dòng)或通過 NLP 關(guān)鍵字提取/主題標(biāo)記模型為每個(gè)文檔充分確定合適的關(guān)鍵字。此外,我們還需要從查詢中充分推斷出正確的關(guān)鍵字。
3
文檔摘要索引
在LlamaIndex中提出了一個(gè)新索引,它將為每個(gè)文檔提取/索引非結(jié)構(gòu)化文本摘要。該索引可以幫助提高檢索性能,超越現(xiàn)有的檢索方法。它有助于索引比單個(gè)文本塊更多的信息,并且比關(guān)鍵字標(biāo)簽具有更多的語義。它還允許更靈活的檢索形式:我們可以同時(shí)進(jìn)行 LLM 檢索和基于嵌入的檢索。
4
怎么運(yùn)行的
在構(gòu)建期間,我們提取每個(gè)文檔,并使用 LLM 從每個(gè)文檔中提取摘要。我們還將文檔拆分為文本塊(節(jié)點(diǎn))。摘要和節(jié)點(diǎn)都存儲(chǔ)在我們的文檔存儲(chǔ)抽象中。我們維護(hù)從摘要到源文檔/節(jié)點(diǎn)的映射。
在查詢期間,我們使用以下方法根據(jù)摘要檢索相關(guān)文檔以進(jìn)行查詢:
- 基于 LLM 的檢索:我們向 LLM 提供文檔摘要集,并要求 LLM 確定哪些文檔是相關(guān)的+它們的相關(guān)性分?jǐn)?shù)。
- 基于嵌入的檢索:我們根據(jù)摘要嵌入相似性(使用 top-k 截止值)檢索相關(guān)文檔。
請(qǐng)注意,這種檢索文檔摘要的方法(即使使用基于嵌入的方法)不同于基于嵌入的文本塊檢索。文檔摘要索引的檢索類檢索任何選定文檔的所有節(jié)點(diǎn),而不是返回節(jié)點(diǎn)級(jí)別的相關(guān)塊。
存儲(chǔ)文檔的摘要還可以實(shí)現(xiàn)基于 LLM 的檢索。我們可以先讓 LLM 檢查簡明的文檔摘要,看看它是否與查詢相關(guān),而不是一開始就將整個(gè)文檔提供給 LLM。這利用了 LLM 的推理能力,它比基于嵌入的查找更先進(jìn),但避免了將整個(gè)文檔提供給 LLM 的成本/延遲
5
想法
帶有摘要的文檔檢索可以被認(rèn)為是語義搜索和所有文檔的強(qiáng)力摘要之間的“中間地帶”。我們根據(jù)與給定查詢的摘要相關(guān)性查找文檔,然后返回與檢索到的文檔對(duì)應(yīng)的所有節(jié)點(diǎn)。
我們?yōu)槭裁匆@樣做?通過在文檔級(jí)別檢索上下文,這種檢索方法為用戶提供了比文本塊上的 top-k 更多的上下文。但是,它也是一種比主題建模更靈活/自動(dòng)化的方法;不再擔(dān)心自己的文本是否有正確的關(guān)鍵字標(biāo)簽!
6
例子
讓我們來看一個(gè)展示文檔摘要索引的示例,其中包含關(guān)于不同城市的維基百科文章。
本指南的其余部分展示了相關(guān)的代碼片段。您可以在此處找到完整的演練(這是筆記本鏈接)。
我們可以構(gòu)建GPTDocumentSummaryIndex一組文檔,并傳入一個(gè)ResponseSynthesizer對(duì)象來合成文檔的摘要。
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")
接下來,我們來看一個(gè)基于 LLM 的索引檢索示例。
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 asetof relevant nodesfora given index.`
請(qǐng)注意,除了文檔文本之外,LLM 還返回相關(guān)性分?jǐn)?shù):
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,356in2021,it is the most populous cityinCanada...
高級(jí)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)
底層api
#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)
審核編輯 :李倩
-
代碼
+關(guān)注
關(guān)注
30文章
4671瀏覽量
67770 -
語言模型
+關(guān)注
關(guān)注
0文章
487瀏覽量
10201 -
nlp
+關(guān)注
關(guān)注
1文章
481瀏覽量
21935
原文標(biāo)題:LlamaIndex :面向QA 系統(tǒng)的全新文檔摘要索引
文章出處:【微信號(hào):zenRRan,微信公眾號(hào):深度學(xué)習(xí)自然語言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論