本文的目标是搭建一个离线版本的ChatPDF(支持中英文),让你随心地与你想要阅读的PDF对话,借助大语言模型提升获取知识的效率😁。
除此之外,你还可以:
- 了解使用LangChain完整的流程。
- 学习基于向量搜索和Prompt实现一个文档问答机器人的方法原理。
- 了解如何使用llama.cpp量化大模型的方法。
- 了解如何使用深度学习中常用的向量数据库。
为了让更多的同学看懂,我会尽量写的小白一点。如果你是有经验的同学,发现我哪里写的不对,若你可以在评论区指出,我会非常感谢!
1 必要的准备
我的笔记本型号是 Apple的 M2 Max 32G,Windows 和 Linux 的步骤在大体上也是类似的,我会在每一个步骤都链接出所涉技术的官方文档,方便各位同学自行查阅和深入学习。
1.1 下载Chinese-LLaMA-Alpaca-2大语言模型
因为模型比较大,建议先启动下载,再进行后续的步骤。
Chinese-LLaMA-Alpaca-2(中文羊驼)是基于Meta发布的可商用大模型LLaMA2微调的中文大模型,LLaMA2只支持英文,而中文羊驼支持中英文。
本文以Chinese-LLaMA-Alpaca-2-13b大模型为例,如果你的内存或者显存比较小,建议使用7B的,效果应该不会相差太多,官方的下载地址。
以HuggingFace为例,将Files and versions里面的所有文件都下载,并放置于同一个文件夹下面,命名为chinese-alpaca-2-13b即可(可随意更改)。
1.2 使用 Docker Compose 本地部署Milvus向量数据库
了解机器学习或深度学习的同学应该都知道,无论是NLP还是CV,模型的输入和输出基本上都是N维向量。在实现文档问答(即ChatPDF)的技术中,其中关键的一步就是把用户所提出问题的向量表示,与向量数据库中文档块的向量表示进行相似度计算。因为涉及到搜索对比的问题,所以我们需要用到向量数据库来加快这个过程。如果你现在听不懂那也没有关系,先跟着做就行,后面我会再详细讲解,其实ChatPDF实现的逻辑很简单。
Github上的开源向量数据库(Vector Database)应该挺多的,也有一些提供免费云服务的向量数据库,如Pinecone。但是我们要实现的是一个完全离线版本的ChatPDF,所以在这里我选择了社区影响力最大(23.7k star)的开源向量数据库Milvus,而且它部署也比较简单,使用Docker Compose可以快速部署,部署Milvus的官方教程。
假设你已经安装好了Docker-Compose,请在命令行输入以下命令:
bash代码解读复制代码wget https://github.com/milvus-io/milvus/releases/download/v2.3.2/milvus-standalone-docker-compose.yml -O docker-compose.yml
sudo docker-compose up -d # 最后会开启三个服务,包括milvus-standalone,及其两个依赖:milvus-etcd和milvus-minio
docker port milvus-standalone 19530/tcp # 检查docker暴露的端口
如果你还没有安装,请自行查阅资料安装,网上应该有很多成熟的教程,或者自行看Docker Compose官方的安装教程
1.3 克隆llama.cpp源码仓库为模型量化做准备
llama.cpp的最主要目标是量化LLaMA模型,可以理解为在尽量不削弱模型推理能力的前提下,加速模型的推理速度。目前支持MacOS、Linux和Windows平台。我尝试了几种大模型部署的方式以后,感觉经过llama.cpp量化后,模型的推理速度确实快很多,而且占用的内存也会小很多。说白了,llama.cpp的作用就是让我们以尽可能小的代价使用大模型,毕竟算力珍贵。
请在命令行输入以下命令:
bash代码解读复制代码git clone git@github.com:ggerganov/llama.cpp.git
cd llama.cpp
make
因为llama.cpp是使用C++开发的,所以需要使用make来构建和编译项目。若您使用的是WIndows系统,需要使用cmake命令来代替make,详细的教程点击这里,在这里就不赘述了。
1.4 初始化项目
假设你上述的准备都已经做好了,并且你已经创建了一个叫做my-awesome-project的文件夹,把llama.cpp和模型chinese-alpaca-2-13b放置于里面,文件夹结构如下所示:
txt代码解读复制代码- my-awesome-project/
- llama.cpp/
- chinese-alpaca-2-13b/
请在命令行输入以下命令:
bash代码解读复制代码cd path/to/my-awesome-project/
mkdir my-pdf-bot
cd my-pdf-bot
python -m venv venv # 创建python虚拟环境
source venv/bin/activate # 激活当前虚拟环境
1.5 安装依赖
langchain是一个开源Python库,提供了构建基于大模型AI应用所需的模块和工具,帮助开发者轻松地与大语言模型进行交互,实现文本生成、问答、翻译、对话等任务。接下来我们的代码依赖只需要导入langchain即可,所以langchain非常方便和强大。
bash
代码解读
复制代码pip install langchain
如果你的网络受阻,可以使用清华的pip镜像源,在命令行输入
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple即可。
虽然我们只需要使用到langchain,但它所依赖的python库非常多,pip install langchain这条命令只会安装核心的模块,但不用担心,后面运行代码的时候,报错信息会明确地提示哪个库没有安装,到时候再安装就行。 langchain也提供了完全版本的安装方法,但不建议这样做,因为不是所有依赖都是我们需要的。
1.6 基于向量搜索和Prompt的文档问答技术
玩过ChatGPT的同学应该会发现,ChatGPT无法接收过多的文字,GPT3.5的上下文长度限制是4k tokens(大概5页A4纸的概念)、GPT4是8k,也有专门为长文本任务训练的GPT4-32k,但也就是40页纸。 我们要实现的文档问答任务,丢一本两三百页的书给它也是正常的,40页纸的限制通常不能满足我们的需求。那有同学就会问:那我们再训练一个更长的模型就好了啊,能满足五百页的模型。但是人类永远不会满足,当模型可以一次读懂一本书之后,必然又希望模型可以一次读懂整个专业领域的图书资料,这时候5万页可能都不够了。所以不断地提升模型的上下文来实现文档对话的功能不是长久之计,因为长下文越大,模型也会越大,与消耗的内存和推理时间成正比。 因此,我们不妨换个角度思考,用户每次问的问题都是具有针对性的,回答用户问题所涉的素材可能就与书本中的某几段有关。而在机器学习中,有一个研究领域叫做文本的相似度衡量,用于判断两段文本的相似程度,最简单的方法就是计算两段文本向量表示的余弦相似度,可以用于判断文本之间的有关程度,有兴趣的同学可以自行查阅,在这里不过多赘述。 到这里,我们现在拥有了两项关键技术:
- 大语言模型,你可以先给它提供一段素材,然后问它一个问题,要求它在这段素材里面寻找问题的答案。但是由于上下文长度的限制,你不能提供太多的素材给它。
- 文本的相似度量技术,你可以计算两段文本之间的相似程度。 此时,请你基于上述两项技术设计出实现无限长度文档问答的技术,你会怎么做?
- 把文档进行切分,比如把每1000个字切分为一个文本块。
- 使用嵌入技术把文本块转换成向量表示,然后把所有文本块的向量表示都存储到向量数据库中。
- 每次把用户的提问转成向量表示,然后与向量数据库中的所有文本块进行相似度计算。
- 把最相似的k个文本块与用户的问题整理在一起,再将整理后的问题丢给大语言模型,让它在所给的素材中找到问题的答案。
上面的步骤也是接下来代码将要实现的逻辑,上述方法介绍在OpenAI的Cookbook里面,有兴趣的同学可以去深入学习一下。
1.7 使用llama.cpp量化模型
到目前为止,你的文件结构应该如下所示:
txt代码解读复制代码- my-awesome-project/
- llama.cpp/
- chinese-alpaca-2-13b/
- my-pdf-bot/
假设你当前所处位置是my-pdf-bot文件夹,并且已经下载好了chinese-alpaca-2-13b模型,以及克隆和编译好了llama.cpp。
请在命令行输入以下命令来量化模型:
bash代码解读复制代码cd ../llama.cpp/
python convert.py ../chinese-alpaca-2-13b
./quantize ../chinese-alpaca-2-13b/ggml-model-f16.gguf ../chinese-alpaca-2-13b/ggml-model-q4_0.gguf q4_0
上述命令运行完成之后,在chinese-alpaca-2-13b文件夹里面会多出ggml-model-f16.gguf和ggml-model-q4_0.gguf两个文件,其中后者是本次教程所需要的。
2 动手Coding!
完成了上面的必要准备,终于可以开始写代码了😭。
2.1 导入依赖
在文件夹my-pdf-bot下面新建一个app.py文件,用于放置我们的Python代码。
往app.py写入下面的代码依赖:
python代码解读复制代码import os
from langchain.text_splitter import CharacterTextSplitter
from langchain.document_loaders import PyPDFLoader
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import Milvus
from langchain.llms import LlamaCpp
from langchain.chains import ConversationalRetrievalChain
2.2 加载并拆分目标PDF文档
在文件夹my-pdf-bot下面新建一个pdf文件夹,用于放置我们将要测试的文档,为了验证这个应用的有效性,我在网上找了一份今年(2023年)关于中国人工智能产业研究报告作为我们的测试文档,因为大模型训练的语料库都不太可能是最新的,所以可以拿最新的文档去测试它,看它可不可以有效地从文档中提取答案。
目前你的文件夹结构应该如下:
txt代码解读复制代码- my-awesome-project/
- llama.cpp/
- chinese-alpaca-2-13b/
- my-pdf-bot/
- venv/
- pdf/
- 中国人工智能产业研究报告.pdf
- app.py
继续在app.py中写入如下代码:
python代码解读复制代码# 加载指定的pdf文档
loader = PyPDFLoader('./pdf/中国人工智能产业研究报告.pdf')
documents = loader.load()
# 将文档拆分成文本块,每一个文本块的大小为1000.
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)
2.3 准备句嵌入工具
python代码解读复制代码# 使用HuggingFace的嵌入方法准备将文本转换为向量
embeddings = HuggingFaceEmbeddings()
2.4 连接milvus向量数据库
在[[#1.2 使用 Docker Compose 本地部署Milvus向量数据库]]中我们已经使用docker compose在本地部署了Milvus向量数据库。在代码中我们只需要一条语句就可以使用它。
python代码解读复制代码vector_db = Milvus.from_documents(texts, embeddings, connection_args={
"host": "127.0.0.1",
"post": "19530"
})
2.5 定义和配置模型
python代码解读复制代码n_gpu_layers = 1
n_batch = 256
llm = LlamaCpp(
model_path='../chinese-alpaca-2-13b/ggml-model-q4_0.gguf',
n_gpu_layers=n_gpu_layers,
n_batch=n_batch,
f16_kv=True,
n_ctx=4096,
)
2.6 构建会话检索链条
python代码解读复制代码qa_chain = ConversationalRetrievalChain.from_llm(
llm,
vector_db.as_retriever(search_type='mmr', search_kwargs={'k': 2}), # search_type='similarity' | 'mmr' | 'similarity_score_threshold'
return_source_documents=True
)
2.7 与聊天机器人交谈
python代码解读复制代码chat_history = []
while True:
query = input('你: ')
if query.lower() in ["exit", "quit", "q"]:
print('Exiting')
sys.exit()
result = qa_chain({'question': query, 'chat_history': chat_history})
print('PDFBot: ' + result['answer'] + '\n')
chat_history.append((query, result['answer']))
如何学习AI大模型 ?
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。【保证100%免费】🆓

对于0基础小白入门:
如果你是零基础小白,想快速入门大模型是可以考虑的。
一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。
😝有需要的小伙伴,可以VX扫描下方二维码免费领取🆓
👉1.大模型入门学习思维导图👈
要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。
对于从来没有接触过AI大模型的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。(全套教程文末领取哈)

👉2.AGI大模型配套视频👈
很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,每个章节都是当前板块的精华浓缩。


👉3.大模型实际应用报告合集👈
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(全套教程文末领取哈)

👉4.大模型落地应用案例PPT👈
光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。(全套教程文末领取哈)

👉5.大模型经典学习电子书👈
随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。(全套教程文末领取哈)


👉6.大模型面试题&答案👈
截至目前大模型已经超过200个,在大模型纵横的时代,不仅大模型技术越来越卷,就连大模型相关的岗位和面试也开始越来越卷了。为了让大家更容易上车大模型算法赛道,我总结了大模型常考的面试题。(全套教程文末领取哈)

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习
这份完整版的 AI 大模型学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
😝有需要的小伙伴,可以Vx扫描下方二维码免费领取🆓

2714

被折叠的 条评论
为什么被折叠?



