之前的系列文章主要讲解上下文(提示词)和RAG(知识库),为了方便大家归纳,这里把前面的几个重要内容重新梳理总结。
一、搭建应用开发环境
正所谓磨刀不误砍柴工,要想后续顺利进行AI应用编程,务必正确搭建电脑的Python开发环境,这样可以避免代码编译时出现奇奇怪怪的错误,才能心无旁骛地钻研AI应用技能。
首先是安装哪个Python版本。AI开发环境的Python版本推荐Python 3.10.x,该版本兼容所有 AI 库(torch、llama-index、langchain、langgraph、ollama),也没有新版本的奇怪Bug。
其次是安装哪个PyCharm版本。Python代码的开发工具PyCharm可以选择社区版的PyCharm 2024.1 / 2023.3 / 2022.2 ,PyCharm版本过低会不支持Python 3.10,版本过高会很消耗电脑资源。
再次是安装 Ollama ,AI应用在加载离线大模型时经常用到它。
二、上下文(提示词)
要让AI干活,先得丢个问题或者指令给它。这个问题或者指令就叫做“提示词”,意思是提示AI要干什么。
一边是大模型要求准确的提示词,另一边是用户千奇百怪的命令,夹在中间的AI应用开发者就得想办法连通这两者。
AI应用搭建的提示词转换桥梁,又被称作“提示词工程”,它要把用户的各种命令和提问转换为大模型容易理解的提示词。
为了让AI在不同的语境中准确理解用户的意图,在开启新会话时有必要把之前的历史对话记录发给AI,以便AI理解当前对话所处的上下文环境,才好做出有针对性的回答。
可是历史对话记录一方面数量很多,另一方面存在大量冗余,而每次发给AI大模型的提示词都会消耗宝贵的Token,于是AI应用开发者就得想办法精简历史对话记录,以得到提炼了主要意思的上下文信息。
历史对话的提炼方式经历了下列的优化过程:
1、按照某种规则截断历史对话
历史对话虽多,但关联度高的记录只有最近的几条,因此可保留最新的几条对话记录形成下次会话的上下文。对话记录的截断规则有下列两种:
(1)按照消息数量来截断历史对话;
(2)按照Token长度来截断历史对话;
其中在计算文本的Token长度时,给出了两种分词器及其使用说明。一种分词器是国外的tiktoken,另一种是国产的jieba,对中文段落分词推荐使用jieba库。
2、提取历史对话的摘要文字
精简历史对话的文字内容,提炼出紧凑的摘要文本,可提高上下文的信息密度,有效降低Token消耗。对话记录的摘要办法有下列几种:
(1)使用第三方的摘要库(如snownlp和sumy)进行文字摘要;
(2)使用在线大模型(如火山引擎)对原始文本输出摘要;
(3)使用离线大模型(如千问的文本大模型)对原始文本生成摘要;
在上下文部分的系列文章末尾,给出了一个使用离线大模型对文本生成摘要的实战例子。
先通过modelscope下载离线大模型Qwen1.5-1.8B-Chat,再通过transformers加载本地离线大模型,输出原始文本经过压缩后的摘要文字。实战演示过程发现,离线大模型支持设置返回内容的Token长度,并且离线处理不消耗在线Token,适合初学者练习AI应用开发。
三、RAG(知识库)
大模型虽智能,却存在下列两个短板:
(1)知识有截止日期,不懂新知识
(2)会幻觉、爱胡说八道
为弥补大模型的上述两处缺陷,就引入了RAG知识库。
RAG是一种结合检索和生成技术的模型,它通过引用外部知识库的信息来生成回答,外部知识库通常来源用户提供的文档资料。
RAG的使用流程包含下列五个步骤:
(1)加载文档资料
(2)对文本分块
(3)向量化文本
(4)存入向量数据库
(5)在用户提问时,检索向量数据库,并把结果反馈给大模型
以下简要说明各步骤的处理手段:
1、向量数据库
在RAG第4步的“向量数据库”,分别介绍了运行于内存的FAISS,以及运行于磁盘的Chroma。
其中FAISS速度快,适合一次性使用;而Chroma可持久保存数据,适合多次反复使用。
2、向量化文本
在RAG第3步的“向量化文本”,介绍了两种文本嵌入模型,一种是国外的all-MiniLM-L6-v2,另一种是国产的BGE-small。
其中,国产Embedding模型的优势是在处理中文时更加精准,能够给出更准确的检索结果。
3、对文本分块
在RAG第2步的“对文本分块”,要把一大段文本拆分为多个句子,基本要求如下:
(1)读取文档资料的所有文本内容。
(2)按照句号分割文本。
(3)每条知识设定字数下限,比如不得少于50个汉字;如果某条知识小于这个长度,就要跟下一条知识合并。
(4)处理过程注意去除无效字符,例如剔除空行、删除空格等等。
4、加载文档资料
在RAG第1步的“加载文档资料”,分别介绍了对TXT、PDF、DOCX、网页等文档格式的加载处理,各文档的解析过程简述如下:
(1)对于TXT格式,可直接打开并读取文本内容,注意兼容UTF-8与GBK这两种字符编码集。
(2)对于PDF格式,可通过三方库pdfplumber读取文本内容。
(3)对于DOCX格式,可通过三方库python-docx读取文本内容。
(4)对于网页格式,可通过三方库trafilatura读取文本内容。
在知识库部分的系列文章末尾,给出了一个使用BGE-small与FAISS,通过解析网页实现在线RAG的实战例子。
先通过modelscope下载离线大模型bge-small-zh-v1.5,再通过sentence-transformers加载本地离线大模型,并向量化来自在线网页的文本内容,把文本向量保存至向量检索库FAISS,最后从FAISS检索用户问题对应的知识信息。实战演示过程发现,在线RAG对几个问题的回答基本正确,说明结合BGE-small与FAISS成功实现了对网页的在线检索功能。
本系列的AI应用开发文章目录为《15天学会AI应用开发全目录(零基础小白,零Token消耗)》。