在人工智能 (AI) 时代,从海量数据集中提取有意义的知识对于企业和个人都变得至关重要。输入检索增强生成(RAG)是一项突破,它增强了人工智能的能力,使系统不仅能够生成类似人类的文本,而且能够实时提取相关信息。这种融合产生了上下文丰富且细节精确的响应。
当我们在人工智能 (AI) 的浩瀚海洋中踏上激动人心的航程时,有必要了解将成为我们指路明星的三大支柱:生成式人工智能、大型语言模型 (LLM)、LangChain、Hugging Face ,以及在此 RAG(检索增强生成)上的有用应用。
大型语言模型和生成式人工智能:创新引擎
我们旅程的核心是大型语言模型 (LLM) 和生成式人工智能:推动创新船舶前进的两个强大引擎。
大型语言模型 (LLM)
LLM,例如 Qwen、GPT 等,文本巨人,能够大规模理解和生成类似人类的语言。这些模型已经在广泛的文本数据语料库上进行了训练,使它们能够预测并生成连贯且上下文相关的文本字符串。它们是从翻译到内容创建等许多自然语言处理任务的支柱。
生成式人工智能 (GenAI)
生成式人工智能是人工智能领域内巧妙的创造魔法。它包含生成类似于训练数据的新数据实例的技术,例如图像、音乐,以及对我们的航行最重要的文本。在我们的背景下,生成式人工智能是指人工智能能够制作出前所未见的新颖且信息丰富的反应、故事或想法的能力。它使人工智能不仅能够模仿过去,而且能够发明、创新和启发。
LangChain:编排你的人工智能交响乐
LangChain作为架构师我们的人工智能工作流程,精心设计了允许各种人工智能组件之间无缝集成和交互的结构。该框架简化了将来自智能子系统(包括法学硕士和检索系统)的数据流链接在一起的复杂过程,使信息提取和自然语言理解等任务比以往任何时候都更容易完成。
拥抱脸:AI 模型大都市
Hugging Face 是一座繁华的大都市,人工智能模型在此蓬勃发展。这个中心枢纽提供了大量的预训练模型,为机器学习探索和应用提供了沃土。要访问该中心及其资源,您必须创建一个 Hugging Face 帐户。一旦您迈出了这一步,通往广阔的人工智能世界的大门就在等待着您 – 只需访问 Hugging Face 并注册即可开始你的冒险。
RAG:利用矢量数据库加速智能
检索增强生成 (RAG) 是一种复杂的人工智能技术,它将生成式人工智能的创造力与知识检索的精确性相结合,创建了一个不仅清晰而且信息丰富的系统。为了释放 RAG 的全部潜力和效率,它集成了矢量数据库,这是一种快速筛选大量信息存储库的强大工具。以下是 RAG 如何使用向量数据库进行操作的详细说明:
- 使用向量数据库进行检索向量数据库:RAG 通过查询向量数据库开始其流程,该数据库包含大量信息语料库的嵌入式表示。这些嵌入是高维向量,封装了文档或数据片段的语义本质。矢量数据库使 RAG 能够在这些嵌入中执行闪电般的快速搜索,以查明与给定查询最相关的内容,就像人工智能快速导航数字图书馆以找到合适的书籍一样。
- 上下文增强:然后将从向量数据库检索到的相关信息作为上下文增强提供给生成模型。这一步骤为人工智能提供了集中的知识,增强了其做出反应的能力,这些反应不仅具有创造性,而且上下文丰富且精确。
- 生成知情响应:有了这种背景,生成模型就会开始生成文本。与仅依赖于学习模式的标准生成模型不同,RAG 融入了检索到的数据中的细节,从而产生既富有想象力又经检索到的知识证实的输出。因此,一代人得到了提升,产生了更准确、信息更丰富、反映真实背景的响应。
矢量数据库的集成是 RAG 效率的关键。传统的元数据搜索方法可能速度较慢且不太精确,但矢量数据库有助于近乎即时地检索上下文相关信息,即使是从非常大的数据集中也是如此。这种方法不仅节省了宝贵的时间,而且还确保人工智能的响应基于最合适和最新的可用信息。
RAG 的能力在聊天机器人、数字助理和复杂的研究工具等应用中尤其具有优势,在任何需要提供精确、可靠和基于上下文的信息至关重要的地方。这不仅仅是精心设计听起来令人信服的回应;它是关于生成基于可验证数据和现实世界知识的内容。
凭借对 LangChain、Hugging Face、LLM、GenAI 和矢量数据库增强型 RAG 的丰富理解,我们正处于编码冒险的边缘,将这些技术变为现实。我们将深入研究的 Python 脚本代表了这些元素的协同作用,展示了一个人工智能系统不仅能够以创造力和上下文做出响应,而且还能够具有一度被认为是科幻小说领域的深度理解。准备编码并体验 RAG 与矢量数据库的变革力量。
开始编码之旅
开始之前:要点
在我们踏上这段科技之旅之前,让我们确保您已经万事具备:
- Linux 服务器配备 GPU 卡会更好 – 因为让我们面对现实,速度至关重要。
- Python 3.6 或更高版本 – 编程的魔杖。
- pip 或 Anaconda – 您方便的花花公子包管理器。
- Git(可选)——适合那些喜欢从存储库中新鲜获取代码的人。
- 如果使用 GPU 卡,则需要 NVIDIA 驱动程序、CUDA Toolkit 和 cuDNN——GPU 加速的三位一体。
明白了吗?极好!让我们亲自动手(当然是象征性的)。
运行代码:从 GitHub 到您的机器
此 RAG 冒险的代码托管在 GitHub 上的 Awesome-Qwen 存储库中。要运行它,您需要将此存储库克隆到本地计算机。方法如下:
1.打开终端或命令提示符。
2.导航到要克隆存储库的目录。
3.运行克隆命令:
git 克隆 https://github.com/k-farruh/Awesome-Qwen.git
4.克隆存储库后,导航到 Awesome-Qwen 目录:
cd Awesome-Qwen
5. requirements.txt 文件包含项目所需的所有 Python 包及其各自版本的列表。要安装它们,请运行以下命令:
pip install -r requests.txt
有时,您可能会在安装过程中遇到错误。这些问题可能源于多种问题,例如版本冲突、过时的软件包或与系统不兼容。以下是如何驾驭这些危险水域的方法:
- 阅读错误消息:Python 错误消息通常提供丰富信息,并提供有关出错原因的线索。查找指示未找到软件包、版本冲突或其他安装问题的消息。
- 检查 Python 版本:确保您使用的 Python 版本与您尝试安装的软件包兼容。某些软件包可能不支持较旧版本或预发布版本的 Python。
- 升级 pip:有时,只需升级 pip 即可解决问题。使用命令 pip install –upgrade pip 获取最新版本。
- 虚拟环境:使用虚拟环境可以让您单独管理不同项目的依赖关系。 venv 或 conda 等工具可以帮助您创建隔离的 Python 环境,您可以在其中安装特定的软件包版本,而不会影响全局软件包空间。
- 查阅文档:查找有问题的包的文档。它可能包含有关兼容性的注释或解决安装问题的说明。
- 寻求帮助:如果您仍然遇到困难,请使用 Stack Overflow 或软件包的 GitHub 问题页面等资源。很可能其他人也遇到过同样的问题并找到了解决方案。
- 最后的手段——修改requirements.txt:作为最后的手段,如果特定的软件包版本与您的系统不兼容,您可以尝试将requirements.txt中的版本号更改为更高版本。合适的一个。不过,请谨慎执行此操作,因为更改版本可能会导致应用程序出现意外行为。
通过仔细管理您的 Python 依赖项,您可以确保您的 AI 项目构建在稳定可靠的基础上。依赖关系到位并正确设置环境后,您就可以运行脚本并见证 RAG 和 LangChain 的强大功能。
6.现在,您可以执行存储库中提供的 Python 脚本来查看 RAG 的运行情况。
做好准备:导入库和加载变量
在我们利用 LangChain 框架和 Hugging Face 的 Transformers 库开始探索人工智能之前,建立一个安全且配置良好的环境至关重要。此准备工作包括导入必要的库并通过环境变量管理 API 密钥等敏感信息。
从火炬导入cuda从langchain_community.vectorstores导入FAISS从langchain_core.output_parsers导入StrOutputParser从langchain_core.prompts导入ChatPromptTemplate从langchain_core.runnables导入RunnablePassthrough从langchain_community.embeddings.huggingface导入HuggingFaceEmbeddings 来自变压器导入 AutoModelForCausalLM、AutoTokenizer 来自 langchain_community.llms.huggingface_pipeline 导入 HuggingFacePipeline 来自变压器导入管道 来自 dotenv 导入 load_dotenv
load_dotenv()
使用 Hugging Face 中的 AI 模型时,您通常需要访问 Hugging Face API,这需要 API 密钥。此密钥是您向 Hugging Face 服务发出请求时的唯一标识符,允许您加载模型并在应用程序中使用它们。
为了安全地设置您的环境,您需要执行以下操作:
- 获取您的 Hugging Face API 密钥:创建 Hugging Face 帐户后,您可以在帐户设置的“访问令牌”部分下找到您的 API 密钥。
- 保护您的 API 密钥:您的 API 密钥是敏感信息,应保密。您应该使用环境变量,而不是将其硬编码到脚本中。
- 创建 .env 文件:在从 GitHub 存储库,创建一个名为 .env 的文件。该文件将存储您的环境变量。
- 将您的 API 密钥添加到 .env 文件:使用文本编辑器打开 .env 文件,然后按以下格式添加您的 Hugging Face API 密钥:
HUGGINGFACE_API_KEY=your_api_key_here
将 your_api_key_here
替换为您从 Hugging Face 获取的实际 API 密钥。
定义模型路径和配置
modelPath = "sentence-transformers/all-mpnet-base-v2" device = 'cuda' if cuda.is_available() else 'cpu' model_kwargs = {'device ':设备}
在这里,我们设置将用于嵌入的预训练模型的路径。我们还配置设备设置,如果可以实现更快的计算,则使用 GPU,否则默认使用 CPU。
初始化拥抱面部嵌入和 FAISS 矢量存储
嵌入 = HuggingFaceEmbeddings( model_name=modelPath, model_kwargs=model_kwargs, )
# 编造数据,只是为了好玩,但谁知道将来会不会 vectorstore = FAISS.from_texts( ["Harrison was work at Ali Cloud"], embedding=embeddings )
检索器 = vectorstore.as_retriever()
我们使用我们选择的模型和配置初始化 HuggingFaceEmbeddings
的实例。然后,我们使用 FAISS 创建一个向量存储,这使我们能够在高维空间中执行有效的相似性搜索。我们还实例化了一个检索器,它将根据嵌入获取信息。
设置聊天提示模板
template = """仅根据以下上下文回答问题:{context} 问题:{question} """
提示 = ChatPromptTemplate.from_template(template)
在这里,我们定义了一个聊天提示模板,用于构建与人工智能的交互。它包括上下文和问题的占位符,这些占位符将在链执行期间动态填充。
准备分词器和语言模型
在人工智能和自然语言处理领域,分词器和语言模型是将文本转化为有意义的动作的动态组合。分词器将语言分解为模型可以理解的片段,而语言模型则根据这些输入预测并生成语言。在我们的旅程中,我们使用 Hugging Face 的 AutoTokenizer 和 AutoModelForCausalLM 类来利用这些功能。但重要的是要记住,在选择语言模型时,一种方法并不适合所有情况。
模型大小和计算资源
模型的大小是需要考虑的关键因素。像 Qwen-72B 这样的较大模型有更多参数,这通常意味着它们可以理解并生成更细致的文本。然而,它们也需要更多的计算能力。如果您配备了高端 GPU 和足够的内存,您可能会选择这些较大的型号以充分利用其功能。
另一方面,像 Qwen-1.8B 这样的较小模型对于标准计算环境来说更易于管理。即使是这个微型模型也应该能够在物联网和移动设备上运行。虽然它们可能无法像较大的对应语言那样捕捉语言的复杂性,但它们仍然提供出色的性能,并且对于那些没有专用硬件的人来说更容易访问。
特定于任务的模型
另一点需要考虑的是您的任务的性质。如果您正在构建对话式 AI,那么使用 Qwen-7B-Chat 等特定于聊天的模型可能会产生更好的结果,因为这些模型针对对话进行了微调,并且可以比基本模型更好地处理对话的细微差别。 p>
推理成本
较大的模型不仅对硬件的要求更高,而且如果您使用基于云的服务来运行模型,还可能会产生更高的成本。每个推理都会占用处理时间和资源,如果您使用的是大型模型,这些时间和资源可能会增加。
Qwen系列
- Qwen-1.8B:较小的模型,适合需要较少计算能力的任务。适合在没有强大 GPU 的机器上进行原型设计和运行。
- Qwen-7B:一种平衡性能与计算需求的中型模型。适用于一系列任务,包括文本生成和问答。
- Qwen-14B:更大的模型,可以处理更复杂的任务,在语言理解和生成方面具有更大的细微差别。
- Qwen-72B:该系列中最大的型号,为需要深度语言理解的高级人工智能应用提供最先进的性能。
- Qwen-1.8B-Chat:专为构建聊天机器人和其他对话系统而设计的会话模型。
- Qwen-7B-Chat:与 Qwen-1.8B-Chat 类似,但处理更复杂对话的能力有所增强。
- Qwen-14B-Chat:一种能够进行复杂对话交互的高端对话模型。
- Qwen-72B-Chat:Qwen 系列中最先进的对话模型,为要求苛刻的聊天应用程序提供卓越的性能。
做出选择
在决定使用哪个模型时,请根据可用资源和项目的具体要求权衡较大模型的优势。如果您刚刚起步或进行较小规模的开发,较小的模型可能是最佳选择。随着您的需求增长,或者如果您需要更高级的功能,请考虑升级到更大的型号。
请记住,Qwen 系列是开源的,因此您可以尝试不同的模型,看看哪一个最适合您的项目。如果您决定使用不同的模型,脚本的模型选择部分可能如下所示:
# 可以根据您的需求和资源将其更改为任何 Qwen 模型 tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen-7B", trust_remote_code=True) model_name_or_path = "Qwen/Qwen-7B" model = AutoModelForCausalLM.from_pretrained(model_name_or_path, device_map="auto", trust_remote_code=True)
我们分别使用 AutoTokenizer 和 AutoModelForCausalLM 类从 Hugging Face 加载标记生成器和因果语言模型。这些组件对于处理自然语言输入和生成输出至关重要。
创建文本生成管道
此管道旨在使用先前加载的语言模型和标记生成器生成文本。让我们分解参数并了解它们在控制文本生成行为中的作用:
pipe = pipeline("文本生成", model=model, tokenizer=tokenizer, max_new_tokens=8192, do_sample=True, 温度=0.7, top_p=0.95, top_k =40,重复惩罚=1.1)
hf = HuggingFacePipeline(pipeline=pipe)
文本生成管道中的参数说明
max_new_tokens (8192)
:此参数指定输出中可以生成的最大令牌数。标记可以是单词、字符或子词,具体取决于标记生成器。do_sample (True)
:设置为 True 时,此参数启用从模型生成的可能的下一个标记的分布中进行概率采样。这在生成的文本中引入了随机性和多样性。如果设置为 False,模型将始终选择最有可能的下一个标记,从而产生确定性且变化较小的输出。温度 (0.7)
:温度参数控制采样过程中引入的随机性程度。较低的温度值(接近 0)使模型对其选择更有信心,从而减少随机输出,而较高的温度值(接近 1)则鼓励更多的随机性和多样性。top_p (0.95)
:此参数控制核心采样,这是一种仅考虑累积概率高于阈值 top_p 的最可能标记的技术。它有助于生成既多样化又连贯的文本,避免包含可能使文本变得无意义的极低概率标记。top_k (40)
:Top-k 采样将采样池限制为 k 个最有可能的下一个标记。这进一步细化了模型在生成下一段文本时将考虑的标记集,确保输出保持相关性和连贯性。repetition_penalty (1.1)
:此参数阻止模型重复相同的标记或短语,从而促进更有趣和多样化的文本。大于 1 的值会受到惩罚,从而降低标记已出现的可能性。
使用所需参数设置管道后,下一行代码:
hf = HuggingFacePipeline(pipeline=pipe)
将管道对象包装在 HuggingFacePipeline
中。该类是LangChain框架的一部分,允许管道无缝集成到LangChain的工作流程中以构建AI应用程序。通过包装管道,我们现在可以将其与郎链的其他组件(例如检索器和解析器)结合使用,以创建更复杂的人工智能系统。
仔细选择这些参数可以让您微调文本生成的行为,以满足您的应用程序的特定需求,无论您是在寻找更具创意和多样化的输出,还是旨在获得一致连贯和集中的文本。
构建并运行 RAG 链
下面的代码片段代表了一个完整的端到端 RAG 系统,其中初始问题提示搜索相关信息,然后将其用于增强生成过程,从而为输入问题提供知情且上下文相关的答案.
链结构
chain = ( {"context": 检索器, "question": RunnablePassthrough()} | 提示 | hf | StrOutputParser() )
这是这部分代码中发生的事情:
- 检索器用于根据查询获取相关信息。检索器的作用是梳理数据集或文档集合,以查找与所提出的问题最相关的信息。这可能是使用矢量数据库来提高效率。
_RunnablePassthrough() _
是一个简单地传递问题而不进行任何修改的组件。这表明该链旨在直接处理问题,可能是由用户输入的。- 此处未详细显示
提示
,但它可能用作模板或一组指令,以适合下一阶段的方式格式化输入问题和检索到的上下文正在开发中,这是 Hugging Face 模型。 hf
变量表示 Hugging Face 管道,它可能是一个能够生成响应的预训练语言模型。该管道将采用上一步中的格式化输入,并使用其生成功能来生成答案。StrOutputParser()
是一个输出解析器,它的工作是从 Hugging Face 管道获取原始输出,并将其解析为更用户友好的格式,可能是字符串。李>
使用| (管道)运算符表明此代码使用函数式编程风格,特别是函数组合的概念或管道模式,其中一个函数的输出成为下一个函数的输入。
链式调用
results = chain.invoke("哈里森在哪里工作?")
在这一行中,通过一个特定问题来调用链:“Harrison 在哪里工作?” 此调用会触发链中定义的整个操作序列。检索器搜索相关信息,然后将其与问题一起通过提示传递到 Hugging Face 模型中。该模型根据收到的输入生成响应。
打印结果
打印(结果)
生成的响应随后由 StrOutputParser()
进行解析并作为最终结果返回,然后打印到控制台或其他输出。
最后,我们通过链接检索器、提示模板、Hugging Face 管道和输出解析器来构建 RAG 链。我们用问题调用链,并打印结果。
结论:掌握 AI 的大门
您刚刚通过 RAG 和 LangChain 在人工智能世界中迈出了一大步。通过理解和运行此代码,您将释放创建智能系统的潜力,该系统可以以前所未有的方式推理信息并与信息交互。
请记住,这仅仅是开始。您对 RAG 进行的实验和修改越多,您的理解就越深入,您的创新能力也就越强。因此,克隆 Awesome-Qwen 存储库,设置您的环境,并开始构建未来的智能应用程序!