文章介绍了RAG(检索增强生成)系统的构建方法,包括三个核心步骤:索引(文档加载、分块和向量化)、检索(从向量库中获取相关文档)和生成(使用LLM基于检索到的内容生成答案)。通过Python和LangChain库,读者可以学习如何从网页加载内容,将其分割为语义块,创建向量存储,实现检索功能,并最终构建一个完整的RAG系统来回答问题。

1.什么是RAG系统?

RAG系统,全称是“检索增强生成系统”,它是一种结合了信息检索和文本生成技术的 AI 系统。RAG 系统的核心思想是:不要让 LLM 单打独斗,而是给它提供相关的外部知识,让它在生成答案的时候有所依据,从而提高答案的质量和可靠性。 它可以解决 LLM 在知识更新方面滞后,以及容易产生幻觉(捏造事实)等问题。

在开始深构建核心检索增强生成(RAG)系统之前,我们需要首先进行一些必要的准备工作。其中一个关键步骤是配置好我们的开发环境,以便能够有效地跟踪和管理实验过程中的各种活动,并顺利执行其他相关的任务。这包括设置必需的环境变量,以便程序能够正确运行并访问必要的资源。一个具体的例子就是选择并配置我们将要使用的语言模型(LLMs)API提供程序。

import os# Set LangChain API endpoint and API keyos.environ['LANGCHAIN_ENDPOINT'] = 'https://api.smith.langchain.com'os.environ['LANGCHAIN_API_KEY'] = <your-api-key>  # Replace with your LangChain API key# Set OpenAI API keyos.environ['OPENAI_API_KEY'] = <your-api-key>  # Replace with your OpenAI API key

核心 RAG 流水线是高级系统的基石,理解其组件至关重要。因此,在探讨高级组件之前,我们将首先介绍 RAG 系统的核心逻辑。

一个最简单的 RAG 可以分为三个部分:

  • 索引

    :以结构化格式组织和存储数据,以实现高效搜索。当你向 RAG 系统提出一个问题时,它首先会从一个大型的知识库(比如文档库、数据库等)中,检索出与你的问题相关的文档或信息片段。 就像你在搜索引擎里输入关键词,搜索引擎会返回与关键词相关的网页一样。

  • 检索

    :根据查询或输入搜索并获取相关数据。RAG 系统会把检索到的信息和你提出的问题结合起来,形成一个更全面的“输入”。 相当于给 AI 系统提供了更多的上下文信息,帮助它更好地理解你的问题。

  • 生成

    :使用检索到的数据创建最终响应或输出。RAG 系统会利用大型语言模型 (LLM),根据增强后的输入,生成最终的答案。 LLM 会利用检索到的信息来完善答案,使其更准确、更相关。

1.1 索引

在 RAG 系统能够回答任何问题之前,它首先需要从中汲取知识。为此,我们将使用WebBaseLoader直接从子鱼的博客文章中提取内容。

import bs4from langchain_community.document_loaders import WebBaseLoader# Initialize a web document loader with specific parsing instructionsloader = WebBaseLoader(    web_paths=("https://blog.341359.xyz/article/1d4ed29d-c23f-818a-908f-d2eaf450cd1b",),  # URL of the blog post to load    bs_kwargs=dict(        parse_only=bs4.SoupStrainer(            class_=("post-content", "post-title", "post-header")  # Only parse specified HTML classes        )    ),)# Load the filtered content from the web page into documentsdocs = loader.load()

利用bs_kwargs,我们可以从一开始就针对性地清理HTML数据,例如post-content和post-title等标签。获取文档后,我们需要将海量文档输入LLM,但这既低效又受上下文窗口限制。因此,分块至关重要,需将文档分解为更小、语义完整的片段。

使用RecursiveCharacterTextSplitter则能智能地保持段落和句子的完整性。

from langchain.text_splitter import RecursiveCharacterTextSplitter# Create a text splitter to divide text into chunks of 1000 characters with 200-character overlaptext_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)# Split the loaded documents into smaller chunkssplits = text_splitter.split_documents(docs)

接着,我们通过设置chunk_size=1000创建1000字符的块,并使用chunk_overlap=200确保块之间存在200字符的重叠,以保留上下文信息。

现在虽然文本已被分割,但仍需转换为数值表示,即“嵌入”,以便进行相似性搜索。这些嵌入随后会被存储在向量存储中,这是一种专门为高效向量搜索而设计的数据库。

然后我们可以借助Chroma向量存储OpenAIEmbeddings,这将使得嵌入和索引过程变得非常简单。一行代码即可完成所有操作。

from langchain_community.vectorstores import Chromafrom langchain_openai import OpenAIEmbeddings# Embed the text chunks and store them in a Chroma vector store for similarity searchvectorstore = Chroma.from_documents(    documents=splits,     embedding=OpenAIEmbeddings()  # Use OpenAI's embedding model to convert text into vectors)

这便是索引的全部流程,在知识索引之后,我们便可以在此基础上进行检索。

1.2 检索

向量库就像一个图书馆,检索器则是一个智能图书管理员。它接收用户的查询,将其嵌入,然后从向量库中获取语义最相似的块。而创建检索器只需要一行代码。

# Create a retriever from the vector storeretriever = vectorstore.as_retriever()

然后我们可以测试一下这个检索器,也就是问一个问题,然后看看检索器会如何输出。

# Retrieve relevant documents for a querydocs = retriever.get_relevant_documents("What is Foundation Agent?")# Print the content of the first retrieved documentprint(docs[0].page_content)#### OUTPUT ####一个自主、自适应的智能系统,旨在主动感知来自环境的多样化信号 ...

如你所见,检索器成功地从博客文章中提取出了最相关的内容,这些内容直接讨论了"Foundation Agent"。这段上下文正是语言模型形成准确答案所需要的。

1.3 生成

现在有了上下文,但需要 LLM 来进行解读,并形成一个通俗易懂的答案。这就是RAG 中的“生成”步骤。首先,我们需要一个好的提示模板。它会指导 LLM 如何操作。你可以自己进行编写,但如果你是新手,我建议还是从 LangChain Hub 导入一个预先优化好的模板。

from langchain import hub# Pull a pre-made RAG prompt from LangChain Hubprompt = hub.pull("rlm/rag-prompt")# printing the promptprint(prompt)#### OUTPUT ####humanYou are an assistant for question-answering tasks. Use the following piecesof retrieved context to answer the question. If you dont know the answer,just say that you dont know. Use three sentences maximum and keep theanswer concise.Question: {question} Context: {context}

然后使用gpt-3.5-turbo来初始化LLM,这一步也只需要一行代码。

from langchain_openai import ChatOpenAI# Initialize the LLMllm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)

现在我们就可以将所有内容链接在一起。使用 LangChain 表达式语言 (LCEL),将一个组件的输出通过管道传输到下一个组件的输入。

from langchain_core.output_parsers import StrOutputParserfrom langchain_core.runnables import RunnablePassthrough# Helper function to format retrieved documentsdef format_docs(docs):    return "\n\n".join(doc.page_content for doc in docs)# Define the full RAG chainrag_chain = (    {"context": retriever | format_docs, "question": RunnablePassthrough()}    | prompt    | llm    | StrOutputParser())

这个链条由下面四个部分组成:

  1. {“context”: retriever | format_docs, “question”: RunnablePassthrough()}

    :此部分并行运行。它将用户的问题发送到retriever以获取文档,然后由 将其格式化为单个字符串format_docs。同时,RunnablePassthrough将原始问题原封不动地传递过去。

  2. | prompt

    :上下文和问题被输入到我们的提示模板中。

  3. | llm

    :格式化的提示将发送给LLM。

  4. | StrOutputParser()

    :这会将 LLM 的输出清理为一个简单的字符串。

然后,我们可以调用整个链条。

# Ask a question using the RAG chainresponse = rag_chain.invoke("What is Foundation Agent?")print(response)#### OUTPUT ####一个自主、自适应的智能系统,旨在主动感知来自环境的多样化信号,通过不断学习经验来完善和更新结构化的内部状态(如记忆、世界模型、目标、情感状态和奖励信号), ...

2.总结

这便是一个比较详细的构建核心RAG系统的简易教程了。通过本文的介绍,您应该大致会对RAG系统构建的基本原理和实现方法有了初步了解,包括索引、检索和生成这三个核心步骤。虽然这只是一个入门级的教程,但它的确涵盖了构建一个功能完整的RAG系统所需的所有基本要素。


如何系统学习掌握AI大模型?

AI大模型作为人工智能领域的重要技术突破,正成为推动各行各业创新和转型的关键力量。抓住AI大模型的风口,掌握AI大模型的知识和技能将变得越来越重要。

学习AI大模型是一个系统的过程,需要从基础开始,逐步深入到更高级的技术。

这里给大家精心整理了一份全面的AI大模型学习资源,包括:AI大模型全套学习路线图(从入门到实战)、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等,资料免费分享

1. 成长路线图&学习规划

要学习一门新的技术,作为新手一定要先学习成长路线图方向不对,努力白费

这里,我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。可以说是最科学最系统的学习成长路线。

在这里插入图片描述

2. 大模型经典PDF书籍

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础(书籍含电子版PDF)

在这里插入图片描述

3. 大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识

在这里插入图片描述

4. 大模型行业报告

行业分析主要包括对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

在这里插入图片描述

5. 大模型项目实战

学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

在这里插入图片描述

6. 大模型面试题

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

在这里插入图片描述

全套的AI大模型学习资源已经整理打包,有需要的小伙伴可以微信扫描下方CSDN官方认证二维码,免费领取【保证100%免费

Logo

更多推荐