首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

快速构建和部署 RAGS:节省时间和最大化效率的逐步指南

大多数 RAG 都建立在这个技术栈之上;为什么每次都要重做呢?

照片由 Warren 拍摄于 Unsplash

RAGs 让 LLMs 变得有用。

是的,在 RAG 出现之前,LLMs 仅仅是玩具。除了对 LLM 进行一些琐碎的情感分类之外,没有多少应用。这主要是由于 LLM 无法随时随地学习。任何实时的东西都无法与 LLM 配合使用。

当 RAGs 开始实践时,这种情况发生了变化。

RAGs 允许我们使用实时数据构建应用程序,并且它们帮助我们使用 LLMs 构建围绕我们私有数据的智能应用程序。

但是,如果你问任何构建 RAGs 的人他们的技术栈是什么,你就会听到一个古老而破损的录音机。所有 RAG 管道的前几个阶段都非常相似,核心技术几乎没有替代方案。

我的首选入门应用程序具有以下技术:Langchain(LlamaIndex 是唯一可比的替代方案)、ChromaDB 和 OpenAI,用于 LLMs 和嵌入。我经常在 docker 环境中进行开发,因为结果很容易在其他人的计算机上重现(除了它们带来的许多其他好处)。

就我的需求而言,我很少打包它们。当我这样做时,我使用 Streamlit 或 Gradio。我以前使用 Django。它是一个很棒的 Web 开发框架。但是,如果你是一名全职数据科学家,你最好在 Streamlit 或 Gradio 之间做出选择。

由于我注意到我总是从这个技术栈开始项目,因此我创建了一个项目模板,这样每当我有一个想法时,我就不想在无聊的基础知识上浪费时间。

我将与你分享这篇文章;也许你也可以节省时间。

如何在几分钟内启动一个 RAG 应用程序

在深入研究任何细节之前,让我们先让我们的基本 RAG 应用程序启动并运行。

要使其工作,你必须在你的计算机上安装 Docker 和 Git,并拥有一个 有效的 OpenAI API 密钥。

首先克隆以下存储库。

git clone git@github.com:thuwarakeshm/ragbasics.git

cd ragbasics

在项目目录中创建一个.env文件,并将你的 OpenAI API 密钥放入其中。

OPENAI_API_KEY=sk-proj-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

你已准备好构建并运行一个 docker 实例,该实例将打开一个 RAG 应用程序。以下是如何操作:

docker build -t ragbasics .

docker run -p 8000:7860 --env-file .env --name ragbasics-001 ragbasics

如果这是你第一次构建此镜像,则需要几分钟,服务器将准备就绪。打开你的浏览器并访问地址 https://localhost:8000 以访问该应用程序。

RAG 入门模板 — 作者提供的图片。

你可以上传你的任何 PDF 文档并提交它们。提交后,该应用程序将对你的文档进行分块,并从这些块中创建一个矢量存储。然后,你可以询问有关该文档的问题,该应用程序将回答这些问题。

运行中的 RAG 入门模板 — 作者提供的图片。

你可以立即更改什么?

这个应用程序远非完美。但它也是大多数 RAG 应用程序的共同元素。

除此之外,我们还会更改一些东西。其中最重要的是 RAG 的提示。最终的响应是通过单个 LLM 调用生成的,其中检索到的信息作为上下文。此 提示模板 在我们的响应质量中起着至关重要的作用。

我使用了一个基本模板。只是要求 LLM 根据上下文回答用户的问题。但是你可能必须修改它才能获得更好的质量响应,或者避免响应特定查询。

因为它非常常见,所以我已从pyproject.toml文件中提取了它。你可以在配置文件中指定你的提示,而不是进入代码库。

我更改的另一个常见的事情是 分块策略。

分块是我们如何将一个大文档分成小块(可能)只有一个想法。递归字符分割和 Markdown 分割是两种最流行的分块策略。

递归字符分割将你的文档中的所有内容都视为文本,从而创建一个移动的块窗口。如果将块大小设置为 1000,将重叠设置为 200,则移动窗口会将前 1000 个字符放入第一个块,将第 201 个字符到第 1200 个字符放入第二个块,依此类推。如果使用此策略,你通常需要更改块大小和重叠。你可以在你的pyproject.toml文件中直接执行此操作。

如果你的文档已经采用 Markdown 格式,则可以使用此信息创建更多信息丰富且相关的块。你可以在配置文件中完成所有这些操作。这是一个示例。

[chunking]

strategy = "recursive_character_text_splitter"

chunk_size = 1000

chunk_overlap = 200

## strategy = "markdown_splitter"

## headers_to_split_on = ["##", "###", "####", "#####", "######"]

## return_each_line = true

## strip_headers = false

[rag_prompt]

prompt_template = """

Answer the question in the below context:

{context}

Question: {question}

"""

如果你希望向应用程序添加新的分块技术,可以通过实现ChunkingStrategy抽象类并在Chunker类中注册它来实现。

## Create a chunking strategy

## chunking\your_chunking_stragey.py

from typing importList

from chunking.chunkingimportChunkingStrategy

from langchain.docstore.documentimportDocument

classYourChunkingStrategy(ChunkingStrategy):

def chunk(self, documents: List[Document]) -> List[Document]:

      # implement your own chunking technique here

      pass

## Register the new chunking strategy

## chunking\__init__.py

from chunking.your_chunking_strageyimportYourChunkingStrategy

classChunker:

  def __init__(self):

      ...

      elif config["chunking"]["strategy"] == "your_chunking_strategy"::

          self.chunking_strategy = YourChunkingStrategy()

      else:

          raise ValueError(f"Invalid chunking strategy: {config['chunking']['strategy']}")

工程师花费大量时间进行分块,并且没有一种方法比其他方法更好。我之前已经记录了一些我学到的关于分块的知识。这是一个使用许多超参数调整的实验过程。

拥有这样的模板可以帮助我们更快地完成它。它还可以帮助我们轻松地与另一个人沟通流程。

部署到 Huggingface

构建完你的应用程序后,下一件重要的事情就是部署它。

有很多选择,但 huggingface spaces 对于数据科学家来说既简单又受欢迎,所以我们将坚持使用 Huggingface。

为什么选择 Docker?

我主要使用 Docker 封装器来构建应用程序。原因有几个。

首先,我可以与同事共享它,并且该应用程序几乎总是在他们的计算机上以相同的方式运行。

其次,我可以轻松地向技术栈添加更多技术。例如,假设我想使用 Neo4J 而不是向量存储来创建知识图谱(如本例所示)。我只需创建一个docker-compose并向其中添加一个 Neo4J 容器即可。

第三是 Docker 与 Huggingface 的兼容性。您可以快速将 Docker 容器部署到 HF Spaces。我们讨论中的示例使用了 Gradio,它也与 HF Spaces 兼容。但 Docker 在使用上更灵活。

转到 HF Spaces 并创建一个新的空间。如果您按照本例操作,免费的 CPU 选项应该足够了。对于更强大的应用程序,您需要更多资源。

创建 HF 空间 — 作者的截图。

确保您已为空间 SDK 和一个空白模板选择了 Docker。

创建后,您将看到关于克隆和更新空间存储库的说明。将其克隆到您的计算机上,将您的项目文件复制到此存储库,然后将更改推回空间。

警告:不要直接将您的.env文件推送到 HF Spaces。

cd <project_directory>

git clone <hfspace_repository> hfspace

cp -r app.py Dockerfile pyproject.toml requirements.txt chunking hfspace

git add .                                                                                          

git commit -m "Deploying basic RAG app"

git push

当您推送更改后,HF 空间将构建并部署您的 Docker 容器。

HF 空间构建和部署 Docker 容器 — 作者的图片

但该应用程序尚不可用。还记得我们在将更改推送到 HF 空间时忽略了.env文件吗?我们必须通过 HF Space 设置安全地提供环境变量。

您可以在 HF 空间的设置选项卡中的变量和密钥部分找到此配置。单击“新建密钥”按钮并提供OPENAI_API_KEY变量。

在 HF Space 中添加环境变量 — 作者的截图。

保存密钥后,应用程序将重新启动。您现在可以访问该空间并查看您的应用程序实时运行。

部署到 Huggingface 空间的基本 RAG — 作者的截图。

最后的想法

检索增强型应用程序是 LLM 的主要用例之一。但是,大多数 RAG 应用程序使用相同的技术栈,因此工程师花费大量时间重复执行基础工作。

我创建了一个模板项目,每当我想要启动一个 RAG 应用程序时,它都会帮助我。这是一篇关于此模板的文章。您可以窃取它来快速构建 RAG 应用程序并将其部署到空间中,或者创建一个与此类似的应用程序,并且永远不必再担心样板文件。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/Ot28UUfjNjX64ozdjUasGR_w0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券