使用 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
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。