超越简单 RAG:使用 Next.js、Python 和 Supabase 构建 Agentic 工作流
Source: Dev.to


问题:“Chat with PDF” 成为新的 Hello World
构建一个基本的 RAG 应用如今很容易。你上传一个 5 页的 PDF,将其拆分成 1,000 字符的块,它就能工作。
当我尝试用 500 页的大学教材 时,标准流水线崩溃了。我不想要一个聊天机器人;我想要一个导师。所以我创建了 Learneazy.io。
秘密酱料:三层语义索引
大多数 RAG 应用把文档视为一个巨大的文本块。然而,教科书有自然的层次结构(索引 → 章节 → 内容)。我在数据库中使用 Python (Flask) 微服务和 PyMuPDF 镜像了这种结构。
第 1 层 – “骨架”(目录)
目的: 快速的高级结构查询。
第 2 层 – “容器”(按章节划分的块)
目的: 上下文感知搜索。当你询问“第 4 章的热力学”时,只会搜索第 4 章。
第 3 层 – “深度挖掘”(细粒度块)
目的: 回答每个细微差别都重要的具体深度问题。
大脑:代理路由
层级索引如果没有决定查询哪一层的机制就毫无用处。我实现了一个配备了每层自定义工具的 LangChain Agent。该代理充当路由器:
- 用户: “有多少章节?” → 代理: 调用 Index Tool(快速、低成本)。
- 用户: “总结第 3 章。” → 代理: 调用 Chapter Tool(高上下文)。
- 用户: “解释 X 的公式。” → 代理: 调用 Deep Dive Tool(高精度)。
这种路由逻辑将 token 使用量降低了约 40 %,并显著提升了准确性。
超越聊天:闪卡引擎
最困难的技术挑战是让用户能够说:“为第5章生成10张闪卡”。AI 不能仅仅猜测;它需要一个有依据的工作流。
- 主题提取: 扫描 Chapter Layer 以识别关键主题(例如,“线粒体”,“克雷布斯循环”)。
- 上下文检索: 在 Deep Dive Layer 中针对这些主题执行向量搜索,以获取精确定义。
- 合成: 使用 LLM(Google Gemini)将有依据的事实格式化为严格的问答对。
结果:闪卡是从用户的特定材料生成的,而不是通用的互联网知识。
技术栈:为何采用微服务?
| 组件 | 技术 | 理由 |
|---|---|---|
| 前端 | Next.js 16 (React 19) | 快速、响应式的用户界面 |
| 处理服务 | Python (Flask) | 卓越的 PDF 处理和分块逻辑 |
| 嵌入 | Cohere (embed-english-v3.0) | 针对 RAG 检索质量进行微调,在此用例中优于 OpenAI |
| 数据库 | Supabase (PostgreSQL + pgVector) | 将向量与用户数据(认证、元数据)一起存储,实现简化的后端 |
| 源代码 | github.com/Abhinav-Sriharsha/Learneazy |