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>"))
在罗德岛设计学院(RISD)毕业后,保罗·格雷厄姆继续追求他对绘画和艺术的热爱。他在佛罗伦萨美术学院绘画系进修课程,并参加了该校的入学考试。同时他继续撰写《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>"))
在罗德岛设计学院(RISD)毕业后,保罗·格雷厄姆先是在Interleaf担任顾问,随后与罗伯特·莫里斯共同创立了Viaweb。他们开发了一款允许用户通过网页创建网站的软件,并获得了Idelle的丈夫朱利安提供的1万美元种子资金。作为对初期法律工作和商业建议的回报,他们给予朱利安公司10%的股份。由于所欠税款导致净资产为负,这笔种子资金对保罗维持生计至关重要。1996年1月,他们以6家店铺的规模正式开业。
保罗·格雷厄姆在雅虎期权兑现后离职返回纽约。他重拾旧日生活,但此时已身家丰厚。他尝试重拾绘画,但缺乏精力和雄心。最终他搬回剑桥,开始着手开发一个用于创建网页应用的网络应用。他招募了丹·吉芬和两名本科生协助,但后来意识到自己并不想经营公司,于是决定将项目的子集作为开源项目开发。他在剑桥购置的住宅里与丹共同研发了一种新的Lisp方言,并将其命名为Arc。这个作为开源项目开发的子集正是新生的Lisp语言,其
在本示例中,HyDE通过准确推测保罗·格雷厄姆从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 用 Arc 语言编写的编程语言,开发历时四年(2015 年 3 月 26 日至 2019 年 10 月 12 日)。它基于 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 是保罗·格雷厄姆(Paul Graham)的笔名,这位提供背景信息的作者当时急需维持生活的种子资金,并参与了一项后来成为 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>"))
作者可能会认为,艺术是比工程学更持久且独立的工作形式。他们提到当今编写的软件在几十年后就会过时,系统性的工作成果也难以持久。相比之下,他们指出绘画作品可以保存数百年,而且以艺术家身份谋生是可行的。他们还强调作为艺术家,你可以获得真正的独立性,既不需要老板也不需要科研经费。此外,他们注意到艺术可以为那些难以获得传统就业机会的人提供收入来源,例如案例中提到的那位模特,她通过为当地古董商做模特和制作仿品来维持生计。