0. 前言
在使用llama_index進(jìn)行內(nèi)容提煉、文章總結(jié)時(shí),我們可以通過(guò)設(shè)置不同的ResponseMode來(lái)控制生成響應(yīng)的結(jié)果。
在上篇“使用langchain及l(fā)lama_index實(shí)現(xiàn)基于文檔(長(zhǎng)文本)的相似查詢與詢問(wèn)”博客中,我們給出了如下代碼(部分):
llm_predictor = LLMPredictor(llm=OpenAI(temperature=0, model_name=model_name,max_tokens=1800))
service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)
query_str = "美女蛇的故事是什么?"
response_mode = "compact"
"""
REFINE = "refine"
COMPACT = "compact"
SIMPLE_SUMMARIZE = "simple_summarize"
TREE_SUMMARIZE = "tree_summarize"
GENERATION = "generation"
NO_TEXT = "no_text"
"""
documents = fileToDocuments("./data")
index = GPTListIndex.from_documents(documents,service_context=service_context)
query_engine = index.as_query_engine(
response_mode=response_mode
)
response = query_engine.query(query_str)
print(response)
其中列舉了6種response_mode:
我們也可以通過(guò)導(dǎo)入如下代碼來(lái)觀察其中的值:ResponseMode.xx
from llama_index.indices.response.type import ResponseMode
在研究源碼及實(shí)踐后,本篇將介紹這幾種不同的response_mode的意義。
在代碼中,我們可以找到相應(yīng)的響應(yīng)器responseBuilder
,其源碼位置為llama_index/indices/response/response_builder.py
。下面我們將介紹幾種常用的ResponseMode及其意義。
1. ResponseMode: tree_summarize (總結(jié)摘要-最優(yōu))
當(dāng)設(shè)置ResponseMode為tree_summarize
時(shí),ChatGPT會(huì)對(duì)每一段文本進(jìn)行最大長(zhǎng)度的分割,并進(jìn)行連續(xù)的讀取和詢問(wèn)。這種模式的優(yōu)點(diǎn)是可以保證對(duì)文本的完整理解和回答,但如果沒(méi)有正確處理分割段落的情況,可能會(huì)導(dǎo)致錯(cuò)誤的生成結(jié)果。我們可以通過(guò)下面這幅圖來(lái)理解它的執(zhí)行流程:
理解:選擇這種模式比較適合做文章總結(jié),但是不適合做基于關(guān)鍵詞的查詢或詢問(wèn)。
2. ResponseMode: generation
當(dāng)設(shè)置ResponseMode為generation
時(shí),生成的回答不依賴于文檔的內(nèi)容,只基于提供的問(wèn)題進(jìn)行生成。這種模式適用于純粹的問(wèn)題回答場(chǎng)景,不考慮文檔的影響。
理解:與文檔割裂,純粹只是普通問(wèn)答。
3. ResponseMode: no_text
當(dāng)設(shè)置ResponseMode為no_text
時(shí),生成的回答中不包含任何內(nèi)容,僅作為占位符使用。
理解:目前暫時(shí)未發(fā)現(xiàn)其他用途。
4. ResponseMode: simple_summarize (最省token)
當(dāng)設(shè)置ResponseMode為simple_summarize
時(shí),ChatGPT會(huì)截取每段文本的相關(guān)句子(通常是第一句),并進(jìn)行提煉生成回答。這種模式適用于對(duì)結(jié)果要求不高的場(chǎng)景。我們可以通過(guò)下面這幅圖來(lái)理解它的執(zhí)行流程:
理解:因?yàn)橹恍枰M(jìn)行一次API調(diào)用,所以也比較省費(fèi)用。但是由于提煉過(guò)程可能會(huì)不精確,所以上下文的丟失情況有時(shí)比較嚴(yán)重。
5. ResponseMode: refine (基于關(guān)鍵詞詢問(wèn)-最優(yōu))
當(dāng)設(shè)置ResponseMode為refine
時(shí),如果只有一個(gè)文本塊(text_chunk),則會(huì)正常生成回答。但如果存在多個(gè)文本塊,則會(huì)以類似輪詢的方式迭代生成回答。這種模式可以對(duì)多個(gè)文本塊進(jìn)行迭代式的回答生成,逐步完善回答內(nèi)容。我們可以通過(guò)下面這幅圖來(lái)理解它的執(zhí)行流程:
理解:非常適合用于關(guān)鍵詞的詢問(wèn)。如果某段文本與提問(wèn)的關(guān)鍵詞無(wú)關(guān),則會(huì)保留原本的答案,如果有關(guān)系,則會(huì)進(jìn)一步的更新回答。
6. ResponseMode: compact (較省token)
當(dāng)設(shè)置ResponseMode為compact
時(shí),生成的回答會(huì)將多個(gè)文本塊(text_chunk)壓縮到設(shè)定的最大長(zhǎng)度,并生成一次回答。然后,根據(jù)后續(xù)內(nèi)容對(duì)以往的答案進(jìn)行改進(jìn)和完善(即進(jìn)行多次迭代)。這種模式實(shí)際上是Compact And Refine
的方式。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-489952.html
理解:refine的升級(jí)版,可以更加節(jié)約token。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-489952.html
到了這里,關(guān)于llama_index中query_engine的response_mode詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!