|
ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;padding-left: 8px;color: rgb(63, 63, 63);">大多数 RAG 都建立在这个技术栈之上;为什么每次都要重做呢?ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;padding-left: 8px;color: rgb(63, 63, 63);">照片由Warren拍摄于UnsplashingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 16px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">RAGs 让 LLMs 变得有用。ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 16px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">是的,在 RAG 出现之前,LLMs 仅仅是玩具。除了对 LLM 进行一些琐碎的情感分类之外,没有多少应用。这主要是由于 LLM 无法随时随地学习。任何实时的东西都无法与 LLM 配合使用。ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 16px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">当 RAGs 开始实践时,这种情况发生了变化。ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 16px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">RAGs 允许我们使用实时数据构建应用程序,并且它们帮助我们使用 LLMs 构建围绕我们私有数据的智能应用程序。ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 16px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">但是,如果你问任何构建 RAGs 的人他们的技术栈是什么,你就会听到一个古老而破损的录音机。所有 RAG 管道的前几个阶段都非常相似,核心技术几乎没有替代方案。ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 16px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">我的首选入门应用程序具有以下技术:Langchain(LlamaIndex 是唯一可比的替代方案)、ChromaDB 和 OpenAI,用于 LLMs 和嵌入。我经常在 docker 环境中进行开发,因为结果很容易在其他人的计算机上重现(除了它们带来的许多其他好处)。ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 16px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">就我的需求而言,我很少打包它们。当我这样做时,我使用 Streamlit 或 Gradio。我以前使用 Django。它是一个很棒的 Web 开发框架。但是,如果你是一名全职数据科学家,你最好在 Streamlit 或 Gradio 之间做出选择。ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 16px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">由于我注意到我总是从这个技术栈开始项目,因此我创建了一个项目模板,这样每当我有一个想法时,我就不想在无聊的基础知识上浪费时间。 我将与你分享这篇文章;也许你也可以节省时间。 如何在几分钟内启动一个 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类中注册它来实现。 ##Createa chunking strategy ## chunking\your_chunking_stragey.py
fromtypingimportList fromchunking.chunkingimportChunkingStrategy fromlangchain.docstore.documentimportDocument
classYourChunkingStrategy(ChunkingStrategy):
defchunk(self,documents ist[Document]) ->List[Document]: # implement your own chunking technique here pass
##Registerthenewchunking strategy ## chunking\__init__.py
fromchunking.your_chunking_strageyimportYourChunkingStrategy classChunker: def__init__(self): ... elif config["chunking"]["strategy"] =="your_chunking_strategy":: self.chunking_strategy=YourChunkingStrategy() else: raiseValueError(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 应用程序并将其部署到空间中,或者创建一个与此类似的应用程序,并且永远不必再担心样板文件。 |