在之前的系列文章中,我们系统性地探讨了上下文(提示词)和RAG(知识库)这两个核心概念。为了帮助大家更好地消化和回顾,这里将前面几个关键环节重新梳理总结,希望能形成一个清晰的知识脉络。

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