跳转到内容

HyDE 查询转换

如果您在 Colab 上打开这个笔记本,您可能需要安装 LlamaIndex 🦙。

!pip install llama-index
!mkdir -p 'data/paul_graham/'
!wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/examples/data/paul_graham/paul_graham_essay.txt' -O 'data/paul_graham/paul_graham_essay.txt'
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
# load documents
documents = SimpleDirectoryReader("./data/paul_graham/").load_data()
index = VectorStoreIndex.from_documents(documents)
query_str = "what did paul graham do after going to RISD"

首先,我们查询不进行转换:相同的查询字符串同时用于嵌入查找和摘要生成。

Section titled “First, we query without transformation: The same query string is used for embedding lookup and also summarization.”
query_engine = index.as_query_engine()
response = query_engine.query(query_str)
display(Markdown(f"<b>{response}</b>"))

在罗德岛设计学院毕业后,保罗·格雷厄姆继续追求他对绘画和艺术的热爱。他在佛罗伦萨美术学院绘画系上课,并参加了该学校的入学考试。他还继续撰写他的著作《On Lisp》,并通过咨询工作来赚钱。在学校里,保罗·格雷厄姆和其他学生达成了一项安排:教师不要求学生必须学习任何内容,而学生也不要求教师必须教授任何内容。保罗·格雷厄姆是少数几个真正画了提供的裸体模特的学生之一,而其他学生则把时间花在聊天或偶尔模仿他们在美国艺术杂志上看到的东西上。这位模特原来就住在保罗·格雷厄姆家附近的那条街上,她通过做模特和为当地古董商制作仿制品来谋生。

现在,我们使用 HyDEQueryTransform 生成一个假设文档并用于嵌入查找。

Section titled “Now, we use HyDEQueryTransform to generate a hypothetical document and use it for embedding lookup.”
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>"))

在罗德岛设计学院毕业后,保罗·格雷厄姆曾担任Interleaf的顾问,随后与罗伯特·莫里斯共同创立了Viaweb。他们开发了一款允许用户通过网络构建网站的软件,并从伊黛尔的丈夫朱利安那里获得了1万美元的种子资金。作为初始法律工作和商业建议的回报,他们给予朱利安公司10%的股份。由于所欠税款,保罗·格雷厄姆当时净资产为负值,因此这笔种子资金对他维持生计至关重要。他们于1996年1月开业,当时拥有6家店铺。

保罗·格雷厄姆在期权归属后离开了雅虎,回到了纽约。他重拾旧日生活,但此时已身价不菲。他尝试绘画,但缺乏精力和雄心。最终他搬回剑桥,开始开发一个用于创建网络应用程序的网页应用。他招募了丹·吉芬和两名本科生协助,但后来意识到自己并不想经营公司,于是决定将项目的子集作为开源项目开发。他与丹在剑桥购买的房子里共同研究一种新的Lisp方言,他称之为Arc。他作为开源项目构建的子集正是这种新型Lisp语言,其

在此示例中,HyDE通过准确推测保罗·格雷厄姆在RISD之后的经历(见下文),显著提升了输出质量,从而改善了嵌入质量和最终输出结果。

Section titled “In this example, HyDE improves output quality significantly, by hallucinating accurately what Paul Graham did after RISD (see below), and thus improving the embedding quality, and final output.”
query_bundle = hyde(query_str)
hyde_doc = query_bundle.embedding_strs[0]
hyde_doc

1985年从罗德岛设计学院毕业后,保罗·格雷厄姆开始从事计算机编程工作。他曾担任多家公司的软件开发人员,包括他于1995年共同创立的Viaweb。Viaweb最终于1998年被雅虎收购,格雷厄姆利用所得收益成为风险投资家。他于2005年创立了Y Combinator,这个创业加速器已帮助孵化了2000多家公司,包括Dropbox、Airbnb和Reddit。格雷厄姆还撰写了多本关于编程和创业的书籍,并持续在科技行业担任活跃投资者。

失败案例1:当查询在没有上下文的情况下可能被误解时,HyDE可能会产生误导。

Section titled “Failure case 1: HyDE may mislead when query can be mis-interpreted without context.”
query_str = "What is Bel?"
response = query_engine.query(query_str)
display(Markdown(f"<b>{response}</b>"))

Bel 是一种编程语言,由 Paul Graham 在四年期间(2015年3月26日至2019年10月12日)使用 Arc 语言编写而成。它基于 John McCarthy 的原始 Lisp 语言,但增加了额外功能。这是一个以代码形式表达的规范,旨在成为计算的形式化模型,作为图灵机的替代方案。

使用HyDEQueryTransform查询会导致无意义结果

Section titled “Querying with HyDEQueryTransform results in nonsense”
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>"))

Bel是保罗·格雷厄姆的笔名,他是背景信息的作者,当时需要种子资金维持生计,并参与了一项后来成为Y Combinator模式范本的交易。

在此示例中,HyDE 在没有文档上下文的情况下错误解读了 Bel(见下文),导致生成完全不相关的嵌入字符串和糟糕的检索结果。

Section titled “In this example, HyDE mis-interprets Bel without document context (see below), resulting in a completely unrelated embedding string and poor retrieval outcome.”
query_bundle = hyde(query_str)
hyde_doc = query_bundle.embedding_strs[0]
hyde_doc

贝尔是一位古老的闪族神祇,起源于中东。他常与太阳相关联,有时被称为"天界之主"。贝尔也被视为丰饶、富足与繁荣之神,常被描绘成公牛或长着公牛头的人形。在某些文化中,贝尔被视为创世神,负责宇宙的创造。他也与冥界有关联,有时被视为死亡之神。贝尔还与正义相联系,常被视为无辜者的保护神。贝尔是包括犹太教、基督教和伊斯兰教在内的多种宗教中的重要人物。

失败案例2:HyDE可能对开放式查询产生偏差

Section titled “Failure case 2: HyDE may bias open-ended queries”
query_str = "What would the author say about art vs. engineering?"

不进行转换的查询会得到一个合理的答案

Section titled “Querying without transformation yields a reasonable answer”
response = query_engine.query(query_str)
display(Markdown(f"<b>{response}</b>"))

作者可能会说,艺术和工程是两个需要不同技能和方法的学科。艺术更侧重于表达和创造力,而工程更侧重于问题解决和技术知识。作者还指出,艺术学院并不总是提供与工程学院相同水平的严谨性,绘画学生通常被鼓励发展个人风格,而不是学习绘画的基本原理。此外,作者可能会指出,工程能提供比艺术更稳定的经济保障,正如作者自己在创办公司时需要种子资金维持生活的经历所证明的那样。

使用HyDEQueryTransform进行查询会导致更具偏见的输出结果

Section titled “Querying with HyDEQueryTransform results in a more biased output”
response = hyde_query_engine.query(query_str)
display(Markdown(f"<b>{response}</b>"))

作者可能会说,艺术是比工程更持久且更独立的工作形式。他们提到,今天编写的软件将在几十年后过时,系统工作也无法持久。相比之下,他们指出画作可以保存数百年,而且以艺术家身份谋生是可行的。他们还提到,作为艺术家,你可以真正独立,不需要有老板或研究经费。此外,他们指出,对于那些可能无法获得传统就业形式的人来说,艺术可以成为收入来源,例如示例中的模特能够通过为当地古董商做模特和制作仿制品来谋生。