HyDE查询转换¶
如果你在Colab上打开这个Notebook,你可能需要安装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
# load documents
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>"))
在罗德岛设计学院就读后,保罗·格雷厄姆继续追求他对绘画和艺术的热爱。他在佛罗伦萨美术学院绘画系进修课程,并参加了该校的入学考试。同时他继续撰写《On Lisp》一书,并通过咨询工作来赚取收入。在这所学校里,保罗·格雷厄姆和其他学生与教职员工达成了一种默契:教师不强制要求学生学任何内容,而学生也不要求教师必须教授任何内容。保罗·格雷厄姆是少数几位真正绘制校方提供的裸体模特的学生之一,而其他学生则把时间花在聊天或偶尔模仿美国艺术杂志上看到的作品上。后来发现这位模特就住在保罗·格雷厄姆家附近的街上,她通过为当地古董商做模特和制作赝品来谋生。
现在,我们使用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>"))
在罗德岛设计学院毕业后,保罗·格雷厄姆先是在Interleaf担任顾问,随后与罗伯特·莫里斯共同创立了Viaweb。他们开发了一款让用户通过网页创建网站的软件,并获得了Idelle的丈夫朱利安提供的1万美元种子资金。作为对初期法律工作和商业建议的回报,他们给予朱利安公司10%的股份。由于所欠税款,保罗·格雷厄姆当时净资产为负值,因此这笔种子资金对他的生活至关重要。1996年1月,他们以6家店铺的规模正式开业。
Paul Graham在雅虎的期权兑现后离开了公司,回到了纽约。他重拾旧日生活,但此时已变得富有。他尝试绘画,但缺乏精力和雄心。最终他搬回剑桥,开始开发一个用于创建网页应用的网络应用。他招募了Dan Giffin和两名本科生协助,但后来意识到自己并不想经营公司,于是决定将项目的部分功能作为开源项目开发。他和Dan在剑桥购置的房子里开发了一种新的Lisp方言,命名为Arc。他作为开源项目开发的部分正是这种新Lisp语言,其
在这个例子中,HyDE
通过准确推测Paul Graham在RISD之后的经历(见下文),显著提升了输出质量,从而改善了嵌入效果和最终结果。¶
query_bundle = hyde(query_str)
hyde_doc = query_bundle.embedding_strs[0]
hyde_doc
1985年从罗德岛设计学院(RISD)毕业后,保罗·格雷厄姆开始从事计算机编程工作。他曾在多家公司担任软件开发人员,包括1995年与他人共同创立的Viaweb。Viaweb最终于1998年被雅虎收购,格雷厄姆利用这笔收益转型成为风险投资家。2005年,他创立了Y Combinator创业加速器,已帮助孵化了2000多家企业,包括Dropbox、Airbnb和Reddit等知名公司。格雷厄姆还撰写了多本关于编程和创业的书籍,并持续活跃于科技行业投资领域。
失败案例1:当查询在没有上下文的情况下可能被误解时,HyDE可能会产生误导。¶
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
查询会导致无意义结果¶
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(见下文),导致生成完全不相关的嵌入字符串和糟糕的检索结果。¶
query_bundle = hyde(query_str)
hyde_doc = query_bundle.embedding_strs[0]
hyde_doc
贝尔是一位古老的闪族神祇,起源于中东地区。他常与太阳相关联,有时被称为"天界之主"。贝尔也被视为生育、丰饶与繁荣之神,其形象常被描绘为公牛或长着牛首的男子。在某些文化中,贝尔被视为创世神,负责宇宙的创造。他也与冥界存在关联,有时被视为死亡之神。贝尔还与正义相联系,常被视为无辜者的保护者。贝尔是犹太教、基督教和伊斯兰教等多个宗教体系中的重要神祇。
失败案例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>"))
作者可能会认为,艺术是比工程学更持久且独立的工作形式。他们提到现今编写的软件在几十年后就会过时,系统工作也无法长久留存。相比之下,他们指出画作可以保存数百年,而且以艺术家身份谋生是可行的。他们还提到作为艺术家,你可以获得真正的独立性,不需要老板或研究经费。此外,他们注意到艺术可以成为那些难以获得传统就业机会人群的收入来源,比如例子中的模特,她通过为当地古董商做模特和制作仿品来维持生计。