微信扫码
添加专属顾问
我要投稿
快速构建RAG应用,节省时间,提升效率 核心内容: 1. RAG技术栈的普遍性和重要性 2. 构建RAG应用的基本技术选择和步骤 3. 快速启动RAG应用的具体指南和操作
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 应用程序启动并运行。
要使其工作,你必须在你的计算机上安装 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 spaces 对于数据科学家来说既简单又受欢迎,所以我们将坚持使用 Huggingface。
我主要使用 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 应用程序并将其部署到空间中,或者创建一个与此类似的应用程序,并且永远不必再担心样板文件。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-04-30
聊聊AI智能体框架MetaGPT下的RAG实践
2025-04-30
如何用大模型+RAG给宠物做一个AI健康助手(干货分享)?
2025-04-30
HiRAG:基于层级知识索引和检索的高精度RAG
2025-04-29
教程|通义Qwen 3 +Milvus,混合推理模型才是优化RAG成本的最佳范式
2025-04-29
RAG开发框架LangChain与LlamaIndex对比解析:谁更适合你的AI应用?
2025-04-29
RAG性能暴增20%!清华等推出“以笔记为中心”的深度检索增强生成框架,复杂问答效果飙升
2025-04-29
超神了,ChatWiki 支持GraphRAG,让 AI 具备垂直深度推理能力!
2025-04-29
AI 产品思维:我如何把一个 AI 应用从基础 RAG 升级到 multi-agent 架构
2024-10-27
2024-09-04
2024-07-18
2024-05-05
2024-06-20
2024-06-13
2024-07-09
2024-07-09
2024-05-19
2024-07-07
2025-04-30
2025-04-29
2025-04-29
2025-04-26
2025-04-25
2025-04-22
2025-04-22
2025-04-20