从零开始用Python打造你的专属RAG系统: 涵盖多轮对话, 混合检索及图像处理 | Building a RAG application in
我们要从头开始搭建一个流媒体在线聊天工具,它不仅能够进行混合搜索,还能记住多轮对话内容,并且支持图片传输。
您将会学到
- 构建一个完整的检索增强生成(Retrieval-Augmented Generation, RAG)管道,使用Python从文档摄取到流媒体聊天输出。
- 运行带有pgvector扩展的Postgres,通过Docker Compose实现,包括用于快速近似最近邻向量搜索的HNSW索引。
- 使用段落感知分割和重叠来分块文档,并解释每个分块选择如何影响检索质量。
- 利用SHA-256内容哈希和事务性更新实现幂等、原子性的文档摄取。
- 使用OpenAI SDK调用本地Ollama模型和OpenAI托管API,通过相同的代码路径。
- 实现结合密集向量搜索与Postgres全文BM25的混合检索,通过互惠排名融合技术进行融合。
- 构建查询重写器,将后续问题如“它吃什么?”转换为能够实际检索有用信息块的独立搜索查询。
- 使用watchdog建立目录监视器,包含每路径防抖功能,确保编辑器保存不会触发对未完全写入文件的读取。
- 应用策略/适配器模式,通过单个环境变量即可将Postgres后端替换为Weaviate,无需更改其余代码。
- 使用FastAPI、服务器发送事件(Server-Sent Events)和原生JavaScript构建流媒体聊天Web用户界面——不使用React,无需构建步骤。
- 使用“描述然后嵌入”的视觉模型管道摄取图像,包括针对视觉后端的格式规范化。
- 在浏览器中安全渲染LLM Markdown输出,使用marked + DOMPurify,支持内联图像。
- 应用标准软件工程模式——依赖注入、工厂模式、策略/适配器模式、上下文管理器、延迟导入等。
- 根据经验诊断RAG失败(余弦分数、全文排名、融合输出),而不是猜测提示。
要求
描述
从零开始构建一个检索增强生成(Retrieval-Augmented Generation, RAG)应用,使用Python——从空目录到具备多轮对话记忆、混合检索、图像摄取以及两种可互换的向量存储后端的流媒体网络聊天。不使用LangChain、LlamaIndex或其他魔法框架,您将亲手编写每一行代码,并最终理解每行代码的作用。
大多数RAG教程会将所有内容封装在一个高级库中,并在“它能工作”时停止。而这个课程则反其道而行之。您将从头开始构建整个管道——分块、嵌入、幂等摄取、结合互惠排名融合技术的语义加词法混合检索、用于后续问题的查询重写器、服务器发送令牌流、用于图像的视觉模型分支——基于普通的Postgres(带有pgvector)和本地Ollama服务器。学习过程中无需支付API费用,没有黑箱操作。当您日后转向LangChain这样的框架时,您将真正了解其内部的工作原理。
在这个项目中您将构建的内容:
- 完全本地运行针对Ollama,或通过更改一个环境变量透明地针对OpenAI API
- 使用Postgres + pgvector与HNSW索引存储嵌入,或在Weaviate中存储——通过单一配置设置即可更换后端
- 混合检索:密集向量搜索和Postgres全文BM25,通过互惠排名融合技术进行融合——修复纯语义搜索在罕见术语、名称和标识符上无声失败的情况
- 自动摄取新文件的目录监视器,带有编辑保存防抖功能,确保不会读取未完全写入的文件
- 基于FastAPI + Server-Sent Events + 原生JavaScript构建的流媒体网络聊天用户界面——没有React,无需构建步骤——具有多轮对话记忆、用于后续问题的查询重写、来源引用和内联图像渲染
- 通过“描述然后嵌入”的视觉模型管道摄取图像——多模态在同一分块表中,不需要模式变更
在此过程中,您将在实际代码中实践真实的软件设计模式:依赖注入、策略/适配器、工厂模式、生命周期管理、上下文管理器、线程安全边界、原子事务、防御性编码以应对外部服务与其文档声称不符的情况。课程反复强调的是良好抽象的好处:早期设计的向量存储接口使您可以轻松添加第二个后端;相同的检索管道服务于命令行界面和Web应用;早期看似学术化的分块元数据字段是后来支持图像变得简单的关键。
完成课程后,您将拥有一个可以扩展的代码库——添加重新排序器、尝试不同的嵌入器、更换聊天模型、指向自己的文档集——并掌握作为生产软件讨论RAG的工程词汇,而不仅仅是笔记本演示。
此课程面向哪些人:
- 对将 LLMs 集成到他们的 Python 项目中并添加 RAG 功能感兴趣的 Python 开发者。