RAG信息检索系统

一个比较PySpark和Docker容器上运行的RAG式信息检索系统的项目,用于文档嵌入和查询。

  • by BenLambright
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 BenLambright/MCP-RAG

使用说明

大数据分析——学期论文

本杰明·兰布赖特和皮尔罗斯·恩沃克

目标

运行一个简单的RAG风格的信息检索的比较——我们在PySpark上的课堂上是如何做的——与在Docker镜像上运行它来模拟一个简单MCP服务器的比较。


存储库布局(快速概览)

  • README.md
  • Dockerfile——我为云设置docker镜像的地方
  • faiss_index/——在我切换到只使用TF-IDF之前,我使用拥抱脸的现成模型计算了faiss指数。不过,我无法让它在云端工作。
  • ingest.py——当我使用FAISS时,该文件在云端无法运行
  • client.py-客户端脚本,用于查询已在docker镜像上运行的嵌入空间
  • cloudbuild.yaml-构建yaml文件,以便我可以在云终端中运行docker镜像
  • query-cntrl.py-控件,assignment4的更简单版本
  • query-mcp.py-用于在容器上嵌入文档的应用程序
  • 需求.txt

重要说明

以下文件是折旧的(不用于最终草稿),但我保留了它们来向你们展示我的进度: ingest.py, install-deps.sh名字里有“faiss”的任何东西

这 主要的 脚本是 query-cntrl.py 和 query-mcp.py。所有其他脚本都是支持脚本。有关更多详细信息,请参阅相关章节。


发展与环境(简称)

  • 建议使用Python 3.8+。
  • 安装依赖项:pip Install-r requirements.txt
  • 使用Docker实现可重复运行时(请参阅Docker/Dockerfile)。

query-cntrl.py(占位符)

目的:

  • 与任务4类似,使用TF-IDF和PySpark来解析和分块文档并获取嵌入。然后,我使用共符号相似性来查询这些嵌入。

在这里记录什么:

  • 您应该能够使用我们的虚拟txt文件在至少有4个节点的集群上运行此程序
  • 输入:我们的虚拟txt文件
  • 输出:输出结果的路径
  • 依赖关系:Pyspark

理想情况下,我会继续使用Huggingface的模型进行最先进的嵌入,然后查询LLM,但经过几个小时的尝试,我们似乎缺乏访问需要互联网的GCP依赖项的权限(因此在这种情况下,下载LLM等模型的权重以在GCP上使用)


docker/Dockerfile

目的:

  • 用于可再现地运行组件和模拟基本MCP服务器的容器映像,有关更多详细信息,请参阅再现MCP。

query-mcp.py(占位符)

目的:

  • 创建了一个基本的应用程序,它有效地完成了与控件相同的事情,只有检索端被包裹在API调用中,因此我们可以不断地进行新的调用。理论上,您可以向其中添加更多命令来保存结果,以便将其用于其他用途,或者只将其保存在数据库中。

笔记: 我在云中的Docker镜像上使用PySpark时遇到了问题,可能是因为计算问题,但我不是100%确定。学习如何在GCP的Dataproc上构建docker镜像是非常具有挑战性的,所以我必须尽可能地简化它。这就是为什么这个版本甚至不使用PySpark的原因,但它也有助于比较理论上可能是快速的PySpark应用程序与可能较慢的容器化服务器,后者允许您对请求做更多的事情。


复制MCP

下面总结了使用Google Cloud Build和Docker将FastAPI RAG服务器部署到集群上的步骤。

第一阶段:准备和图像构建(通过GCP Cloud Shell)

初始环境设置和图像创建是从Google Cloud Shell终端处理的。你必须把这个放到网站上。

文件上传

所有必需的文件都已上传到Cloud Shell工作目录。GCP中有一个将文件上传到终端的选项:

  • Dockerfile
  • query-mcp.py
  • requirements.txt
  • cloudbuild.yaml
  • Alices-Adventures-in-Wonderland-by-Lewis-Carroll.txt

添加所有这些后,您可以执行以下命令:

gcloud builds submit --config cloudbuild.yaml --project assignment-4-475110

由此,您应该能够在项目的工件注册中找到作为存储库的图像。单击路径并复制路径。

阶段2:部署和执行(通过SSH到主节点)

构建映像后,启动一个集群,并通过SSH连接到该集群的主节点。

SSH访问

集群的主节点是通过SSH访问的。

停止过期集装箱

在运行新映像之前,之前失败的容器被强制停止并删除(如果有的话):

sudo docker rm -f rag-server

运行新映像

容器以分离模式启动,显式使用最新的图像标签并将容器的端口8080绑定到主节点的端口8080:

sudo docker run \
    --detach \
    --publish 8080:8080 \
    --name rag-server \
    <IMAGE_URI>:<TAG>

阶段3:测试和查询实时服务

一旦容器开始运行(docker ps 显示状态为Up),引入我们的客户端脚本运行并实际执行查询。

客户端脚本创建

一个简单的Python客户端脚本(client.py)使用创建 nano:

nano client.py

您只需从github复制并粘贴客户端脚本,然后将其放在此处运行。可能有更好的方法,但这是我发现有效的方法。

执行

最后,您只需运行客户端脚本!

python client.py
# URL: http://localhost:8080/rag

备注

  • 作者:本杰明·兰布赖特