news 2026/3/11 22:38:56

我是如何构建我的第一个 RAG 管道

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
我是如何构建我的第一个 RAG 管道

原文:towardsdatascience.com/how-i-built-my-first-rag-pipeline-6e178326e3c8

LLM 的幻觉甚至对像谷歌这样的科技巨头都是一个问题(只需问 Gemini 每天推荐吃多少石头……剧透一下,是一天一个)。虽然我们仍然不知道如何教授 LLM 常识知识,但我们能做的是为您的特定用例提供足够的上下文。这就是检索增强生成(RAG)发挥作用的地方!在这篇文章中,我将向您展示我是如何实现一个可以阅读我的简历并与招聘人员交谈的 RAG 管道**

嘘!如果你没有会员资格,你可以在这里阅读文章这里。

什么是检索增强生成(RAG)?

首先,让我们打好基础,确保我们理解什么是 RAG 以及它是如何工作的。简而言之,检索增强生成(RAG)是一种技术,其中 LLM 的答案生成通过从一组领域知识中检索到的额外相关信息得到增强。RAG 管道从您的私有数据中挑选出最相关的文本片段,并让 LLM 在提示的同时阅读它,以生成答案。例如,在这篇文章中,我正在构建一个裸骨聊天机器人,为我回答招聘人员的问题。为了使 LLM 能够准确完成其工作,我必须“告诉”它我是谁。使用 RAG 管道,我可以让它检索每个招聘人员问题的最相关部分,从而增强LLM 的答案生成。

简单 RAG 管道的工作原理

现在我们已经了解了它的工作的高层次理论,让我们深入了解它的细节。这就是一个简单的 RAG 管道的样子:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/dc2cd6fa8e979fa6d215e639509c20a2.png

作者提供的简单 RAG 管道图。

如图中所示,构建简单 RAG 管道有两个阶段:

  1. 数据索引

  2. 数据检索和生成

数据索引

它从数据索引开始,这意味着将文本数据转换为可搜索的向量嵌入数据库。首先,在数据索引阶段,文档集合被分成更小的文本片段。这样,在需要时可以给 LLM 提供更小、更精确的文本片段,而不是用太多信息压倒它。然后,文本片段被转换为向量嵌入。向量嵌入将自然语言文本的意义编码成计算机可以读取的数字。最后,向量嵌入存储在向量数据库中,以便它们可以轻松搜索。

数据检索和生成

现在上下文数据块已存储在可搜索的数据库中,数据检索和生成开始。首先,用户的查询(或提示)被转换为一个向量嵌入,就像向量数据库中的上下文数据一样。然后,查询向量与向量数据库中所有上下文数据的向量进行比较,以选择与用户查询最相似的顶部 k 个上下文数据块。最后,用户查询和选定的上下文块被输入到 LLM 中,生成答案。就是这样!

我是如何构建一个简单的 RAG 管道

现在我们已经了解了 RAG 管道背后的理论,让我们将其付诸实践!

这些是我们将遵循的步骤:

  1. 设置环境

  2. 导入 LLM

  3. 导入嵌入模型

  4. 准备数据

  5. 提示工程

  6. 创建查询引擎

设置环境

首先,我们需要导入所有必要的库。我们将使用以下库:

  • Chroma- 一个 AI 原生开源向量数据库。Chroma 将允许我们为向量嵌入创建一个向量数据库。

  • LlamaIndex- 一个用于构建基于 LLM 的上下文增强生成式 AI 应用的框架。LlamaIndex 将处理从读取上下文数据到创建向量嵌入、创建提示模板以及在本地提示 Llama LLM 的所有事情。

importchromadbfromllama_index.coreimportPromptTemplatefromllama_index.coreimportSettingsfromllama_index.coreimportSimpleDirectoryReaderfromllama_index.coreimportStorageContextfromllama_index.coreimportVectorStoreIndexfromllama_index.core.node_parserimportSentenceSplitterfromllama_index.embeddings.huggingfaceimportHuggingFaceEmbeddingfromllama_index.llms.ollamaimportOllamafromllama_index.vector_stores.chromaimportChromaVectorStore

要安装这些库,您可以运行以下命令:

pip install chromadb pip install llama-index

导入 Llama LLM

现在所有必要的库都已导入,我们可以开始导入一个 LLM。我选择使用 Llama,因为它允许我在本地运行它,这意味着它是免费且私有的!Ollama 库使得导入变得非常简单——只需指定您想使用的版本,然后通过调用*.complete*来提示它。

llm=Ollama(model="llama3")response=llm.complete("Who is Laurie Voss? write in 10 words")print(response)

导入嵌入模型

接下来,我们导入一个嵌入模型,它处理从文本到上下文数据和提示的向量嵌入的转换。您可以从大量嵌入模型中进行选择。我使用了来自 Hugging Face 的"BAAI/bge-small-en-v1.5",因为它是一个小型模型。模型越小,实现速度越快,但以模型的能力为代价。由于我的 RAG 管道只是一个 POC,我不介意次优性能,而且额外的速度提升是一个加分项。

embed_model=HuggingFaceEmbedding(model_name="BAAI/bge-small-en-v1.5")Settings.llm=llm Settings.embed_model=embed_model

准备数据

嵌入模型作为数据准备的一部分被使用。为了准备数据,我们首先使用SimpleDirectoryReader读取包含上下文的文件。在这种情况下,它是我一页简历的 PDF。然后我们使用Chroma创建一个向量数据库。最后,我们将上下文数据作为向量嵌入存储在向量数据库中,并使用VectorStoreIndex执行文本块转换。

documents=SimpleDirectoryReader(input_files=["./resume.pdf"]).load_data()chroma_client=chromadb.EphemeralClient()chroma_collection=chroma_client.create_collection("ollama")vector_store=ChromaVectorStore(chroma_collection=chroma_collection)storage_context=StorageContext.from_defaults(vector_store=vector_store)index=VectorStoreIndex.from_documents(documents,storage_context=storage_context,embed_model=embed_model,transformations=[SentenceSplitter(chunk_size=256,chunk_overlap=10)])

提示工程

现在 RAG 管道的内部工作已经设置好,我们编写一个模板查询,为 LLM 分配任务和角色,提供相关上下文,并插入问题。

template=("Imagine you are a data scientist's assistant and ""you answer a recruiter's questions about the data scientist's experience.""Here is some context from the data scientist's ""resume related to the query::n""-----------------------------------------n""{context_str}n""-----------------------------------------n""Considering the above information, ""please respond to the following inquiry:nn""Question: {query_str}nn""Answer succinctly and ensure your response is ""clear to someone without a data science background.""The data scientist's name is Diana.")qa_template=PromptTemplate(template)

创建查询引擎

最后,我们创建一个查询引擎,它组装所有的乐高积木!

query_engine=index.as_query_engine(text_qa_template=qa_template,similarity_top_k=3)

运行 RAG 管道

现在,让我们来到构建 AI 应用的有趣部分——看到它工作!要运行 RAG 管道,只需向查询引擎提出一个问题,然后,哇!

response=query_engine.query("Do you have experience with Python?")print(response.response)
'Yes,I can confirm that Diana Morales has extensive experience workingwithPythonasa Data Scientist at Accenture.According to her resume,she listed Pythonasone of her core skills,indicating a strong proficiencyinthe programming language.Additionally,her projectsandachievements highlight her ability to leverage Pythonforvarious data science tasks,suchasnatural language processing(NLP),machine learning,anddata visualizations.'

真的很不错,不是吗?

在我的下一篇文章中,我将更深入地介绍 RAG 管道,涉及更多高级主题。如果你喜欢这篇文章,别忘了点赞和评论,并分享你根据这篇文章构建的所有令人惊叹的 RAG 管道!下次再见!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/3 7:34:51

Claude Skills:不是更聪明,而是更“像专家”的 Agent 养成方法

一、你并不缺 Agent,你缺的是“会干活的专家”很多团队在引入 Claude 或其他大模型 Agent 之后,都会经历一个相似阶段:Demo 阶段惊艳POC 阶段可用真正落地时开始失望Agent 能回答问题,但回答得像个“懂点皮毛的实习生”&#xff1…

作者头像 李华
网站建设 2026/3/10 4:11:51

绝了!AI圈新顶流-Banana Pro科研绘图全教程

Nano Banana Pro无疑是近期AI圈的顶流,但多数人只用来生成网红图——但其实! 搭载Gemini3推理能力的Nano Banana Pro(简称NBP)在科研绘图领域的实力被严重低估! 当我用它攻克论文插图难题时,其产出的专业度…

作者头像 李华
网站建设 2026/3/10 13:32:41

网络通信协议全景:从传输层到应用层的演化与综合应用

网络通信协议全景:从传输层到应用层的演化与综合应用 摘要:本文以经典TCP套接字编程为基础,系统剖析了不同层次网络协议的实现原理与设计哲学。在深入探讨TCP可靠传输、UDP无连接通信及HTTP应用层规范的基础上,将研究视野扩展至IC…

作者头像 李华