llama_index中query_engine的response_mode详解

文章介绍了在使用llama_index时,通过设置ResponseMode如tree_summarize、generation、no_text、simple_summarize、refine和compact来控制生成响应的不同方式。tree_summarize适合文章总结,generation基于问题生成回答,no_text作占位符,simple_summarize节省tokens但可能丢失上下文,refine适合关键词询问,而compact是refine的优化版,更省tokens。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0. 前言

在使用llama_index进行内容提炼、文章总结时,我们可以通过设置不同的ResponseMode来控制生成响应的结果。

在上篇“使用langchain及llama_index实现基于文档(长文本)的相似查询与询问”博客中,我们给出了如下代码(部分):

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:

在这里插入图片描述
我们也可以通过导入如下代码来观察其中的值:ResponseMode.xx

from llama_index.indices.response.type import ResponseMode

在研究源码及实践后,本篇将介绍这几种不同的response_mode的意义。

在代码中,我们可以找到相应的响应器responseBuilder,其源码位置为llama_index/indices/response/response_builder.py。下面我们将介绍几种常用的ResponseMode及其意义。

1. ResponseMode: tree_summarize (总结摘要-最优)

当设置ResponseMode为tree_summarize时,ChatGPT会对每一段文本进行最大长度的分割,并进行连续的读取和询问。这种模式的优点是可以保证对文本的完整理解和回答,但如果没有正确处理分割段落的情况,可能会导致错误的生成结果。我们可以通过下面这幅图来理解它的执行流程:

在这里插入图片描述

理解:选择这种模式比较适合做文章总结,但是不适合做基于关键词的查询或询问。

2. ResponseMode: generation

当设置ResponseMode为generation时,生成的回答不依赖于文档的内容,只基于提供的问题进行生成。这种模式适用于纯粹的问题回答场景,不考虑文档的影响。

理解:与文档割裂,纯粹只是普通问答。

3. ResponseMode: no_text

当设置ResponseMode为no_text时,生成的回答中不包含任何内容,仅作为占位符使用。

理解:目前暂时未发现其他用途。

4. ResponseMode: simple_summarize (最省token)

当设置ResponseMode为simple_summarize时,ChatGPT会截取每段文本的相关句子(通常是第一句),并进行提炼生成回答。这种模式适用于对结果要求不高的场景。我们可以通过下面这幅图来理解它的执行流程:

在这里插入图片描述
理解:因为只需要进行一次API调用,所以也比较省费用。但是由于提炼过程可能会不精确,所以上下文的丢失情况有时比较严重。

5. ResponseMode: refine (基于关键词询问-最优)

当设置ResponseMode为refine时,如果只有一个文本块(text_chunk),则会正常生成回答。但如果存在多个文本块,则会以类似轮询的方式迭代生成回答。这种模式可以对多个文本块进行迭代式的回答生成,逐步完善回答内容。我们可以通过下面这幅图来理解它的执行流程:

在这里插入图片描述
理解:非常适合用于关键词的询问。如果某段文本与提问的关键词无关,则会保留原本的答案,如果有关系,则会进一步的更新回答。

6. ResponseMode: compact (较省token)

当设置ResponseMode为compact时,生成的回答会将多个文本块(text_chunk)压缩到设定的最大长度,并生成一次回答。然后,根据后续内容对以往的答案进行改进和完善(即进行多次迭代)。这种模式实际上是Compact And Refine的方式。

理解:refine的升级版,可以更加节约token。

### Llama Index 查询结果重新排序的方法 Llama Index 提供了一种灵活的方式来处理查询结果的重新排序,这可以通过多种技术和策略实现。以下是几种常见的方法: #### 使用 LLM 进行重新排序 通过利用大型语言模型 (LLM),可以直接对查询返回的结果进行重新排序,从而提高相关性。这种方法的核心在于让 LLM 对每一块文档的内容进行评估,并根据其与查询的相关程度调整顺序[^2]。 ```python from llama_index import VectorStoreIndex, SimpleDirectoryReader from llama_index.retrievers import BM25Retriever # 加载数据并构建索引 documents = SimpleDirectoryReader('data').load_data() index = VectorStoreIndex.from_documents(documents) # 定义检索器 retriever = index.as_retriever() # 自定义重新排序逻辑 def rerank_results(query, results): ranked_results = [] for result in results: relevance_score = llm.evaluate(query, result.text) # 假设有一个 evaluate 函数来计算相关性分数 ranked_results.append((result, relevance_score)) return sorted(ranked_results, key=lambda x: x[1], reverse=True) query_engine = retriever.get_query_engine() results = query_engine.query("你的查询") reranked_results = rerank_results("你的查询", results) ``` 上述代码展示了如何自定义一个基于 LLM 的重新排序函数 `rerank_results` 来提升查询结果的质量。 --- #### 利用 UMAP 和其他降维技术 UMAP 是一种强大的降维工具,通常用于高维嵌入空间中的可视化和聚类分析。在某些情况下,可以将其应用于查询结果的重新排序过程。通过对向量表示的空间分布进行优化,能够进一步改善最终呈现给用户的文档块质量。 然而需要注意的是,在实际应用过程中可能还需要结合具体的业务场景需求以及性能考量来进行适当取舍。 --- #### 多步查询与混合策略 除了单独依赖某种特定的技术外,还可以采用多阶段或者综合性的解决方案。例如先执行初步筛选再经过精调后的二次过滤;或者是同时运用不同类型的算法并将它们的优势结合起来形成新的工作流模式等等[^1]。 这种灵活性允许开发者针对各自项目的特点定制最适合自己的方案而无需受限于单一选项。 --- ### 总结 对于 Llama Index 中查询结果的重新排序而言,主要存在三种途径可供选择:一是借助强大表达能力的大规模预训练模型直接完成任务;二是引入诸如 UMAP 等先进的数学运算手段辅助决策制定流程;最后则是考虑设计更为复杂的操作链条以期达到最佳效果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

如果皮卡会coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值