原文:
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 管道有两个阶段:
数据索引
数据检索和生成
数据索引
它从数据索引开始,这意味着将文本数据转换为可搜索的向量嵌入数据库。首先,在数据索引阶段,文档集合被分成更小的文本片段。这样,在需要时可以给 LLM 提供更小、更精确的文本片段,而不是用太多信息压倒它。然后,文本片段被转换为向量嵌入。向量嵌入将自然语言文本的意义编码成计算机可以读取的数字。最后,向量嵌入存储在向量数据库中,以便它们可以轻松搜索。
数据检索和生成
现在上下文数据块已存储在可搜索的数据库中,数据检索和生成开始。首先,用户的查询(或提示)被转换为一个向量嵌入,就像向量数据库中的上下文数据一样。然后,查询向量与向量数据库中所有上下文数据的向量进行比较,以选择与用户查询最相似的顶部 k 个上下文数据块。最后,用户查询和选定的上下文块被输入到 LLM 中,生成答案。就是这样!
我是如何构建一个简单的 RAG 管道
现在我们已经了解了 RAG 管道背后的理论,让我们将其付诸实践!
这些是我们将遵循的步骤:
设置环境
导入 LLM
导入嵌入模型
准备数据
提示工程
创建查询引擎
设置环境
首先,我们需要导入所有必要的库。我们将使用以下库:
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 管道!下次再见!