当前位置: 首页 > news >正文

我是如何构建我的第一个 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 管道!下次再见!

http://www.cnnetsun.cn/news/141680.html

相关文章:

  • DPJ-138 基于单片机的指纹密码锁系统设计(源代码+proteus仿真)
  • SpringBoot+Vue 流浪动物救助平台管理平台源码【适合毕设/课设/学习】Java+MySQL
  • 【2025最新】基于SpringBoot+Vue的考试系统管理系统源码+MyBatis+MySQL
  • 企业级流浪动物救助平台管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • 物资综合管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
  • MLX 有多快?在 8 个苹果硅芯片和 4 个 CUDA GPU 上的全面基准测试
  • 生产就绪特性-从开发到部署的完整解决方案
  • 【前端知识点总结】Promise的介绍
  • 2026年河北省职业院校技能大赛“网络系统管理”(高职组)系统服务-Linux部署样题
  • 当 AI 写论文遭遇 “答辩级拷问”:9 款主流工具的生死考验
  • 科研人的 “数据魔咒”:明明数据在手,却挖不出核心结论
  • [特殊字符] 写论文软件哪个好?先看毕业党最在意的 4 大核心标准
  • 历年贵州大学计算机保研复试机试真题
  • AI产业融合纵深发展,治理创新护航智能未来
  • 生成式AI重构内容生态,人机协同定义创作新范式
  • 软件世界的契约:理解开源协议的逻辑与边界
  • vue和springboot框架开发的小程序 智能包裹配送服务管理系统_q3k407ra
  • C 语言输入与输出(I/O)详解
  • 软件测试成本的多维解析与优化路径
  • 5-脱氧-L-阿拉伯糖—结构独特的稀有单糖,药物设计与合成化学的宝贵砌块 CAS:13039-56-0
  • 2-乙酰胺基-1,3,4,6-四-O-乙酰基-2-脱氧-5-硫代-α-D-吡喃葡萄糖 —— 糖化学与药物研发的关键砌块 CAS:67561-97-1
  • 群体分析如何改变你的客户洞察
  • 别再为BGM被下架了,可以生成带声音且无版权素材的AI,真的来了
  • vue和springboot框架开发的校园商店零售管理系统_pt87nuk3
  • vue和springboot框架开发的校园智能AI问答技术的快递物流管理系统_5kf8to85
  • 文件句柄数超限
  • 如何用 Oracle 的账号和权限来连接 ZooKeeper 的客户端认证、ACL 绑定到身份 2 个概念
  • 艾宝体案例 | 以人为本、灵活赋能:Spectris携手KnowBe4打造高效安全意识与合规培训体系
  • 面向2025:融合AI安全的网络安全学习路线与技能清单
  • 迎战2026:网络安全从业者必须掌握的核心技能与实战路线图