微信扫码
与创始人交个朋友
我要投稿
在人工智能 (AI) 时代,从海量数据集中提取有意义的知识对企业和个人都变得至关重要。进入检索增强生成 (RAG),这是一项突破,它增强了 AI 的能力,使系统不仅能够生成类似人类的文本,还可以实时提取相关信息。这种融合产生的响应既有丰富的背景,又有精确的细节。
当我们在人工智能 (AI) 的浩瀚海洋中扬帆起航时,必须了解将成为我们指路明灯的三大支柱:生成式 AI、大型语言模型 (LLM)、LangChain、Hugging Face 以及此 RAG(检索增强生成)上的有用应用程序。
我们旅程的核心是大型语言模型 (LLM) 和生成式 AI——推动创新之船前进的两个强大引擎。
LLM,如Qwen、GPT等,是文本的巨头,能够大规模地理解和生成类人语言。这些模型已经在广泛的文本数据语料库上进行了训练,使它们能够预测和生成连贯且与上下文相关的文本字符串。它们是许多自然语言处理任务的支柱,从翻译到内容创建。
生成式 AI 是 AI 领域内巧妙的创造奇才。它包含生成类似于训练数据的新数据实例的技术,例如图像、音乐,以及对于我们的航行来说最重要的是文本。在我们的上下文中,生成式 AI 是指 AI 能够制作出前所未有的新颖且信息丰富的响应、故事或想法。它使人工智能不仅能够模仿过去,而且能够发明、创新和激发灵感。
LangChain作为我们AI工作流程的架构师,精心设计了允许各种AI组件之间无缝集成和交互的结构。该框架简化了将来自智能子系统(包括 LLM 和检索系统)的数据流链接在一起的复杂过程,使信息提取和自然语言理解等任务比以往任何时候都更容易访问。
Hugging Face 是一个繁华的大都市,AI 模型在这里蓬勃发展。这个中心枢纽提供了大量预训练模型,为机器学习探索和应用提供了肥沃的土壤。若要访问此中心及其资源,必须创建一个 Hugging Face 帐户。一旦你迈出了这一步,通往广阔的人工智能世界的大门就在等着你——只需访问 Hugging Face 并注册即可开始你的冒险。
检索增强生成 (RAG) 是一种复杂的 AI 技术,它将生成式 AI 的创造力与知识检索的精确性相结合,创建一个不仅清晰而且信息丰富的系统。为了释放RAG的全部潜力和效率,它集成了矢量数据库,这是一个快速筛选大量信息库的强大工具。以下是 RAG 如何与向量数据库一起运行的增强细分:
使用向量数据库进行检索:RAG 通过查询向量数据库开始其过程,该数据库包含大量信息语料库的嵌入式表示。这些嵌入是封装文档或数据片段的语义本质的高维向量。矢量数据库使 RAG 能够在这些嵌入中执行闪电般的快速搜索,以精确定位与给定查询最相关的内容,就像 AI 快速浏览数字图书馆以找到合适的书籍一样。
上下文增强:然后,从向量数据库中检索到的相关信息作为上下文增强提供给生成模型。这一步为人工智能提供了集中的知识,增强了它制作响应的能力,这些响应不仅具有创造性,而且具有丰富和精确的上下文。
生成知情响应:有了这个上下文,生成模型就会继续生成文本。与仅依赖于学习模式的标准生成模型不同,RAG 从检索到的数据中编织细节,从而产生既富有想象力又被检索到的知识所证实的输出。因此,生成被提升,产生更准确、信息更丰富、更能反映真实背景的响应。
矢量数据库的集成是RAG效率的关键。传统的元数据搜索方法可能更慢、更不精确,但矢量数据库有助于近乎即时地检索上下文相关信息,即使是从非常大的数据集中也是如此。这种方法不仅节省了宝贵的时间,而且还确保了人工智能的响应基于最合适和最新的可用信息。
RAG的实力在聊天机器人、数字助理和复杂的研究工具等应用中尤为有利,这些应用在提供精确、可靠和基于上下文的信息至关重要的任何地方。这不仅仅是制作听起来令人信服的回应;它是关于生成以可验证数据和现实世界知识为基础的内容。
凭借对 LangChain、Hugging Face、LLM、GenAI 和向量数据库增强型 RAG 的丰富理解,我们正处于编码冒险的边缘,将这些技术变为现实。我们将深入研究的 Python 脚本代表了这些元素的协同作用,展示了一个 AI 系统,不仅能够以创造力和上下文做出反应,而且还能够以曾经被认为是科幻小说领域的深度理解做出反应。准备编码并体验 RAG 与矢量数据库的变革力量。
在我们踏上这场科技之旅之前,让我们确保你已经把所有的鸭子都排成一排了:
Linux 服务器使用 GPU 卡会更好——因为让我们面对现实吧,速度至关重要。
Python 3.6 或更高版本 — 编程的魔杖。
pip 或 Anaconda — 您方便的花花公子包管理器。
如果是 GPU 卡,那么 NVIDIA 驱动程序、CUDA Toolkit 和 cuDNN — GPU 加速的三位一体。
明白了吗?瑰!让我们亲自动手(当然是比喻性的)。
通过仔细管理你的 Python 依赖项,你可以确保你的 AI 项目建立在稳定可靠的基础上。有了依赖关系并正确设置了环境,您就可以运行脚本并见证 RAG 和 LangChain 的强大功能了。
在我们开始使用 LangChain 框架和 Hugging Face 的 Transformers 库探索 AI 之前,建立一个安全且配置良好的环境至关重要。此准备工作涉及导入必要的库,并通过环境变量管理敏感信息(如 API 密钥)。
from torch import cuda
from langchain_community.vectorstores import FAISS
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_community.embeddings.huggingface import HuggingFaceEmbeddings
from transformers import AutoModelForCausalLM, AutoTokenizer
from langchain_community.llms.huggingface_pipeline import HuggingFacePipeline
from transformers import pipeline
from dotenv import load_dotenv
load_dotenv()
使用 Hugging Face 中的 AI 模型时,您通常需要访问 Hugging Face API,这需要 API 密钥。此密钥是向 Hugging Face 服务发出请求时的唯一标识符,允许您加载模型并在应用程序中使用它们。
以下是安全设置环境所需的操作:
获取您的 Hugging Face API 密钥:创建 Hugging Face 帐户后,您可以在“访问令牌”部分下的帐户设置中找到您的 API 密钥。
保护您的 API 密钥:您的 API 密钥是敏感信息,应保密。与其将其硬编码到脚本中,不如使用环境变量。
创建 .env 文件:创建名为 .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': device}
在这里,我们设置了将用于嵌入的预训练模型的路径。我们还配置了设备设置,如果可用,则使用 GPU 以加快计算速度,否则默认为 CPU。
embeddings = HuggingFaceEmbeddings(
model_name=modelPath,
model_kwargs=model_kwargs,
)
# Made up data, just for fun, but who knows in a future
vectorstore = FAISS.from_texts(
["Harrison worked at Alibaba Cloud"], embedding=embeddings
)
retriever = vectorstore.as_retriever()
我们使用我们选择的模型和配置初始化 HuggingFaceEmbeddings 的实例。然后,我们使用 FAISS 创建一个向量库,这使我们能够在高维空间中执行高效的相似性搜索。我们还实例化了一个检索器,它将根据嵌入获取信息。
template = """Answer the question based only on the following context:
{context}
Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
在这里,我们定义了一个聊天提示模板,该模板将用于构建与 AI 的交互。它包括上下文的占位符和问题,这些问题将在链执行期间动态填充。
在人工智能和自然语言处理的世界中,分词器和语言模型是将文本转化为有意义的动作的动态二人组。分词器将语言分解为模型可以理解的部分,而语言模型则根据这些输入预测和生成语言。在我们的旅程中,我们使用 Hugging Face 的 AutoTokenizer 和 AutoModelForCausalLM 类来利用这些功能。但重要的是要记住,在选择语言模型时,一种尺寸并不适合所有人。
模型的大小是一个需要考虑的关键因素。像Qwen-72B这样的大型模型具有更多的参数,这通常意味着它们可以理解并生成更细微的文本。但是,它们也需要更多的计算能力。如果您配备了高端 GPU 和足够的内存,您可能会选择这些更大的型号来充分利用它们的功能。
另一方面,像 Qwen-1.8B 这样的小型模型对于标准计算环境来说更容易管理。即使是这个微小的模型也应该能够在物联网和移动设备上运行。虽然它们可能无法像较大的对应物那样捕捉到语言的复杂性,但它们仍然提供出色的性能,并且对于那些没有专门硬件的人来说更容易访问。
要考虑的另一点是任务的性质。如果您正在构建对话式 AI,则使用特定于聊天的模型(例如 Qwen-7B-Chat)可能会产生更好的结果,因为这些模型针对对话进行了微调,并且可以比基本模型更好地处理对话的细微差别。
较大的模型不仅对硬件的要求更高,而且如果您使用基于云的服务来运行模型,也可能会产生更高的成本。每个推理都会占用处理时间和资源,如果您使用的是大型模型,这些时间和资源可能会增加。
Qwen-1.8B:适用于计算能力较少的任务的较小模型。适合在没有强大 GPU 的机器上进行原型设计和运行。
Qwen-7B:一种中型模型,可平衡性能和计算需求。适用于一系列任务,包括文本生成和问答。
Qwen-14B:一个更大的模型,可以处理更复杂的任务,在语言理解和生成方面有更大的细微差别。
Qwen-72B:该系列中最大的型号,为需要深度语言理解的高级 AI 应用程序提供最先进的性能。
Qwen-1.8B-Chat:专为构建聊天机器人和其他对话系统而设计的对话模型。
Qwen-7B-Chat:类似于Qwen-1.8B-Chat,但处理更复杂对话的能力有所提高。
Qwen-14B-Chat:一种能够进行复杂对话交互的高端对话模型。
Qwen-72B-Chat:Qwen 系列中最先进的对话模型,为要求苛刻的聊天应用程序提供卓越的性能。
在决定使用哪种模型时,请根据可用资源和项目的特定要求权衡较大模型的好处。如果您刚刚起步或以较小的规模进行开发,较小的模型可能是最佳选择。随着需求的增长,或者需要更高级的功能,请考虑升级到更大的模型。
请记住,Qwen 系列是开源的,因此您可以尝试不同的模型,看看哪一个最适合您的项目。如果您决定使用其他模型,下面是脚本的模型选择部分的外观:
# This can be changed to any of the Qwen models based on your needs and resourcestokenizer = 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(
"text-generation",
model=model,
tokenizer=tokenizer,
max_new_tokens=8192,
do_sample=True,
temperature=0.7,
top_p=0.95,
top_k=40,
repetition_penalty=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应用程序。通过包装管道,我们现在可以将其与LangChain的其他组件(如检索器和解析器)结合使用,以创建更复杂的AI系统。
仔细选择这些参数,您可以微调文本生成的行为,以满足应用程序的特定需求,无论您是在寻找更具创意和多样化的输出,还是以一致连贯和集中的文本为目标。
下面的代码片段代表了一个完整的端到端 RAG 系统,其中初始问题提示搜索相关信息,然后用于增强生成过程,从而为输入问题提供知情且上下文相关的答案。
1.链条结构:
chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| hf
| StrOutputParser()
)
下面是这部分代码中发生的情况:
检索器用于根据查询获取相关信息。检索器的作用是梳理数据集或文档集合,以找到与所提问题最相关的信息。这可能是使用矢量数据库来提高效率。
_RunnablePassthrough() _is一个组件,只需传递问题,无需任何修改。这表明该链旨在直接处理问题,可能是因为它是由用户输入的。
此处未详细显示提示,但它可能用作模板或一组说明,以适合管道下一阶段(即 HuggingFace 模型)的方式格式化输入问题和检索到的上下文。
hf 变量表示 Hugging Face 管道,它可能是一个能够生成响应的预训练语言模型。此管道将采用上一步的格式化输入,并使用其生成功能生成答案。
StrOutputParser() 是一个输出解析器,它的工作是从 Hugging Face 管道中获取原始输出,并将其解析为更用户友好的格式,大概是一个字符串。
使用 |(pipe) 运算符表明此代码使用的是函数式编程风格,特别是函数组合的概念或流水线模式,其中一个函数的输出成为下一个函数的输入。
链调用:
results = chain.invoke("Where did Harrison work?")
在这一行中,该链被调用了一个特定的问题:“哈里森在哪里工作?此调用将触发链中定义的整个操作序列。检索器搜索相关信息,然后通过提示将信息与问题一起传递到 HuggingFace 模型中。模型根据接收到的输入生成响应。
3.打印结果:
print(results)
然后,生成的响应由 StrOutputParser() 解析并作为最终结果返回,然后将其打印到控制台或其他输出。
最后,我们通过链接 retriever、prompt template、Hugging Face 管道和输出解析器来构建 RAG 链。我们用我们的问题调用链,结果被打印出来。
您刚刚通过 RAG 和 LangChain 向 AI 世界迈出了一大步。通过理解和运行这些代码,您可以释放创建智能系统的潜力,这些系统可以以前所未有的方式推理和与信息交互。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-05-28
2024-04-26
2024-08-13
2024-08-21
2024-07-09
2024-08-04
2024-06-13
2024-04-11
2024-07-18
2024-07-01