ipfans's Blog

Recent content on ipfans's Blog

马上订阅 ipfans's Blog RSS 更新: https://www.4async.com/atom.xml

从零学习 Hypothetical Document Embeddings (HyDE) - 2

2024年4月10日 17:15
Featured image of post 从零学习 Hypothetical Document Embeddings (HyDE) - 2

在开始看这篇文章之前,推荐你阅读前一篇概念介绍文章。这篇文章之内不会再额外介绍概念上的内容,仅仅从实践角度演示如何是用 HyDE 和 RAG 结合。正如同前文提到的那样,我们会是用 LangChain 构建这个演示 Demo。当然,如果你熟悉 LlamaIndex 或者其他框架,其实主要流程大致差不多,只不过是用的 API 和库有一些区别。这些就不再赘述。

问题背景

让我们假设你在为麦当劳制作一个问答系统。这个问答系统的目的是帮助用户解决一些常见问题,比如:麦当劳的营业时间,麦当劳的菜单,麦当劳的优惠活动等等。这些问题的答案通常是可以在麦当劳的官方网站上找到的,但是用户可能并不知道这些信息,或者他们可能会用自己的方式提出问题。这时候,我们就需要一个 RAG 模型来帮助我们回答这些问题。但是麦当劳实际上有非常多的商品,那么它的知识库可能会非常大,而且用户提出的问题可能并不在知识库中。这时候 HyDE 就可以帮助我们处理这些问题。

准备工作

我们会是用一些基本的 Python 相关工具(pdm 等等)、Ollamachroma。关于 Ollama 的介绍,可以查看我的之前的文章。出于成本考虑,这里使用了开源的本地模型实现,请确保你的 Ollama 是在运行的状态。当然,如果你是用 GPT-4 Turbo(今天凌晨刚刚发布了新版本),效果要远比开源模型好很多。

mkdir hydemo && cd hydemo
pdm init
pdm add langchain chromadb beautifulsoup4
source .venv/bin/activate

请注意,在本文编写时,使用的 LangChain 的版本为 0.1.14,如果你的版本较低或者过高,可能存在部分 API 出入,请根据具体情况调整引用的模块和对应的 API。

功能实现

实现生成模拟文档

from langchain.chains.hyde.base import HypotheticalDocumentEmbedder
from langchain.chains.llm import LLMChain
from langchain.embeddings.ollama import OllamaEmbeddings
from langchain.globals import set_debug
from langchain.llms.ollama import Ollama
from langchain.vectorstores.chroma import Chroma


def main():
 set_debug(True) # 设置 langchain 的调试模式,后面我们会看到具体的效果
 llm = Ollama(model="qwen:7b") # 使用通义千问 7b 模型
 olemb = OllamaEmbeddings(
 model="nomic-embed-text"
 ) # 嵌入模型我们是使用的 nomic-embed-text
 embeddings = HypotheticalDocumentEmbedder.from_llm(
 llm,
 base_embeddings=olemb,
 prompt_key="web_search", # 加载预置的 Web Search Prompt
 )
 print(embeddings.llm_chain.prompt)


if __name__ == "__main__":
 main()

让我们先执行一下,看一下 Prompt 会是什么样子的: