Skip to main content

使用HyDE改进文档索引

本笔记本介绍了如何使用Hypothetical Document Embeddings (HyDE)来改进文档索引,如此论文所述。

在高层次上,HyDE是一种嵌入技术,它接受查询,生成一个假设的答案,然后将生成的文档嵌入并将其作为最终示例使用。

为了使用HyDE,我们需要提供一个基本的嵌入模型,以及一个可以用于生成这些文档的LLMChain。默认情况下,HyDE类带有一些默认的提示(有关详细信息,请参阅论文),但我们也可以创建自己的提示。

from langchain.llms import OpenAI
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import LLMChain, HypotheticalDocumentEmbedder
from langchain.prompts import PromptTemplate
base_embeddings = OpenAIEmbeddings()
llm = OpenAI()
# 使用`web_search`提示加载
embeddings = HypotheticalDocumentEmbedder.from_llm(llm, base_embeddings, "web_search")
# 现在我们可以像使用任何嵌入类一样使用它!
result = embeddings.embed_query("泰姬陵在哪里?")

多个生成

我们还可以生成多个文档,然后将这些文档的嵌入组合起来。默认情况下,我们通过取平均值来组合这些文档的嵌入。我们可以通过改变用于生成文档的LLM来实现这一点。

multi_llm = OpenAI(n=4, best_of=4)
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)
llm_chain = LLMChain(llm=llm, prompt=prompt)
embeddings = HypotheticalDocumentEmbedder(
llm_chain=llm_chain, base_embeddings=base_embeddings
)
result = embeddings.embed_query(
"总统对Ketanji Brown Jackson有什么说法?"
)

使用HyDE

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

from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma

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)
docsearch = Chroma.from_texts(texts, embeddings)

query = "总统对Ketanji Brown Jackson有什么说法?"
docs = docsearch.similarity_search(query)
    使用直接本地API运行Chroma。
使用DuckDB内存数据库。数据将是临时的。
print(docs[0].page_content)
    在一个个州,新的法律已经通过,不仅压制选举权,而且颠覆整个选举过程。

我们不能让这种情况发生。

今晚,我呼吁参议院:通过《自由投票法案》。通过《约翰·刘易斯选举权法案》。而且,顺便说一句,通过《披露法案》,这样美国人就可以知道谁在资助我们的选举。

今晚,我想向一个致力于为这个国家服务的人表示敬意:司法部长斯蒂芬·布雷耶——一位陆军退伍军人、宪法学者和即将退休的美国最高法院法官。司法部长布雷耶,感谢您的服务。

作为总统,最重要的宪法责任之一就是提名人选担任美国最高法院法官。

我在4天前就这样做了,当时我提名了巡回上诉法院法官Ketanji Brown Jackson。她是我们国家最顶尖的法律专家之一,将继续延续布雷耶法官的卓越传统。