LlamaIndex中的HyDE查询转换:提升查询质量
在本笔记本中,我们将探讨如何在LlamaIndex中使用HyDE(Hypothetical Document Embeddings)查询转换来提升特定时间查询的质量。如果你在Colab上打开此笔记本,你可能需要安装LlamaIndex。
安装LlamaIndex
!pip install llama-index
下载数据
!mkdir -p 'data/paul_graham/'
!wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/paul_graham/paul_graham_essay.txt' -O 'data/paul_graham/paul_graham_essay.txt'
加载文档,构建VectorStoreIndex
import logging
import sys
logging.basicConfig(stream=sys.stdout, level=logging.INFO)
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core.indices.query.query_transform import HyDEQueryTransform
from llama_index.core.query_engine import TransformQueryEngine
from IPython.display import Markdown, display
# 加载文档
documents = SimpleDirectoryReader("./data/paul_graham/").load_data()
index = VectorStoreIndex.from_documents(documents)
示例:HyDE提升特定时间查询
查询字符串
query_str = "what did paul graham do after going to RISD"
不使用转换查询
相同的查询字符串用于嵌入查找和总结。
query_engine = index.as_query_engine()
response = query_engine.query(query_str)
display(Markdown(f"<b>{response}</b>"))
使用HyDEQueryTransform查询
生成一个假设文档并用于嵌入查找。
hyde = HyDEQueryTransform(include_original=True)
hyde_query_engine = TransformQueryEngine(query_engine, hyde)
response = hyde_query_engine.query(query_str)
display(Markdown(f"<b>{response}</b>"))
在这个例子中,HyDE显著提升了输出质量,通过幻觉准确地描述了Paul Graham在RISD之后做了什么,从而提高了嵌入质量和最终输出。
失败案例1:HyDE可能在无上下文的情况下误导查询
查询字符串
query_str = "What is Bel?"
不使用转换查询
response = query_engine.query(query_str)
display(Markdown(f"<b>{response}</b>"))
使用HyDEQueryTransform查询
response = hyde_query_engine.query(query_str)
display(Markdown(f"<b>{response}</b>"))
在这个例子中,HyDE在没有文档上下文的情况下误解了Bel,导致完全不相关的嵌入字符串和糟糕的检索结果。
失败案例2:HyDE可能偏移开放式查询
查询字符串
query_str = "What would the author say about art vs. engineering?"
不使用转换查询
response = query_engine.query(query_str)
display(Markdown(f"<b>{response}</b>"))
使用HyDEQueryTransform查询
response = hyde_query_engine.query(query_str)
display(Markdown(f"<b>{response}</b>"))
在这个例子中,HyDEQueryTransform导致了一个更偏颇的输出。
通过这些示例,我们可以看到HyDE查询转换在特定情况下可以显著提升查询质量,但在某些情况下也可能导致误导或偏颇的结果。因此,在使用HyDE查询转换时,需要谨慎考虑其适用性和潜在的局限性。