当前位置:首页 > 技术分析 > 正文内容

利用Python与LangChain实现本地RAG智能问答新体验

ruisui881个月前 (03-19)技术分析21

引言

在当今信息爆炸的时代,如何从海量的本地文档中快速、准确地获取有价值的信息,并生成高质量的回答,成为了许多开发者和企业关注的焦点。检索增强生成(RAG)技术应运而生,它结合了本地文档检索和大模型生成的优势,为解决这一问题提供了有效的方案。本文将详细介绍如何使用Python和LangChain实现本地的RAG,并结合互联网上强大的通义千问2.5(Qwen 2.5)大模型,带你开启智能问答的新旅程。

环境搭建:坚实的基础

要实现本地RAG,首先得为项目搭建合适的运行环境。Python作为一种功能强大且易于上手的编程语言,拥有丰富的库和工具,非常适合用于开发RAG系统。我们需要安装一系列必要的Python库,这些库就像是建筑的砖块,为后续的开发工作奠定基础。

pip install langchain openai tiktoken qwen-api chromadb pypdf

其中,langchain是一个强大的框架,它简化了与大模型交互和构建复杂语言处理流程的过程;qwen-api用于调用通义千问模型;chromadb是一个高性能的向量数据库,用于存储和检索文档的向量表示;pypdf则可以帮助我们处理PDF格式的文档。

获取通义千问API密钥:开启模型之门

通义千问2.5是阿里云推出的一款强大的大语言模型,要使用它,我们需要在阿里云官网注册并开通通义千问API服务。在完成注册和开通流程后,我们将获得API密钥,包括access_key_idaccess_key_secret。这两个密钥就像是打开通义千问模型大门的钥匙,务必妥善保管,不要泄露给他人。

代码实现:一步步构建RAG系统

加载和处理文档

本地的文档是我们信息的宝库,但要让大模型能够有效地利用这些信息,需要对文档进行加载和处理。以PDF文件为例,我们可以使用PyPDFLoader来加载PDF文件,然后使用
RecursiveCharacterTextSplitter
将文档分割成小块。

from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter

# 加载PDF文件
loader = PyPDFLoader("your_document.pdf")
documents = loader.load()

# 文本分割
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
texts = text_splitter.split_documents(documents)

这里的chunk_sizechunk_overlap参数可以根据实际情况进行调整,以确保文档被合理地分割成易于处理的小块。

创建向量数据库

为了能够快速地从文档中检索出与问题相关的信息,我们需要将文档块嵌入到向量空间中,并使用向量数据库进行存储和检索。Chroma是一个非常适合用于构建向量数据库的工具,结合QwenEmbeddings,我们可以轻松地完成这一步骤。

from langchain.embeddings import QwenEmbeddings
from langchain.vectorstores import Chroma

# 初始化Qwen嵌入模型
embeddings = QwenEmbeddings(
    access_key_id="your_access_key_id",
    access_key_secret="your_access_key_secret"
)

# 创建向量数据库
db = Chroma.from_documents(texts, embeddings)

通过将文档块转换为向量表示,我们可以利用向量数据库的高效检索能力,快速找到与问题最相关的文档块。

初始化通义千问模型

有了向量数据库后,我们还需要一个强大的大模型来生成高质量的回答。通义千问2.5就是我们的得力助手,使用ChatQwen可以方便地初始化该模型。

from langchain.chat_models import ChatQwen

# 初始化通义千问模型
llm = ChatQwen(
    access_key_id="your_access_key_id",
    access_key_secret="your_access_key_secret",
    model_name="qwen-2.5-chat"
)

这样,我们就完成了通义千问2.5模型的初始化,可以开始利用它进行问答生成了。

创建RAG链

最后,我们将向量数据库和大模型结合起来,创建一个完整的RAG链。RetrievalQA是LangChain中用于创建RAG链的工具,它可以帮助我们实现从问题检索到答案生成的整个流程。

from langchain.chains import RetrievalQA

# 创建RAG链
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=db.as_retriever()
)

这里的chain_type参数可以根据实际需求选择不同的类型,以实现不同的信息整合和生成策略。

提问并获取答案

一切准备就绪后,我们就可以向RAG链提问,并获取准确、详细的答案了。

# 提问
query = "你的问题是什么?"
result = qa_chain.run(query)
print(result)

query替换为你实际想要询问的问题,运行代码后,就可以看到通义千问2.5根据本地文档生成的回答了。

注意事项与拓展思考

在实现本地RAG的过程中,有一些注意事项需要我们牢记。首先,要确保将代码中的your_access_key_idyour_access_key_secretyour_document.pdf替换为你自己的API密钥和文档路径。其次,网络连接的稳定性非常重要,因为我们需要调用互联网上的通义千问API服务。此外,我们还可以根据实际需求对文本分割的参数和RAG链的类型进行调整,以优化系统的性能和回答质量。

本地RAG技术为我们提供了一种高效、智能的信息检索和问答解决方案。通过结合Python、LangChain和通义千问2.5,我们可以轻松地构建一个强大的本地智能问答系统,为我们的工作和生活带来更多的便利和价值。希望本文能够对你有所帮助,让你在智能问答的领域中迈出坚实的一步。

以上可以帮助你了解如何实现本地RAG,并结合通义千问2.5大模型进行问答。如果你有任何疑问或建议,欢迎在评论区留言交流。

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/2893.html

分享给朋友:

“利用Python与LangChain实现本地RAG智能问答新体验” 的相关文章

快速掌握 Git:程序员必会的版本控制技巧

在现代软件开发中,版本控制系统(VCS)是开发人员不可或缺的工具。无论是个人项目,还是多人协作的团队开发,良好的版本控制都能确保代码管理的高效性与稳定性。而在版本控制系统中,Git 凭借其分布式、灵活性和高效性,成为了最流行的工具之一。几乎所有的开发团队都在使用 Git 来管理代码版本、协作开发和追...

HTML5学习笔记三:HTML5语法规则

1.标签要小写2.属性值可加可不加””或”3.可以省略某些标签 html body head tbody4.可以省略某些结束标签 tr td li例:显示效果:5.单标签不用加结束标签img input6.废除的标签font center big7.新添加的标签将在下一HTML5学习笔记中重点阐述。...

HTML5+眼球追踪?黑科技颠覆传统手机体验

今天,iH5工具推出一个新的神秘功能——眼动追踪,可以通过摄像头捕捉观众眼球活动!为了给大家具体演示该功能的使用,我做了一个案例,供大家参考。实际效果如下:案例比较简单,就是通过眼动功能获取视觉焦点位置,剔除用户看中的牌。现在,舞台的属性中多了一个“启用眼动”的选项,另外,还多了一个“启用摄像头”的...

多项修正 尼康D4s发布最新1.10版固件

尼康公司与2014年8月27日发布了D4s的最新固件,固件版本号为C:1.10。这次固件升级,主要解决了一些BUG,并且对拍摄菜单与相机操作做了一定调整。下面是本次新固件的具体信息:尼康发布D4s最新C固件 1.10版对C固件升级到1.10版所作的修改:当选定运动VR模式并换上 AF-S 尼克尔 4...

数组、去重、排序、合并、过滤、删除

ES6数字去重 Array.from(new Set([1,2,3,3,4,4])) //[1,2,3,4] [...new Set([1,2,3,3,4,4])] //[1,2,3,4]2、ES6数字排序 [1,2,3,4].sort(); // [1, 2,3,4],默认是升序...

Vue中的路由配置常用属性

router:路由页面跳转的核心库;引入路由:import VueRouter from 'vue-router'; 注册路由:const router = new VueRouter({ })mode:模式路由有hash history两种模式:hash模式URL中包含#,#后边是...