首页 > 编程语言 >构建LangChain应用程序的示例代码:35、如何使用假设性文档嵌入(HyDE)技术来改善文档索引教程

构建LangChain应用程序的示例代码:35、如何使用假设性文档嵌入(HyDE)技术来改善文档索引教程

时间:2024-06-17 18:33:14浏览次数:27  
标签:嵌入 embeddings 假设性 示例 生成 HyDE llm 文档

使用假设性文档嵌入(HyDE)改善文档索引

摘要

本文介绍了如何使用假设性文档嵌入(Hypothetical Document Embeddings,简称HyDE),这是根据一篇论文中描述的技术。HyDE 是一种嵌入技术,它接收查询,生成一个假设性的答案,然后嵌入该生成的文档,并将其作为最终示例使用。

代码及注释

from langchain.chains import HypotheticalDocumentEmbedder, LLMChain
from langchain.prompts import PromptTemplate
from langchain_openai import OpenAI, OpenAIEmbeddings

# 初始化基础嵌入模型
base_embeddings = OpenAIEmbeddings()
# 初始化语言模型
llm = OpenAI()

# 使用web_search提示加载HyDE
embeddings = HypotheticalDocumentEmbedder.from_llm(llm, base_embeddings, "web_search")

# 现在我们可以像使用任何嵌入类一样使用它
result = embeddings.embed_query("泰姬陵在哪里?")

多生成文档

我们也可以生成多个文档,然后组合这些文档的嵌入。默认情况下,我们通过取平均值来组合它们。我们可以通过改变生成文档的LLM来返回多个结果。

# 初始化返回多个结果的语言模型
multi_llm = OpenAI(n=4, best_of=4)

# 使用多生成语言模型加载HyDE
embeddings = HypotheticalDocumentEmbedder.from_llm(
    multi_llm, base_embeddings, "web_search"
)

# 嵌入查询
result = embeddings.embed_query("泰姬陵在哪里?")

使用自定义提示

除了使用预配置的提示外,我们也可以轻松构建自己的提示,并在生成文档的LLMChain中使用它们。如果我们知道查询将涉及的领域,这将非常有用,因为我们可以调整提示以生成更类似于该领域的文本。

以下示例中,我们将提示条件设置为生成有关国情咨文的文本。

# 定义自定义提示模板
prompt_template = """请回答用户关于最近一次国情咨文的问题
问题:{question}
答案:"""
# 创建提示模板对象
prompt = PromptTemplate(input_variables=["question"], template=prompt_template)
# 初始化使用自定义提示的LLMChain
llm_chain = LLMChain(llm=llm, prompt=prompt)

# 使用自定义提示加载HyDE
embeddings = HypotheticalDocumentEmbedder(
    llm_chain=llm_chain, base_embeddings=base_embeddings
)

# 嵌入查询
result = embeddings.embed_query(
    "总统在谈到Ketanji Brown Jackson时说了什么?"
)

使用HyDE

现在我们有了HyDE,我们可以像使用其他任何嵌入类一样使用它!以下是使用它在国情咨文示例中查找相似段落的方法。

from langchain_community.vectorstores import Chroma
from langchain_text_splitters import CharacterTextSplitter

# 读取国情咨文文本
with open("../../state_of_the_union.txt") as f:
    state_of_the_union = f.read()
# 初始化文本分割器
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
# 分割文本
texts = text_splitter.split_text(state_of_the_union)

# 使用Chroma从分割后的文本和嵌入创建文档搜索引擎
docsearch = Chroma.from_texts(texts, embeddings)

# 定义查询
query = "总统在谈到Ketanji Brown Jackson时说了什么?"
# 执行相似性搜索
docs = docsearch.similarity_search(query)

# 打印搜索结果
print(docs[0].page_content)

总结

本文详细介绍了如何使用假设性文档嵌入(HyDE)技术来改善文档索引。通过提供基础嵌入模型和生成文档的语言模型链(LLMChain),我们可以生成假设性答案并将其嵌入作为最终示例。此外,我们还探讨了如何使用自定义提示来生成特定领域的文本,以及如何将HyDE与其他工具结合使用,如Chroma和CharacterTextSplitter,以实现文档的高效索引和搜索。

扩展知识

  • HyDE (Hypothetical Document Embeddings):一种文档嵌入技术,通过生成假设性答案来改善文档索引和搜索。
  • LLMChain:用于生成文档的语言模型链,可以与HyDE结合使用。
  • OpenAIEmbeddings:OpenAI 提供的嵌入模型,用于生成文档嵌入。
  • PromptTemplate:用于定义和生成自定义提示的模板。
  • Chroma:一个向量存储库,用于文档搜索和相似性搜索。
  • CharacterTextSplitter:用于将长文本分割成更小的块,以便于处理和索引。

标签:嵌入,embeddings,假设性,示例,生成,HyDE,llm,文档
From: https://blog.csdn.net/wangjiansui/article/details/139751438

相关文章

  • 创建批量AD域用户的脚本可以使用 PowerShell 来实现。以下是一个简单的示例脚本,用于批
    创建批量AD域用户的脚本可以使用PowerShell来实现。以下是一个简单的示例脚本,用于批量创建用户:powershellCopyCode#导入ActiveDirectory模块Import-ModuleActiveDirectory#设定要创建用户的数量$numberOfUsers=10#循环创建用户for($i=1;$i-le$numberOfUs......
  • 功能强大的多功能文档转换工具Neevia Document Converter Pro 7.5.0.241
    NeeviaDocumentConverterPro是一款功能强大的Windows软件,旨在将文档转换为各种格式,包括PDF、TIFF、JPEG和许多其他格式。该程序专为在企业环境中使用而设计,提供文档转换和处理过程的自动化,这使其成为处理大量文档的组织的***工具。NeeviaDocumentConverterPro的主要功......
  • 阅读者如何验证收到的PDF文档的真实性和完整性,判断是否为原作者所发布或是否已被在改
    阅读者如何验证收到的PDF文档的真实性和完整性,判断是否为原作者所发布或是否已被在改动?只有用数字证书签名,这是一种确保文档完整性和验证作者身份的有效方式。如果原作者在发布PDF前对其进行了数字签名,任何后续的修改都会导致签名失效,阅读者在打开文件时会收到警告,提示文件已被......
  • PyMuPDF-1-24-4-中文文档-十四-
    PyMuPDF1.24.4中文文档(十四)原文:https://pymupdf.readthedocs.io/en/latest/废弃名称原文:pymupdf.readthedocs.io/en/latest/znames.html方法和属性的原始命名约定是“驼峰命名法”。自2013年左右创建以来,PyMuPDF的功能大幅增加,对应地增加了类、方法和属性。在许多情......
  • PyMuPDF-1-24-4-中文文档-三-
    PyMuPDF1.24.4中文文档(三)原文:https://pymupdf.readthedocs.io/en/latest/图像原文:pymupdf.readthedocs.io/en/latest/recipes-images.html如何从文档页面创建图像这个小脚本将获取一个文档文件名并生成每页的PNG文件。文档可以是任何支持的类型。脚本作为一个命令......
  • PyMuPDF-1-24-4-中文文档-七-
    PyMuPDF1.24.4中文文档(七)原文:https://pymupdf.readthedocs.io/en/latest/存档原文:pymupdf.readthedocs.io/en/latest/archive-class.htmlv1.21.0版新增内容此类表示文件夹和容器文件(如ZIP和TAR存档)的泛化。存档允许像它们都是一个文件夹层次结构树的一部分一样......
  • PyMuPDF-1-24-4-中文文档-二-
    PyMuPDF1.24.4中文文档(二)原文:https://pymupdf.readthedocs.io/en/latest/教程原文:pymupdf.readthedocs.io/en/latest/tutorial.html本教程将逐步展示您如何在Python中使用PyMuPDF和MuPDF。因为MuPDF不仅支持PDF,还支持XPS、OpenXPS、CBZ、CBR、FB2和EPUB格......
  • 生成式 AI 服务应用之Langchain 和 DashScope Reranker 彻底改变您的文档检索过程(教程
    介绍在当今信息泛滥的时代,找到所需的确切文档似乎是一件不可能完成的事情。传统搜索引擎经常让您在无关内容中苦苦挣扎,浪费宝贵的时间。但不要担心,因为有一对强大的组合正在等待彻底改变您的搜索体验:Langchain和DashScopeReranker。推荐文章《如何使用CodeLlama......
  • 软件工程项目开发文档资料(规格说明书、详细设计、测试计划、验收报告)
      前言:在软件开发过程中,文档资料是非常关键的一部分,它们帮助团队成员理解项目需求、设计、实施、测试、验收等各个环节,确保项目的顺利进行。以下是各个阶段的文档资料概述:软件项目管理部分文档清单: 工作安排任务书,可行性分析报告,立项申请审批表,产品需求规格说明书,需求调......
  • js基础文档
    数据类型数据分为基本数据类型(String,Number,Boolean,Null,Undefined,Symbol)和对象数据类型。基本数据类型的特点:直接存储在栈(stack)中的数据引用数据类型的特点:存储的是该对象在栈中引用,真实的数据存放在堆内存里引用数据类型在栈中存储了指针,该指针指向堆中该实体的起......