微信扫码
添加专属顾问
使用Qwen千问大模型和LangChain框架构建高效的RAG系统,从海量数据中提取信息并生成精确回应。
检索增强型生成(RAG)技术的出现,让AI不仅能够生成类人文本,还能实时整合相关信息,提供既丰富又精确的回应。
本文带大家了解如何使用Qwen千问大模型和LangChain框架来构建一个高效的RAG系统。包括导入必要的库和安全地管理敏感信息,比如API密钥。让我们开始搭建这个系统的基础。
首先,我们需要导入必要的编程库,并配置环境变量以安全地管理敏感信息,比如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密钥。
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。
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技术,创建了向量库,让我们能在高维空间中进行高效的相似性搜索。此外,还创建了一个检索器,能够根据这些嵌入向量来检索相关信息。
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则更适合普通的计算环境。这些模型即便在没有高性能GPU的设备上也能运行,虽然可能不如大型模型那样精准捕捉语言的微妙之处,但它们的性能依然出色,尤其适合那些没有专业硬件支持的用户。
另一个需要考虑的点是你的任务性质。如果你正在构建一个会话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系列模型都是开源的,所以你可以尝试不同的模型,以找到最适合你项目的那一个。以下是如何根据特定需求和资源,调整脚本中的模型选择部分:
# 这可以根据你的需求和资源更改为任何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类来加载分词器和因果语言模型。这些组件对于处理自然语言输入和生成输出非常关键。
通过这样的设置,你可以灵活地根据项目进展调整模型,确保既能满足功能需求,又不会造成资源浪费。
我们的目标是利用已经加载的语言模型和分词器来生成文本。为此,构建了一个管道,并详细解析了各个参数,以便更好地控制文本生成的过程:
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应用程序。通过精心选择这些参数,我们可以根据不同应用场景的需求,调整文本生成的行为,无论是追求创造性和多样性,还是追求文本的一致性和连贯性。
下面的代码展示了一个完整的RAG(Retrieval-Augmented Generation)系统,它通过初始问题触发信息检索,然后用这些信息来丰富生成过程,最终为输入的问题提供有根据且上下文相关的回答。
chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| hf
| StrOutputParser()
)
这段代码的工作流程如下:
检索器(retriever):负责根据问题检索相关信息。通过扫描数据集或文档集合,检索器能找出与问题最相关的信息片段。为了提高效率,这个过程可能会用到向量数据库。
RunnablePassthrough():这个组件简单地将问题原封不动地传递下去。这表明我们的链设计是为了直接处理用户输入的问题。
prompt:虽然这里没有详细展示,但它可能作为一个模板或指令集,用来格式化输入的问题和检索到的上下文,以便它们能够适配管道中的下一个阶段,即Hugging Face模型。
Hugging Face管道(hf):这个变量代表一个预训练的语言模型,它能够生成响应。该管道接收前一步骤格式化的输入,并利用其生成能力产生答案。
StrOutputParser():这是一个输出解析器,它将Hugging Face管道的原始输出转换成更易于用户理解的格式,通常是字符串形式。
代码中使用|(管道)运算符,这表明采用了函数式编程的风格,特别是函数组合或管道模式,其中每个函数的输出直接作为下一个函数的输入。这种设计使得整个处理流程清晰且高效。
results = chain.invoke("Where did Harrison work?")
通过这一行代码,我们向链提出了一个具体的问题:“Where did Harrison work?”。这个问题的提出,启动了链中预设的一连串操作。首先,检索器开始搜索与问题相关的信息。随后,这些信息连同问题本身,通过之前设定的提示模板,被一并送入Hugging Face模型。最后,模型根据接收到的输入信息生成并返回相应的回答。这个过程体现了从信息检索到生成回答的完整工作流。
print(results)
至此,由StrOutputParser()处理后的生成响应作为最终结果返回,并被打印至控制台或其他输出界面。
通过将检索器、提示模板、Hugging Face模型以及输出解析器串联起来,我们构建了完整的RAG链。我们通过提出问题来调用这个链,并最终将得到的结果展示出来。这一过程不仅体现了技术的整合,也展示了从问题到答案的完整转化。
这本书专门为那些对自然语言处理技术感兴趣的读者提供了系统的LLM应用开发指南。全书分为11章,从LLM基础知识开始,通过LangChain这个开源框架为读者解读整个LLM应用开发流程。第1~2章概述LLM技术的发展背景和LangChain框架的设计理念。从第3章开始,分章深入介绍LangChain的6大模块,包括模型I/O、数据增强、链、记忆等,通过大量代码示例让读者了解其原理和用法。第9章通过构建PDF问答程序,帮助读者将之前学习的知识应用于实践。第10章则介绍集成,可拓宽LangChain的用途。第11章为初学者简要解析LLM的基础理论,如Transformer模型等。
本书以LangChain这个让人熟悉的框架为主线,引导读者一步一步掌握LLM应用开发流程,适合对大语言模型感兴趣的开发者、AI应用程序开发者阅读。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-07-05
AI 知识库为什么总答不准?不是模型笨,是资料没整理好
2026-07-05
AI知识库RAG演进:上一代解决「找得到」,下一代解决「记得住、连得起、信得过」
2026-07-04
大模型支持的上下文已超 1M, RAG 是不是没有意义了?
2026-07-03
RAG 检索优化策略:从命中率到答案质量的一套工程打法
2026-07-03
RAG 落地总翻车?全球赛事冠军架构,改造适配企业级生产
2026-07-01
提升 RAG 准确率全攻略 让你的 AI 知识库 真正靠谱起来!
2026-06-30
教程:如何用AutoRAG + Milvus避免RAG 与Agent 中出现串租问题
2026-06-30
知识库不是文件堆——我把RAG准确率从60%调到了92%
2026-04-27
2026-04-23
2026-04-20
2026-04-09
2026-04-12
2026-04-22
2026-04-10
2026-05-14
2026-04-30
2026-04-27
2026-07-04
2026-06-23
2026-06-23
2026-06-15
2026-06-10
2026-06-10
2026-05-20
2026-05-18
欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。
在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。
一、 定义
本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。
会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。
知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。
二、 账号注册与登录
登录方式:本网站支持以下登录方式,您可根据实际情况选择:
微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。
手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。
账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。
实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。
未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。
三、 服务内容与规范
知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。
服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。
禁止行为:您在使用服务时不得实施以下行为:
利用技术手段批量爬取、下载、转存知识库内容;
将知识库内容用于商业目的或未经授权地向第三方传播;
干扰本网站正常运行或侵犯其他用户合法权益;
发布违法违规信息或从事违反公序良俗的活动。
四、 知识产权声明
权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。
有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。
侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。
五、 个人信息保护
我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。
您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。
您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。
六、 免责声明
内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。
不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。
第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。
七、 违约责任
如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。
如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。
八、 法律适用与争议解决
本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。
因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。
九、 其他
本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。
本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。
我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。