使用Qwen千问大模型和LangChain打造RAG应用

使用Qwen千问大模型和LangChain框架构建高效的RAG系统,从海量数据中提取信息并生成精确回应。

检索增强型生成(RAG)技术的出现,让AI不仅能够生成类人文本,还能实时整合相关信息,提供既丰富又精确的回应。

本文带大家了解如何使用Qwen千问大模型和LangChain框架来构建一个高效的RAG系统。包括导入必要的库和安全地管理敏感信息,比如API密钥。让我们开始搭建这个系统的基础。

1 环境搭建:配置基础

首先,我们需要导入必要的编程库,并配置环境变量以安全地管理敏感信息,比如API密钥。这些步骤是构建任何AI应用的基石,也是确保系统安全性的关键环节。

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 API密钥。

安全配置API密钥

使用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密钥。

2 定义模型路径和配置

modelPath = "sentence-transformers/all-mpnet-base-v2"   device = 'cuda' if cuda.is_available() else 'cpu'   model_kwargs = {'device': device}   

在这部分代码中,指定了用于生成嵌入向量的预训练模型路径,即sentence-transformers/all-mpnet-base-v2。同时,还设置了计算设备,优先选择GPU以加速计算过程,如果GPU不可用,则回退到CPU。

3 初始化Hugging Face嵌入和FAISS向量存储

embeddings = HuggingFaceEmbeddings(       model_name=modelPath,       model_kwargs=model_kwargs,   )      # 虚构的数据,仅供娱乐   vectorstore = FAISS.from_texts(       ["Harrison worked at Alibaba Cloud"], embedding=embeddings   )      retriever = vectorstore.as_retriever()   

在这一步,根据选定的模型和配置初始化了HuggingFace嵌入的实例。接着,利用FAISS技术,创建了向量库,让我们能在高维空间中进行高效的相似性搜索。此外,还创建了一个检索器,能够根据这些嵌入向量来检索相关信息。

4 设置聊天提示模板

template = """Answer the question based only on the following context:   {context}   Question: {question}   """      prompt = ChatPromptTemplate.from_template(template)   

这里定义了一个聊天提示模板,用于构建与AI的交互。它包括上下文和问题的占位符,这些将在链的执行期间动态填充。

5 配置分词器与语言模型

在人工智能和自然语言处理领域,分词器和语言模型是一对不可或缺的搭档。

分词器负责将文本拆分成模型能够理解的小单元,而语言模型则根据这些输入来预测和生成语言内容。

在我们的应用中,采用了Hugging Face的AutoTokenizer和AutoModelForCausalLM类来实现这些功能。选择语言模型不是一成不变的,需要根据具体需求灵活调整。

5.1 选择合适的模型尺寸与计算资源

在选择模型时,模型的大小是个重要的考量点。大型模型如Qwen-72B拥有海量参数,能够处理和生成更加精细的文本,但同时也需要更强大的计算资源。如果你有高端的GPU和充足的内存,那么这些大型模型能帮助充分发挥其强大的功能。

相对而言,小型模型如Qwen-1.8B则更适合普通的计算环境。这些模型即便在没有高性能GPU的设备上也能运行,虽然可能不如大型模型那样精准捕捉语言的微妙之处,但它们的性能依然出色,尤其适合那些没有专业硬件支持的用户。

5.2 特定任务的模型

另一个需要考虑的点是你的任务性质。如果你正在构建一个会话AI,使用一个特定于聊天的模型,如Qwen-7B-Chat,可能会获得更好的结果,因为这些模型针对对话进行了微调,并且可以比基础模型更好地处理对话的细微差别。

5.3 推理成本

使用大型模型时,除了对硬件要求较高之外,如果通过云服务进行模型推理,还会面临更高的成本问题。

这是因为每次推理过程都会消耗一定的时间和计算资源。随着时间的推移,这些成本会逐渐累积。

因此在选择模型时,我们需要综合考虑性能和经济性。

5.4 Qwen系列

  • 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系列中最高级的对话模型,为要求苛刻的聊天应用提供卓越的性能。

5.5 选择模型

挑选合适的模型时,需要综合考虑大型模型的优势以及你资源和项目的需求。

如果是初学者或者项目规模较小,选择一个小型模型可能更合适。但随着项目需求的增长,或者需要更强大的功能时,可以考虑切换到更大型的模型。

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)   

这里使用Hugging Face的AutoTokenizer和AutoModelForCausalLM类来加载分词器和因果语言模型。这些组件对于处理自然语言输入和生成输出非常关键。

通过这样的设置,你可以灵活地根据项目进展调整模型,确保既能满足功能需求,又不会造成资源浪费。

6 创建文本生成管道

我们的目标是利用已经加载的语言模型和分词器来生成文本。为此,构建了一个管道,并详细解析了各个参数,以便更好地控制文本生成的过程:

`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,模型总是选择最可能的下一个令牌,导致确定性和变化性较小的输出。

  • temperature (0.7):温度参数控制采样过程中引入的随机性。较低的温度值(接近0)使模型在做出选择时更有信心,导致随机性较小的输出,而较高的温度值(接近1)则鼓励更多的随机性和多样性。

  • top_p (0.95):此参数控制核采样,这是一种只考虑累积概率高于阈值top_p的最可能令牌的技术。它有助于生成多样化且连贯的文本,避免包含可能使文本无意义的非常低概率令牌。

  • top_k (40):Top-k采样将采样池限制为k个最可能的下一个令牌。这进一步细化了模型将考虑生成下一段文本的令牌集,确保输出保持相关性和连贯性。

  • repetition_penalty (1.1):此参数用于避免模型重复生成相同的令牌或短语,从而促进生成更有趣和多样化的文本。其值大于1时,会减少已出现令牌的重复概率。

设置好这些参数后,通过以下代码将管道封装为HuggingFacePipeline对象:

` `hf` = HuggingFacePipeline(pipeline=pipe)    `

这个封装操作使管道能够无缝集成到LangChain框架中,便于构建更复杂的AI应用程序。通过精心选择这些参数,我们可以根据不同应用场景的需求,调整文本生成的行为,无论是追求创造性和多样性,还是追求文本的一致性和连贯性。

7 搭建和执行RAG链

下面的代码展示了一个完整的RAG(Retrieval-Augmented Generation)系统,它通过初始问题触发信息检索,然后用这些信息来丰富生成过程,最终为输入的问题提供有根据且上下文相关的回答。

  1. 构建链结构:
chain = (       {"context": retriever, "question": RunnablePassthrough()}       | prompt       | hf       | StrOutputParser()   )   

这段代码的工作流程如下:

  • 检索器(retriever):负责根据问题检索相关信息。通过扫描数据集或文档集合,检索器能找出与问题最相关的信息片段。为了提高效率,这个过程可能会用到向量数据库。

  • RunnablePassthrough():这个组件简单地将问题原封不动地传递下去。这表明我们的链设计是为了直接处理用户输入的问题。

  • prompt:虽然这里没有详细展示,但它可能作为一个模板或指令集,用来格式化输入的问题和检索到的上下文,以便它们能够适配管道中的下一个阶段,即Hugging Face模型。

  • Hugging Face管道(hf):这个变量代表一个预训练的语言模型,它能够生成响应。该管道接收前一步骤格式化的输入,并利用其生成能力产生答案。

  • StrOutputParser():这是一个输出解析器,它将Hugging Face管道的原始输出转换成更易于用户理解的格式,通常是字符串形式。

代码中使用|(管道)运算符,这表明采用了函数式编程的风格,特别是函数组合或管道模式,其中每个函数的输出直接作为下一个函数的输入。这种设计使得整个处理流程清晰且高效。

  1. 执行链操作:
results = chain.invoke("Where did Harrison work?")   

通过这一行代码,我们向链提出了一个具体的问题:“Where did Harrison work?”。这个问题的提出,启动了链中预设的一连串操作。首先,检索器开始搜索与问题相关的信息。随后,这些信息连同问题本身,通过之前设定的提示模板,被一并送入Hugging Face模型。最后,模型根据接收到的输入信息生成并返回相应的回答。这个过程体现了从信息检索到生成回答的完整工作流。

  1. 输出结果展示:
print(results)   

至此,由StrOutputParser()处理后的生成响应作为最终结果返回,并被打印至控制台或其他输出界面。

通过将检索器、提示模板、Hugging Face模型以及输出解析器串联起来,我们构建了完整的RAG链。我们通过提出问题来调用这个链,并最终将得到的结果展示出来。这一过程不仅体现了技术的整合,也展示了从问题到答案的完整转化。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值