使用 LlamaIndex、Ollama 和 Elasticsearch 构建生成式 AI 检索增强(RAG)系统
GenAI RAG with LlamaIndex, Ollama and Elasticsearch
使用 Elasticsearch、LlamaIndex、Ollama 和 Mistral 构建具有检索增强生成的生成式 AI 平台
描述
检索增强生成 (RAG) 是继语义索引和搜索之后的下一个实践步骤。在本课程中,您将构建一个完整的、 本地优先的 RAG 流水线,该流水线能够提取 PDF 文件,将分块向量存储在 Elasticsearch 中,检索正确的上下文,并通过 Ollama 在本地运行 Mistral LLM 生成基于上下文的答案。
我们将在一个具体场景上进行端到端的实践:搜索学生简历,回答诸如“谁在爱尔兰工作过?”或“谁有 Spark 经验?”之类的问题。您将搭建一个 Dockerized 技术栈(FastAPI、Elasticsearch、Kibana、Streamlit、Ollama),并将其与 LlamaIndex 连接起来,这样您就可以专注于逻辑,而不是重复的模板。在此过程中,您将了解 RAG 的优势所在、不足之处(精确率/召回率、幻觉),以及如何进行生产环境的设计。
最后,您将拥有一个可以运行的应用程序:上传 PDF → 提取文本 → 生成干净的 JSON → 分块并嵌入 → 索引到 Elasticsearch → 通过 Streamlit 查询 → 使用 Mistral 生成答案,并且可以在您的机器上完全重现。
我将学到什么?
从搜索到 RAG
重新审视语义搜索并将其扩展至 RAG :首先检索相关块,然后生成基于上下文的答案。了解 LlamaIndex 如何将您的数据连接到 LLM,以及为什么块大小和重叠会影响召回率和准确率。
构建管道
使用 FastAPI 接受 PDF 上传并触发提取流程:文本提取、JSON 整形、分块、嵌入和索引到 Elasticsearch, 所有这些都通过 LlamaIndex 进行协调以最大限度地减少样板。
使用 Elasticsearch
使用向量和元数据为简历块创建索引。了解相似性搜索与关键字查询的区别、向量字段的存储方式以及如何使用 Kibana 探索文档和评分。
Streamlit 聊天界面
构建一个简单的 Streamlit UI,以自然语言提问。切换调试模式以检查哪些区块支持答案,并使用元数据过滤器 (例如按人员)来提高针对性查询的准确率。
提取和 JSON 整形
使用 PyMuPDF 从 PDF 中提取原始文本,然后使用 Ollama (Mistral) 生成无损 JSON (转义字符,保留结构)。通过重试和严格提示处理偶尔出现的 JSON 格式问题。
提高答案质量
学习实用的手段来提高结果:
- 调整块大小/重叠和 top-K 检索
- 为混合过滤添加更丰富的元数据 (角色、技能、位置)
- 尝试嵌入模型和更严格的提示
- 对于列表式问题,考虑结构化输出(例如 JSON 列表)
Dockerized 设置
使用 Docker Compose 启动完整堆栈(FastAPI、Elasticsearch、Kibana、Streamlit 和 Ollama(Mistral), 以便您可以在本地以一致的配置运行整个系统。
奖励:生产模式
探索此原型如何映射到可扩展的设计:
- 将上传内容存储在数据湖 (例如 S3)中,并使用消息队列 (Kafka/SQS)触发处理
- 自动缩放用于分块和嵌入的工作者
- 将 LLM 后端(例如 Bedrock/OpenAI)交换到干净的 API 后面
- 将聊天历史记录保留在 MongoDB/Postgres 中,并用 React/Next.js UI 替换 Streamlit


评论(0)